我一直在研究机器学习模型,我目前正在使用带有GridSearchCV的Pipeline。我的数据使用MinMaxScaler进行缩放,我使用的是带有RBR内核的SVR。我现在的问题是我的模型是完整的,适合的,并且具有良好的评估分数,我是否还需要使用MinMaxScaler为预测扩展新数据,或者我可以按原样对数据进行预测?我已经阅读了3本关于scikit学习的书籍,但他们都专注于特征工程和拟合。除了使用预测方法之外,它们并未真正涵盖预测步骤中的任何其他步骤。
这是代码:
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)
答案 0 :(得分:2)
当然,如果您获得新的(在未处理的意义上)数据,您需要执行与训练模型时相同的准备步骤。例如,如果您使用默认比例的MinMaxScaler,则模型用于在每个要素中具有零均值和标准差异的数据,如果您不预处理数据,则模型无法产生准确的结果。
请记住使用与训练数据完全相同的MinMaxScaler对象。因此,如果您将模型保存到文件中,请同时保存预处理对象。
答案 1 :(得分:0)
由于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)