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

发布于 2021-01-29 15:06:20

我想使用scikit-learn的GridSearchCV来确定随机森林模型的一些超级参数。我的数据是时间相关的,看起来像

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

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

train:(2012, 2013) - test:(2014)
train:(2013, 2014) - test:(2015)

也就是说,我想使用2年的历史观测值来训练模型,然后在接下来的一年中测试其准确性。

关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您只需要将拆分的可迭代对象传递给GridSearchCV。此拆分应采用以下格式:

    [
     (split1_train_idxs, split1_test_idxs),
     (split2_train_idxs, split2_test_idxs),
     (split3_train_idxs, split3_test_idxs),
     ...
    ]
    

    要获取idx,您可以执行以下操作:

    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)]
    

    看起来像这样:

    [([0, 1, 2], [3]),  # idxs of first split as (train, test) tuple
     ([2, 3], [4, 5])]  # idxs of second split as (train, test) tuple
    

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

    GridSearchCV(estimator, param_grid, cv=cv, ...)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看