Python scikit学习KFold函数不均匀训练,测试拆分

数据挖掘 Python 交叉验证
2022-02-24 22:46:23

我在下面有以下代码,我注意到火车的长度,Kfold.split() 的测试拆分对于最后一个折叠是不同的。任何可能发生这种情况的原因以及我如何解决它?,谢谢。

from sklearn.model_selection import KFold

data = np.arange(0,47, 1)

kfold = KFold(6) # init for 6 fold cross validation
for train, test in kfold.split(data): # split data into train and test
    print("train size:",len(train), "test size:",len(test))

示例代码输出

1个回答

你会期待什么样的行为?这种差异仅仅是因为样本数量不能均匀分布在您提供的折叠数量上。您的数据集中有 47 个样本,并且希望将其拆分为 6 折以进行交叉验证。47/6=756,这意味着每个折叠中的测试数据集将包含756样本,这是不可能的,因为只能包含完整的样本。结果,您将看到 6 次中有 5 次测试集将包含 8 个样本,而 6 次中的 1 次测试集将包含单个样本,以达到平均756测试集中的样本:568+167=756. 如果您将数据集中的样本数增加到可被 6 整除的数字(例如 48),您将看到测试集中的样本数将保持不变,因为将 48 除以 6 将得到一个整数而不是十进制数。

from sklearn.model_selection import KFold
import numpy as np

data = np.arange(0,48, 1)

kfold = KFold(6)
for train, test in kfold.split(data):
    print("train size:",len(train), "test size:",len(test))

# train size: 40 test size: 8
# train size: 40 test size: 8
# train size: 40 test size: 8
# train size: 40 test size: 8
# train size: 40 test size: 8
# train size: 40 test size: 8