时间序列数据的重复 k 折交叉验证?

数据挖掘 时间序列 交叉验证 训练
2021-09-15 21:11:22

我有一个相对较小的样本量(330 个有 45 个特征)+它的时间序列数据。

我想训练我的 LightGBM 回归模型以获得最佳广义 RMSE 分数,并想使用重复的 CV。我使用 hyperopt 进行超参数优化以优化最低 RMSE。

过去 2 个月包括电晕后的数据,因此在对此类数据进行测试时,标准的 k 倍 CV 可能会失败,因为目标变量 y 发生了很大变化。

重复 CV 的标准方法是使用 resample / reshuffle,这不适用于时间序列数据。

在这种情况下,最佳做法是什么?在处理时间序列数据时如何进行重复交叉验证?

目前我为 fmin() 函数执行此操作。

def lightgbm_cv_repeated(params):
    params = {
        'n_estimators': int(params['n_estimators']), 
        'max_depth': int(params['max_depth']), 
        'learning_rate': params['learning_rate'],
        'min_child_samples': int(params['min_child_samples']),
        'min_child_weight': params['min_child_weight'],
        'feature_fraction': params['feature_fraction'],
        'bagging_fraction': params['bagging_fraction'],
        'bagging_freq': int(params['bagging_freq']),
        'num_leaves': int(params['num_leaves']),
        'max_bin': int(params['max_bin']),
        'num_iterations': int(params['num_iterations']),
        'objective': 'rmse',
        }

    scores = []

    for i in range(5, 11):
        print(i)
        cvTSS = TimeSeriesSplit(max_train_size=None, n_splits=i)
    
        model = lgb.LGBMRegressor(random_state=i, **params)
        score = -cross_val_score(model, X=X, y=y, cv=cvTSS, scoring="neg_root_mean_squared_error", n_jobs=-1).mean()
        scores.append(score)

    result = mean(scores)
    return result
0个回答
没有发现任何回复~