【问题标题】:How do I a correctly use a Scaler while using GridSearchCV with TimeSeriesSplit如何在将 GridSearchCV 与 TimeSeriesSplit 一起使用时正确使用 Scaler
【发布时间】:2019-11-04 13:01:50
【问题描述】:

我目前正在像这样使用GridSearchCVTimeSeriesSplit,以便将我的数据拆分为 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_train - 它会省略X_test,对吧?

我想知道是否有适当的方法来扩展数据,同时仍然在 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_]))

【问题讨论】:

    标签: python machine-learning scikit-learn cross-validation grid-search


    【解决方案1】:

    使用管道 (https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html) :

    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_)
    

    有关幕后步骤,另请参阅此帖子:Apply StandardScaler in Pipeline in scikit-learn (sklearn)

    【讨论】:

    • 我实际上在该帖子上发布了回复,却没有意识到您是回复我帖子的人。我的后续问题是,如果我像您建议的那样使用管道,我是否会失去拥有单独的 Scaler 对象以分别适合 X 和 y 数据集以避免“数据泄漏”的能力,就像我在我的第二个代码大佬?我什至不确定是否需要额外的步骤@serafeim
    • 另外 - 如果我使用管道。是否可以访问 StandardScalar 的 inverse_transform 方法以将我的数据恢复为原始格式,还是只能使用管道的 inverse_transform 方法来撤消所有转换步骤?
    • 对于第一个问题,您不需要在y 上应用StandardScalar ,因为y 是您要预测的变量。使用我的答案中的代码,并且没有数据泄漏的问题(我已经在这里逐步解释了它是如何工作的:stackoverflow.com/a/51465479/5025009
    • 因此,如果我的 X 是所有数字的 8 列,具有不同的范围,那么我应用 StandardScalar。它将单独遍历每一列并计算每一列的平均值/标准偏差,然后在 GridSearchCV 步骤期间预测 y 的值。如果 y 始终是 60-100 之间的数字,则预测值将始终采用缩放项(-1 和 1 之间的数字),对吗?因此,当我对该预测值应用 inverse_transform 以在原始 y 的 60-100 范围内对其进行可视化时,我不需要 y_scale 来执行此操作吗?
    • 我添加了我的实际代码块 b/c 关于我为什么需要 y_scaler 的问题可能太复杂了。我的逻辑有问题吗?本质上,我只是喜欢相同的比例,所以我可以更容易地绘制它。
    猜你喜欢
    • 2019-10-26
    • 2020-10-21
    • 2019-01-18
    • 2015-11-19
    • 2018-10-24
    • 2018-12-04
    • 2019-09-22
    • 2021-12-24
    相关资源
    最近更新 更多