假设我在创建模型时使用了 minmaxscaler 。现在,我正在通过Pickle在 Flask 应用程序中加载该模型。在收到包含数据点的请求后,我想对其应用与在调用predict()方法之前应用到训练数据集相同的转换。如何将这组转换从一个文件传输到 Web 服务?
如何正确地将用于训练数据集的相同数据转换应用于 Web 服务中的真实数据?
数据挖掘
机器学习
数据
2021-09-22 08:57:05
3个回答
我只是注意到没有一个答案包含最重要的指令。所以这就是它的完成方式,因为我很久以前就已经解决了这个问题。
from sklearn.pipeline import Pipeline
from sklearn.externals import joblib
pipeline = Pipeline([
('normalization', MinMaxScaler()),
('classifier', RandomForestClassifier())
])
pipeline.fit(X)
其他答案中缺少的pipeline.fit()是非常重要的。一旦 scikit 函数学习了您的训练数据X的参数,您就可以将该管道转储到一个文件中,然后像这样完成其余的工作。
joblib.dump(pipeline, 'transform_predict.joblib')
pipeline = load('transform_predict.joblib')
transformed_data = pipeline.transform(new_data)
这将对在训练数据集上完成的数据集(即使包含 1 个样本)应用相同的转换。
更新
对于较新的版本,我相信必须阅读。我达到了内存限制,以下更改有所帮助。
with open(conf['le_embedder_file'], 'rb') as f:
pipe_le = joblib.load(f)
和写
with open(conf['tecv_embedder_file'], 'wb') as f:
joblib.dump(pipe_tecv, f, compress='zlib')
我必须阅读
与其存储和加载许多文件,不如创建一个包含所有转换的 Scikit-learn 转换管道,然后将其保存为 pickle 或 joblib 文件。
from sklearn.pipeline import Pipeline
from sklearn.externals import joblib
pipeline = Pipeline([
('normalization', MinMaxScaler()),
('classifier', RandomForestClassifier())
])
joblib.dump(pipeline, 'transform_predict.joblib')
然后,您可以只加载一个转换管道并调用 fit_transform 来转换输入数据并获得预测:
pipeline = load('transform_predict.joblib')
predictions = pipeline.predict(new_data)
您需要保存 minmaxscaler(连同模型)。在 Flask 应用程序中,您可以:
- 从文件加载缩放器
- 使用此缩放器实例来缩放输入值
#训练时
from sklearn.externals import joblib scaler_filename = "saved_scaler" joblib.dump(scaler, scaler_filename)在 Flask 应用程序中
scaler_filename = "saved_scaler" scaler = joblib.load(scaler_filename)
其它你可能感兴趣的问题