### scikit-learn中纵向/面板数据的交叉验证

我有一些纵向/面板数据,格式如下(数据录入代码在问题下方)。X和y的观测值按时间和国家索引(例如,第1时间点的美国,第2时间点的美国,第1时间点的加拿大)。

    time x  y
USA 1    5  10
USA 2    5  12
USA 3    6  13
CAN 1    2  2
CAN 2    2  3
CAN 3    4  5

我尝试使用sklearn来预测y。为了重现示例,我们可以使用线性回归。

为了进行交叉验证,我不能使用test_train_split,因为这样可能会将time = 3的数据放入X_train,而time = 2的数据放入y_test。这将毫无帮助,因为在time = 2时,当我们试图预测y时,我们实际上还没有time = 3的数据来训练。

我试图使用TimeSeriesSplit来实现交叉验证,如下图所示:

enter image description here(来源: https://stats.stackexchange.com/questions/14099/using-k-fold-cross-validation-for-time-series-model-selection)

y = df.y
X = df.drop(['y'], 1)
print(y)
print(X)
from sklearn.model_selection import TimeSeriesSplit
X = X.to_numpy()
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits = 2, max_train_size=3)
print(tscv)
for train_index, test_index in tscv.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

这几乎接近我需要的,但还不完全是:

TRAIN: [0 1] TEST: [2 3]
TRAIN: [1 2 3] TEST: [4 5]
  • 我现在如何使用TimeSeriesSplit的索引来交叉验证模型?

我认为一个复杂之处可能是我的数据并不是严格的时间序列:它不仅按time索引,还按country索引,因此数据具有纵向/面板性质。

我期望的输出是:

  1. 一系列测试和训练索引,允许我执行“向前走”交叉验证

例如

TRAIN: [1] TEST: [2]
TRAIN: [1 2] TEST: [3]
  1. 基于time值分割的X_trainx_testy_testy_train,或者明确我是否需要这样做。

  2. 使用“向前走”交叉验证方法交叉验证的任何模型(例如线性回归)的准确性得分。

编辑:感谢@sabacherli回答了我的问题的第一部分,并修复了出现的错误。

数据录入代码

import numpy as np
import pandas as pd
data = np.array([['country','time','x','y'],
                ['USA',1, 5, 10],
                ['USA',2, 5, 12],
                ['USA',3,6, 13],
                ['CAN',1,2, 2],
                ['CAN',2,2, 3],
                ['CAN',3,4, 5]],
                               )
df = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])
df

回答:

TimeSeriesSplit假设你的数据集按时间索引,这意味着每行属于不同的时间步。那么为什么不unstack数据,使你只有时间作为索引,然后再分割。分割后,你可以stack数据形状,以获取用于训练的基础表格。

data = np.array([['country','time','x','y'],
                ['USA',1, 5, 10],
                ['USA',2, 5, 12],
                ['USA',3,6, 13],
                ['CAN',1,2, 2],
                ['CAN',2,2, 3],
                ['CAN',3,4, 5]],
                               )
df = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])
df1 = df.reset_index().set_index(['time','index']).unstack(-1)
print(df1)
        x       y    index CAN USA CAN USA
time                 1       2   5   2  10
                     2       2   5   3  12
                     3       4   6   5  13

现在,由于每行按时间索引,你可以轻松地将这些数据分割成组,然后在分割后再次堆叠以获取你的X_train X_test等…

from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits = 2, max_train_size=3)
X_cols = ['time', 'index', 'x']
y_cols = ['y']
for train_index, test_index in tscv.split(df1):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = df1.iloc[train_index].stack(-1).reset_index()[X_cols].to_numpy(), df1.iloc[test_index].stack(-1).reset_index()[X_cols].to_numpy()
    y_train, y_test = df1.iloc[train_index].stack(-1).reset_index()[y_cols].to_numpy(), df1.iloc[test_index].stack(-1).reset_index()[y_cols].to_numpy()
TRAIN: [0] TEST: [1]
TRAIN: [0 1] TEST: [2]

你可以打印最新折叠的X_train和y_train来查看发生了什么 –

print('For - TRAIN: [0 1] TEST: [2]')
print(" ")
print("X_train:")
print(X_train)
print(" ")
print("X_test:")
print(X_test)
print(" ")
print("y_train:")
print(y_train)
print(" ")
print("y_test:")
print(y_test)
print("X_train:")
print(X_train)
print(" ")
print("X_test:")
print(X_test)
print(" ")
print("y_train:")
print(y_train)
print(" ")
print("y_test:")
print(y_test)
For - TRAIN: [0 1] TEST: [2]
X_train:
[['1' 'CAN' '2']
 ['1' 'USA' '5']
 ['2' 'CAN' '2']
 ['2' 'USA' '5']]
X_test:
[['3' 'CAN' '4']
 ['3' 'USA' '6']]
y_train:
[['2']
 ['10']
 ['3']
 ['12']]
y_test:
[['5']
 ['13']]

所以现在你可以按时间分割数据框,并将其扩展回你需要的用于训练的形状。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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