【问题标题】:Scaling Features For Prediction in Scikit LearnScikit Learn 中预测的缩放特征
【发布时间】:2018-09-07 15:25:58
【问题描述】:

我一直在研究机器学习模型,目前正在使用带有 GridSearchCV 的管道。我的数据使用 MinMaxScaler 进行缩放,并且我正在使用带有 RBR 内核的 SVR。现在我的问题是我的模型是完整的、合适的并且有一个不错的评估分数,我是否还需要使用 MinMaxScaler 缩放新数据以进行预测,或者我可以直接使用数据进行预测吗?我已经阅读了 3 本关于 scikit learn 的书籍,但它们都专注于特征工程和拟合。除了使用 predict 方法之外,它们并没有真正涵盖预测步骤中的任何其他步骤。

这是代码:

pipe = Pipeline([('scaler', MinMaxScaler()), ('clf', SVR())]) 
time_split = TimeSeriesSplit(n_splits=5) 

param_grid = {'clf__kernel': ['rbf'], 
              'clf__C':[0.0001, 0.001], 
              'clf__gamma': [0.0001, 0.001]} 

grid = GridSearchCV(pipe, param_grid, cv= time_split, 
                    scoring='neg_mean_squared_error', n_jobs = -1) 
grid.fit(X_train, y_train) 

【问题讨论】:

  • 您可以使用 pickle 或 joblib 将完整的 GridSearchCV 或从中找到的最佳估计器保存到文件中,然后在预测时加载。

标签: python machine-learning scikit-learn prediction


【解决方案1】:

当然,如果您获得新的(在未处理的意义上)数据,您需要执行与训练模型时相同的准备步骤。例如,如果您将 MinMaxScaler 与默认比例一起使用,则模型用于在每个特征中包含均值和标准方差为零的数据,如果您不对数据进行预处理,则模型无法产生准确的结果。

请记住使用与训练数据完全相同的 MinMaxScaler 对象。因此,如果您将模型保存到文件中,请同时保存您的预处理对象。

【讨论】:

  • 谢谢!所以只是澄清一下,如果我使用 Pipeline,我该如何使用相同的 MinMaxScaler 对象?它似乎可以在每个交叉折叠上自行处理所有预处理。我可以看看我是否像这样自己应用了转换: scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) prediction_scaled = scaler.transform(predictions) 这完美地回答了我的问题。我很惊讶没有一本书提到这一点。
  • 我没有管道方面的经验。你能提供一些代码吗?
  • > pipe = Pipeline([('scaler', MinMaxScaler()), ('clf', SVR())]) > time_split = TimeSeriesSplit(n_splits=5) > param_grid = {'clf__kernel ': ['rbf'], 'clf__C':[0.0001, 0.001], 'clf__gamma': [0.0001, 0.001]} > grid = GridSearchCV(pipe, param_grid, cv= time_split, score='neg_mean_squared_error', n_jobs = - 1) > grid.fit(X_train, y_train)
  • 对不起第一次发帖,我无法让标记工作
  • 对不起,我不能在这里帮助你。我猜有可能保存整个管道,或者至少是将模型应用于测试数据的重要步骤(并省略 cv 内容),但我不知道
【解决方案2】:

感谢 pythonic833 的回答,我想用解决方案来跟进我的问题。如果您使用管道,我认为缩放新数据以进行预测的正确程序是使用管道上使用的原始训练数据从头到尾进行整个缩放过程​​。即使管道在训练过程中为您进行了缩放,也有必要手动缩放训练数据,以便能够通过 MinMaxScaler 对象准确预测和正确缩放新数据。以下是我基于 pythonic833 答案和其他一些 cmets 的代码,例如使用 Pickle 保存模型。

from sklearn.preprocessing import MinMaxScaler

pipe = Pipeline([('scaler', MinMaxScaler()), ('clf', SVR())]) 
time_split = TimeSeriesSplit(n_splits=5) 
param_grid = {'clf__kernel': ['rbf'], 
          'clf__C':[0.0001, 0.001], 
          'clf__gamma': [0.0001, 0.001]} 

grid = GridSearchCV(pipe, param_grid, cv= time_split, 
       scoring='neg_mean_squared_error', n_jobs = -1) 
grid.fit(X_train, y_train)

# Pickle the data with a content manager
with open('Pickles/{}.pkl'.format(file_name), 'wb') as file:
    pickle.dump(grid, file)

# Load Pickle with a content manager
with open('Pickles/{}.pkl'.format(file_name), 'rb') as file:
    model = pickle.load(file)

scaler = MinMaxScaler()
scaler.fit(X_train)  # Original training data for Pipeline
X_train_scaled = scaler.transform(X_train)
new_data_scaled = scaler.transform(new_data)
model.predict(new_data_scaled)

【讨论】:

  • 在阅读了更多关于管道和扩展的信息之后。我需要重新审视我之前发布的内容。在使用 GridSearchCV 和 Pipeline 进行预测时,您不需要重新调整训练数据的比例。只需调用 grid.predict(new_data) 即可运行管道并缩放数据。当它到达最后一步时,它只是运行 predict 而不是最后一步中的分类器。所以上面例子中打开 Pickle 之后的一切都是不必要的。只需对新数据调用 predict
猜你喜欢
  • 2019-01-10
  • 2015-01-12
  • 2015-03-19
  • 2016-02-25
  • 2018-02-24
  • 2021-08-24
  • 2018-06-01
  • 2016-10-29
  • 2014-05-22
相关资源
最近更新 更多