首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scikit-学习时间序列数据的交叉验证自定义拆分

scikit-学习时间序列数据的交叉验证自定义拆分
EN

Stack Overflow用户
提问于 2016-06-02 13:21:39
回答 3查看 13.1K关注 0票数 13

我想使用scikit learn的GridSearchCV来确定随机森林模型的一些超参数。我的数据依赖于时间,看起来像这样

代码语言:javascript
复制
import pandas as pd

train = pd.DataFrame({'date': pd.DatetimeIndex(['2012-1-1', '2012-9-30', '2013-4-3', '2014-8-16', '2015-3-20', '2015-6-30']), 
'feature1': [1.2, 3.3, 2.7, 4.0, 8.2, 6.5],
'feature2': [4, 4, 10, 3, 10, 9],
'target': [1,2,1,3,2,2]})

>>> train
        date  feature1  feature2  target
0 2012-01-01       1.2         4       1
1 2012-09-30       3.3         4       2
2 2013-04-03       2.7        10       1
3 2014-08-16       4.0         3       3
4 2015-03-20       8.2        10       2
5 2015-06-30       6.5         9       2

如何实现以下交叉验证折叠技术?

代码语言:javascript
复制
train:(2012, 2013) - test:(2014)
train:(2013, 2014) - test:(2015)

也就是说,我想用两年的历史观察来训练一个模型,然后在接下来的一年测试它的准确性。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-02 20:04:20

您只需将带有拆分的迭代器传递给GridSearchCV即可。此拆分应采用以下格式:

代码语言:javascript
复制
[
 (split1_train_idxs, split1_test_idxs),
 (split2_train_idxs, split2_test_idxs),
 (split3_train_idxs, split3_test_idxs),
 ...
]

要获得idxs,您可以这样做:

代码语言:javascript
复制
groups = df.groupby(df.date.dt.year).groups
# {2012: [0, 1], 2013: [2], 2014: [3], 2015: [4, 5]}
sorted_groups = [value for (key, value) in sorted(groups.items())] 
# [[0, 1], [2], [3], [4, 5]]

cv = [(sorted_groups[i] + sorted_groups[i+1], sorted_groups[i+2])
      for i in range(len(sorted_groups)-2)]

这看起来像这样:

代码语言:javascript
复制
[([0, 1, 2], [3]),  # idxs of first split as (train, test) tuple
 ([2, 3], [4, 5])]  # idxs of second split as (train, test) tuple

然后您可以执行以下操作:

代码语言:javascript
复制
GridSearchCV(estimator, param_grid, cv=cv, ...)
票数 21
EN

Stack Overflow用户

发布于 2018-08-22 16:45:49

sklearn中还有TimeSeriesSplit功能,它在训练/测试集中拆分时间序列数据(即,以固定的时间间隔)。请注意,与标准的交叉验证方法不同,连续的训练集是它们之前的训练集的超集,即在每次分割中,测试指标必须比以前更高,因此在交叉验证器中混洗是不合适的。

票数 9
EN

Stack Overflow用户

发布于 2018-02-28 04:00:40

有一种使用GroupShuffleSplit的标准sklearn方法。从文档中:

提供随机化的训练/测试索引,以根据第三方提供的组拆分数据。该组信息可用于将样本的任意域特定分层编码为整数。

例如,这些组可以是样本的收集年份,因此可以针对基于时间的拆分进行交叉验证。

对你的用例来说非常方便。它看起来是这样的:

代码语言:javascript
复制
cv = GroupShuffleSplit().split(X, y, groups)

并像以前一样将其传递给GridSearchCV

代码语言:javascript
复制
GridSearchCV(estimator, param_grid, cv=cv, ...)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37583263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档