Python 如何在使用带有TimeSeriesSplit的GridSearchCV时正确使用定标器
我目前正在使用Python 如何在使用带有TimeSeriesSplit的GridSearchCV时正确使用定标器,python,machine-learning,scikit-learn,cross-validation,grid-search,Python,Machine Learning,Scikit Learn,Cross Validation,Grid Search,我目前正在使用GridSearchCV和TimeSeriesSplit这样,以便将我的数据拆分为5个CV拆分 X = data.iloc[:, 0:8] y = data.iloc[:, 8:9] SVR_parameters = [{'kernel': ['rbf'], 'gamma': [.01,.001,1], 'C': [1,100]}] gsc = GridSearchCV(SVR(), param_grid=SVR_pa
GridSearchCV
和TimeSeriesSplit
这样,以便将我的数据拆分为5个CV拆分
X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]
SVR_parameters = [{'kernel': ['rbf'],
'gamma': [.01,.001,1],
'C': [1,100]}]
gsc = GridSearchCV(SVR(), param_grid=SVR_parameters, scoring='neg_mean_squared_error',
cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit=True)
gsc.fit(X, y)
gsc_dataframe = pd.DataFrame(gsc.cv_results_)
我的理解是,在使用定标器时,您希望仅在训练集上安装定标器,并使用该定标器对象转换测试集,以防止数据泄漏,因此基本上如下所示:
scaler_X = StandardScalar()
scaler_y = StandardScalar()
scaler_X.fit(X_train)
scaler_y.fit(y_train)
X_train, X_test = scaler_X.transform(X_train), scaler_X.transform(X_test)
y_train, y_test = scaler_y.transform(y_train), scaler_y.transform(y_test)
我的问题是:
如果我执行这种类型的缩放操作,我将如何使GridSearchCV
在整个数据集上进行分割?如果我只是将gsc
对象中的X
变量替换为X\u列
,它将省略X\u测试
,对吗
我想知道在GridSearchCV
我希望我解释得足够清楚。如果你需要澄清什么,请告诉我
更新: 添加完整代码以帮助更好地解释
X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, shuffle=False)
test_index = X_test.index.values.tolist()
scaler_x = StandardScaler()
scaler_y = StandardScaler()
scaler_x.fit(X_train)
scaler_y.fit(y_train)
X_train, X_test = scaler_x.transform(X_train), scaler_x.transform(X_test)
y_train, y_test = scaler_y.transform(y_train), scaler_y.transform(y_test)
SVR_parameters = [{'kernel': ['rbf'],
'gamma': [.1, .01, .001],
'C': [100,500,1000]}]
gsc = GridSearchCV(SVR(), param_grid=SVR_parameters, scoring='neg_mean_squared_error',
cv=TimeSeriesSplit(n_splits=5).split(X_train),verbose=10, n_jobs=-1, refit=True)
gsc.fit(X_train, y_train)
gsc_dataframe = pd.DataFrame(gsc.cv_results_)
y_pred = gsc.predict(X_test)
y_pred = scaler_y.inverse_transform(y_pred)
y_test = scaler_y.inverse_transform(y_test)
mae = round(metrics.mean_absolute_error(y_test,y_pred),2)
mse = round(metrics.mean_squared_error(y_test, y_pred),2)
y_df = pd.DataFrame(index=pd.to_datetime(test_index))
y_pred = y_pred.reshape(len(y_pred), )
y_test = y_test.reshape(len(y_test), )
y_df['Model'] = y_pred
y_df['Actual'] = y_test
y_df.plot(title='{}'.format(gsc.cv_results_['params'][gsc.best_index_]))
使用管道() :
另请参见本帖的幕后步骤:我实际上在那篇帖子上发布了一条回复,却没有意识到你就是回复我帖子的人。我的后续问题是,如果我像你建议的那样使用管道,我是否会失去使用单独的Scaler对象来分别适应X和y数据集以避免“数据泄漏”的能力,就像我在第二篇代码中概述的那样?如果我使用管道,我甚至不确定@serafeimAlso是否需要额外的步骤。然后是否可以访问StandardScalar的逆变换方法以将我的数据恢复到原始格式,或者您是否可以只使用管道的逆变换方法来撤消所有转换步骤?对于第一个问题,您不需要在
y
上应用StandardScalar
y
是要预测的变量。按照我的答案使用代码,并且没有数据泄漏的问题(我在这里一步一步地解释了它是如何工作的:),因此如果我的X是8列不同范围的所有数字,那么我应用StandardScalar。它将逐个检查每一列,并计算每一列的平均值/标准偏差,然后在GridSearchCV步骤中预测y值。如果y始终是一个介于60-100之间的数字,则预测值将始终以缩放项(数字介于-1和1之间)表示,对吗?所以,当我在预测值上应用逆_变换,以原始y的60-100比例将其可视化时,我不需要y_比例来实现吗?我添加了我的实际代码块b/c,关于为什么我需要y_比例器的问题可能太复杂了。我的逻辑有问题吗?基本上,我只是喜欢在相同的比例,所以我可以画它更容易。
pipe = Pipeline([
('scale', StandardScaler()),
('clf', SVR())])
param_grid = dict(clf__gamma = [.01,.001,1],
clf__C = [1,100],
clf__kernel = ['rbf','linear'])
gsc = GridSearchCV(pipe, param_grid = param_grid, scoring='neg_mean_squared_error',
cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit=True)
gsc.fit(X,y)
print(gsc.best_estimator_)