你需要在部署时pickle缩放器和机器学习模型吗?

4
在使用sklearn训练机器学习模型时,我通常会使用内置的StandardScaler...首先将缩放器拟合到训练数据上,然后转换训练数据...最后使用相同的StandardScaler对象通过先前从训练数据集中拟合的参数来转换测试数据。
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

然而,我最近意识到,我认为任何试图在不同环境中对ML模型进行pickle和重新部署的尝试也将需要pickle StandardScaler...否则,新的输入数据在进入模型之前就无法被转换。这是我的错误,还是我简单地忽略了什么?每次我尝试在其他地方部署它们时,我是否都必须pickle ML模型和StandardScaler?只是奇怪的是,在Sci-kit learn Model Persistence文档中从未提到过这一点。
joblib.dump(model, 'pickledModel.joblib')
joblib.dump(sc, 'pickledScaler.joblib')
2个回答

2

实际上,为了部署,您可能还需要将模型序列化为字节并将其放入数据库中。使用 joblib 有点棘手,因为您只能将其转储到文件中。基本上,您需要创建一些虚拟容器并将其转储到其中。

from io import BytesIO

import joblib

def serialize(obj) -> bytes:
    container = BytesIO()
    joblib.dump(obj, container)
    container.seek(0)

    serialized = container.read()
    return serialized


def deserialize(obj: bytes):
    container = BytesIO()
    container.write(obj)
    container.seek(0)

    deserialized = joblib.load(container)
    return deserialized

1
这正是管道(Pipeline)的用途所在:
from joblib import dump, load
from sklearn.pipeline import Pipeline
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler, PolynomialFeatures

model = Pipeline(steps=[
    ('scaler', StandardScaler()),
    ('polyfeats', PolynomialFeatures()),
    ('ridge', Ridge())
])

dump(model, 'model.joblib')
model = load('model.joblib')

现在,您可以轻松地将预训练模型保存和加载为单个文件。

但是,你如何确保在推理过程中使用相同的缩放器进行缩放呢? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接