递归样本拆分方案(带网格搜索)

A recursive sample splitting scheme (with grid searching)

提问人:Beitian Ma 提问时间:11/17/2023 最后编辑:toyota SupraBeitian Ma 更新时间:11/19/2023 访问量:42

问:

我有一个数据面板,例如,每个横截面中都有几个样本

import pandas as pd
import numpy as np

dates = ["2018-01-01", "2019-01-01", "2020-01-01", "2021-01-01", "2022-01-01"] * 2
dates.sort()
samples = [1, 2] * 5
df = pd.DataFrame(
    {
        "dates": dates,
        "samples": samples
    }
)

我想创建一个交叉验证生成器,我在其中进行了 3 次验证:

  1. 第一次,samples in 是训练样本,in 是验证样本;["2018-01-01", "2019-01-01"]["2020-01-01"]
  2. 第二次,samples in 是训练样本,in 是验证样本;["2018-01-01", "2019-01-01", "2020-01-01"]["2021-01-01"]
  3. 最后一次,samples in 是训练样本,in 是验证样本。["2018-01-01", "2019-01-01", "2020-01-01", "2021-01-01"]["2022-01-01"]

简而言之,训练集递归增加,而验证集保持恒定长度。

我曾考虑过功能,但问题是:PredefinedSplit()sklearn.model_selection

  1. 如您所见,我没有每次都包含所有样本(无论是在测试集还是验证集中);
  2. ["2020-01-01"]在第一次和第二次验证中处于训练集,但不是第一次验证。

这让无能为力。PredefinedSplit()

我的问题是:如何定制这个拆分方案?最好保留它,因为我想将这个拆分方案传递到网格搜索中?sklearnGridSearchCV()

python pandas 机器学习 scikit-learn

评论


答:

0赞 Ben Reiniger 11/17/2023 #1

这本质上是 (docs) 的目的。TimeSeriesSplit


但是如果你想要更多的控制权,网格搜索和朋友的参数接受cv

可迭代的生成(训练、测试)拆分为索引数组。

因此,整数列表对的列表应该有效,例如

cv = [
    ([0, 1, 2, 3], [4, 5]),
    ([0, 1, 2, 3, 4, 5], [6, 7]),
    ...
]

(对于更大的示例,您应该能够使用生成器表达式和 来清理)。range