我有一个相对较小的样本量(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