如何为训练模型创建自定义 k 折交叉验证数据集

How to create custom k-fold cross validation datasets for training models

我有一个 daily 级别粒度的数据集,时间为 4 年 - 2018 年、2019 年、2020 年和 2021 年。还有一些数据可用于 2022 年第一季度,我将用作模型测试的未见数据。我想每年使用 K-fold 创建数据集,在其中我可以遍历每个折叠并训练模型并生成错误指标 -

这是我想要做的 - 培训数据 - 2018-01-01 至 2021-12-31 看不见的数据 - 2022-01-01 到 2022-03-31

根据训练数据,我想生成如下折叠 -

iteration 1 -
training data - 2018-01-01 to 2018-12-31, validation data - 2019-01-01 to 2019-03-31
iteration 2 -
training data - 2019-01-01 to 2019-12-31, validation data - 2020-01-01 to 2020-03-31
iteration 3 - 
training data - 2020-01-01 to 2020-12-31, validation data - 2021-01-01 to 2021-03-31

创建这些集合后,我就可以使用 training data 进行训练,使用 validation data 进行评估。我如何在 pandas 中执行此操作?

这是示例数据(出于保密目的隐藏了其他字段)-

Scitkit-learn 的 TimeSeriesSplit 将允许您生成定义大小的连续训练和测试折叠 - TimeSeriesSplit(max_train_size=365, test_size=91) 将产生一年的训练折叠和测试折叠(大约)四分之一(请注意,您将偏离日历年 1.25 days/year)

如果按照您的建议,仅在每年第一季度进行测试并不重要,那么这应该对您有用。如果您只想测试 Q1,您应该能够通过列表理解和 pandass 日期时间索引来做到这一点,例如:

years = np.arange(2018, 2021)

# set drop=False if you wish to retain the old index as a column
df = df.set_index("created_date", drop=True)  

df.index = pd.to_datetime(df.index)  # If it isn't already

cv_splits = [(df[f"{year}"], df[f"{year+1}-1":f"{year+1}-3"]) for year in years]

# returns a list of (train_df, test_df) tuples

这应该给你一个元组列表,每个元组首先包含一年中的所有样本,然后是下一年第一季度的所有样本。