将 GridSearchCV 与 TimeSeriesSplit 一起使用

Posted

技术标签:

【中文标题】将 GridSearchCV 与 TimeSeriesSplit 一起使用【英文标题】:Using GridSearchCV with TimeSeriesSplit 【发布时间】:2019-10-26 01:31:41 【问题描述】:

我有一些代码可以使用TimeSeriesSplit 来拆分我的数据。对于每个拆分,我将使用ParametersGrid 并循环遍历每个参数组合,记录最佳参数集并使用它来预测我的X_test。这部分的代码可以在文章底部看到

我知道GridSearchCV 会为我做很多这样的工作。我想知道我是否使用以下代码,我的数据在哪里拆分 X_trainX_testy_trainy_test?将GridSearchCVTimeSeriesSplit 一起使用会在幕后处理这个问题吗?如果是这样,这段代码会与我在这篇文章底部的原始代码完成同样的事情吗?另外,我现在尝试了GridSearchCV 方法,并且已经将近 30 分钟没有完成 - 我的语法是否正确?

X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]

parameters = [
    'kernel': ['rbf'],
     'gamma': [.01],
     'C': [1, 10, 100]]

gsc = GridSearchCV(SVR(), param_grid=parameters, scoring='neg_mean_absolute_error', 
                   cv=TimeSeriesSplit(n_splits=2))
gsc.fit(X,y)
means = gsc.cv_results_['mean_test_score']
for mean in means:
    print(mean)
print('end')

原代码如下:

# Create the time series split generator
tscv = TimeSeriesSplit(n_splits=3)

for train_index, test_index in tqdm(tscv.split(X)):

X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]

# scale the data set
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)


# optimization area - set params
parameters = [
    'kernel': ['rbf'],
     'gamma': [.01],
     'C': [ 1,10,100,500,1000]]


regressor = SVR()
# loop through each of the parameters and find the best set
for e, g in enumerate(ParameterGrid(parameters)):
    regressor.set_params(**g)
    regressor.fit(X_train, y_train.ravel())
    score = metrics.mean_absolute_error(regressor.predict(X_train), y_train.ravel())
    if e == 0:
        best_score = score
        best_params = g
    elif score < best_score:
        best_score = score
        best_params = g


# refit the model with the best set of params

regressor.set_params(**best_params)
regressor.fit(X_train, y_train.ravel())

【问题讨论】:

【参考方案1】:

你需要稍微修改一下代码。

gsc = GridSearchCV(SVR(), param_grid=parameters, scoring='neg_mean_absolute_error', 
                   cv=TimeSeriesSplit(n_splits=2).split(X))

而且,您可以考虑添加verbose 参数来查看运行输出。

【讨论】:

啊,我明白了——但是你在哪里分裂?当我手动执行此操作时,我必须指定它 另外 - GridSearchCV 方法的运行时间是否比我的“原始代码”方法更长? split() 方法生成索引以将数据拆分为训练集和测试集。然后将这些索引应用于Xy 以实际拆分数据。 快速浏览一下,我找不到任何明显的原因说明GridSearchCV 的性能会比其他代码差。几个建议 - 设置 n_jobs=-1 以便使用所有处理器,并在实例化 SVR() 时设置 kernelgamma,除非您打算使用这些参数的更多值进行测试(现在只有一个在网格)。 是的,我只是删除参数来测试 gamma 以尝试让它完成运行。我会尝试 n_jobs 设置。所以我的两个代码sn-ps基本上都是做同样的事情吧?

以上是关于将 GridSearchCV 与 TimeSeriesSplit 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将管道与 GridSearchCV 一起使用

将 gridsearchCV 与 Keras RNN-LSTM 一起使用时出现尺寸错误

将 sklearn 的 BaggingClassifier 与 GridSearchCV 一起使用时出现 ZeroDivisionError

将 Sklearn GridSearchCV 与 Pipeline 一起使用时如何传递权重

GridSearchCV - 跨测试访问预测值?

GridSearchCV中“n_jobs == 1”的含义与使用多个GPU