sklearn中的TimeSeriesSplit交叉验证函数仅适用于时间序列数据的分区。

4
我正在尝试使用sklearn版本0.18.1中的TimeSeriesSplit交叉验证策略和LogisticRegression估算器。但是我遇到了一个错误,提示如下:
“cross_val_predict仅适用于分区”
以下代码片段展示了如何重现此问题:
from sklearn import linear_model, neighbors
from sklearn.model_selection import train_test_split, cross_val_predict, TimeSeriesSplit, KFold, cross_val_score
import pandas as pd
import numpy as np
from datetime import date, datetime

df = pd.DataFrame(data=np.random.randint(0,10,(100,5)), index=pd.date_range(start=date.today(), periods=100), columns='x1 x2 x3 x4 y'.split())


X, y = df['x1 x2 x3 x4'.split()], df['y']
score = cross_val_score(linear_model.LogisticRegression(fit_intercept=True), X, y, cv=TimeSeriesSplit(n_splits=2))
y_hat = cross_val_predict(linear_model.LogisticRegression(fit_intercept=True), X, y, cv=TimeSeriesSplit(n_splits=2), method='predict_proba')

我做错了什么?


如何在堆叠上下文中使用TimeSeriesSplit和cross_val_predict:https://datascience.stackexchange.com/a/105116/76808 - Marco Cerliani
1个回答

8

有几种方法可以传递cross_val_score中的cv参数。在这里,您必须传递拆分的生成器。例如:

y = range(14)
cv = TimeSeriesSplit(n_splits=2).split(y)

提供一个生成器。使用它可以生成CV的训练和测试索引数组。第一个看起来像这样:

print cv.next()
    (array([0, 1, 2, 3, 4, 5, 6, 7]), array([ 8,  9, 10, 11, 12, 13]))

您还可以将数据框作为split的输入。

df = pd.DataFrame(data=np.random.randint(0,10,(100,5)), 
                  index=pd.date_range(start=date.today(), 
                  periods=100), columns='x1 x2 x3 x4 y'.split())

cv = TimeSeriesSplit(n_splits=2).split(df)
print cv.next()
    (array([ 0,  1,  2, ..., 31, 32, 33]), array([34, 35, 36, ..., 64, 65, 66]))

在你的情况下,这应该可以工作:
score = cross_val_score(linear_model.LogisticRegression(fit_intercept=True), 
                         X, y, cv=TimeSeriesSplit(n_splits=2).split(df))

请查看cross_val_scoreTimeSeriesSplit以获取详细信息。


range(14)中的14是什么?那是任意的数字吗?数据框中的值也是一样。我不是很清楚你是如何得出这些值的。 - keithhackbarth
14是任意的,正如所述,这只是一个例子。关于数据框架:请看一下问题,我只是复制了它。 - glao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接