如何正确地将用于训练数据集的相同数据转换应用于 Web 服务中的真实数据?

数据挖掘 机器学习 数据
2021-09-22 08:57:05

假设我在创建模型时使用了 minmaxscaler 。现在,我正在通过Pickle在 Flask 应用程序中加载该模型。在收到包含数据点的请求后,想对其应用与在调用predict()方法之前应用到训练数据集相同的转换。如何将这组转换从一个文件传输到 Web 服务?

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 应用程序中,您可以:

  1. 从文件加载缩放器
  2. 使用此缩放器实例来缩放输入值

#训练时

from sklearn.externals import joblib
scaler_filename = "saved_scaler"
joblib.dump(scaler, scaler_filename)

在 Flask 应用程序中

scaler_filename = "saved_scaler"    
scaler = joblib.load(scaler_filename)