如何为训练模型创建自定义 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,您应该能够通过列表理解和 pandas
s 日期时间索引来做到这一点,例如:
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
这应该给你一个元组列表,每个元组首先包含一年中的所有样本,然后是下一年第一季度的所有样本。
我有一个 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,您应该能够通过列表理解和 pandas
s 日期时间索引来做到这一点,例如:
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
这应该给你一个元组列表,每个元组首先包含一年中的所有样本,然后是下一年第一季度的所有样本。