使用scikit-learn进行时间序列的交叉验证

我找不到我想要的信息,所以我在这里发布我的问题。我刚刚开始学习机器学习。我使用scikit-learn库对时间序列数据进行了我的第一次多元回归。我的代码如下所示

X = df[feature_cols]
y = df[['scheduled_amount']]
index= y.reset_index().drop('scheduled_amount', axis=1)
linreg = LinearRegression()
tscv = TimeSeriesSplit(max_train_size=None, n_splits=11)
li=[]
for train_index, test_index in tscv.split(X):
    train = index.iloc[train_index]
    train_start, train_end = train.iloc[0,0], train.iloc[-1,0]
    test = index.iloc[test_index]
    test_start, test_end = test.iloc[0,0], test.iloc[-1,0]
    X_train, X_test = X[train_start:train_end], X[test_start:test_end]
    y_train, y_test = y[train_start:train_end], y[test_start:test_end]
    linreg.fit(X_train, y_train)
    y_predict = linreg.predict(X_test)
    print('RSS:' + str(linreg.score(X_test, y_test)))
    y_test['predictec_amount'] = y_predict
    y_test.plot()

需要注意的是,我的数据是时间序列数据,我希望在拟合模型时保留数据框中的日期时间索引。我使用了TimeSeriesSplit进行交叉验证。我仍然不太理解交叉验证。首先,时间序列数据集是否需要交叉验证?其次,我应该使用最后的线性系数,还是应该使用所有系数的平均值来进行未来的预测?


回答:

是的,时间序列数据集确实需要进行交叉验证。基本原因是你需要确保你的模型不会过度拟合当前的测试数据,并且能够捕捉到过去的季节性变化,这样你就可以对模型在未来表现有信心。这种方法也用于选择模型的超参数(例如,Ridge回归中的alpha)。

为了进行未来的预测,你应该使用全部数据和最佳超参数重新拟合你的回归模型,或者,如@Marcus V.在评论中提到的,可能最好只用最新的数据进行训练。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注