Scikit Learn 中用于预测的缩放特征
Scaling Features For Prediction in Scikit Learn
我一直在研究机器学习模型,目前正在使用带有 GridSearchCV 的管道。我的数据是用 MinMaxScaler 缩放的,我使用的是带有 RBR 内核的 SVR。现在我的问题是我的模型是完整的、合适的并且有一个不错的评估分数,我是否还需要使用 MinMaxScaler 扩展新数据以进行预测,或者我是否可以按原样使用数据进行预测?我读过 3 本关于 scikit learn 的书,但它们都侧重于特征工程和拟合。除了使用预测方法外,它们并没有真正涵盖预测步骤中的任何其他步骤。
这是代码:
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)
当然,如果您获得新的(未处理的)数据,您需要执行与训练模型时相同的准备步骤。例如,如果您使用具有默认比例的 MinMaxScaler,则该模型用于在每个特征中具有零均值和标准方差的数据,如果您不预处理数据,该模型将无法产生准确的结果。
请记住使用与训练数据完全相同的 MinMaxScaler 对象。因此,如果您将模型保存到文件中,请同时保存您的预处理对象。
感谢 pythonic833 的回答,我想用一个解决方案来跟进我的问题。我认为,如果您使用管道,则缩放新数据以进行预测的正确程序是使用管道上使用的原始训练数据从头到尾执行整个缩放过程。即使管道在训练过程中为您进行了缩放,也有必要手动缩放训练数据,以便能够通过 MinMaxScaler 对象准确预测和正确缩放新数据。下面是我的代码基于 pythonic833 答案和其他一些评论,例如用 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 的管道。我的数据是用 MinMaxScaler 缩放的,我使用的是带有 RBR 内核的 SVR。现在我的问题是我的模型是完整的、合适的并且有一个不错的评估分数,我是否还需要使用 MinMaxScaler 扩展新数据以进行预测,或者我是否可以按原样使用数据进行预测?我读过 3 本关于 scikit learn 的书,但它们都侧重于特征工程和拟合。除了使用预测方法外,它们并没有真正涵盖预测步骤中的任何其他步骤。
这是代码:
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)
当然,如果您获得新的(未处理的)数据,您需要执行与训练模型时相同的准备步骤。例如,如果您使用具有默认比例的 MinMaxScaler,则该模型用于在每个特征中具有零均值和标准方差的数据,如果您不预处理数据,该模型将无法产生准确的结果。
请记住使用与训练数据完全相同的 MinMaxScaler 对象。因此,如果您将模型保存到文件中,请同时保存您的预处理对象。
感谢 pythonic833 的回答,我想用一个解决方案来跟进我的问题。我认为,如果您使用管道,则缩放新数据以进行预测的正确程序是使用管道上使用的原始训练数据从头到尾执行整个缩放过程。即使管道在训练过程中为您进行了缩放,也有必要手动缩放训练数据,以便能够通过 MinMaxScaler 对象准确预测和正确缩放新数据。下面是我的代码基于 pythonic833 答案和其他一些评论,例如用 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)