我使用以下代码来测试KFold
和StratifiedKFold
。
import numpy as npfrom sklearn.model_selection import KFold,StratifiedKFoldX = np.array([ [1,2,3,4], [11,12,13,14], [21,22,23,24], [31,32,33,34], [41,42,43,44], [51,52,53,54], [61,62,63,64], [71,72,73,74]])y = np.array([0,0,0,0,1,1,1,1])sfolder = StratifiedKFold(n_splits=4,random_state=0,shuffle=False)floder = KFold(n_splits=4,random_state=0,shuffle=False)for train, test in sfolder.split(X,y): print('Train: %s | test: %s' % (train, test))print("StratifiedKFold done")for train, test in floder.split(X,y): print('Train: %s | test: %s' % (train, test))print("KFold done")
我发现StratifiedKFold
能够保持标签的比例,而KFold
则不能。
Train: [1 2 3 5 6 7] | test: [0 4]Train: [0 2 3 4 6 7] | test: [1 5]Train: [0 1 3 4 5 7] | test: [2 6]Train: [0 1 2 4 5 6] | test: [3 7]StratifiedKFold doneTrain: [2 3 4 5 6 7] | test: [0 1]Train: [0 1 4 5 6 7] | test: [2 3]Train: [0 1 2 3 6 7] | test: [4 5]Train: [0 1 2 3 4 5] | test: [6 7]KFold done
看起来StratifiedKFold
更好,那么KFold
就不应该使用了吗?
在什么情况下应该使用KFold
而不是StratifiedKFold
?
回答:
我认为你应该问“在什么情况下应该使用StratifiedKFold而不是KFold?”。
你需要先了解什么是“KFold”和“Stratified”。
KFold是一种将数据集划分为k个部分的交叉验证器。
Stratified确保数据集的每个部分都具有相同比例的特定标签的观察值。
因此,这意味着StratifiedKFold是KFold的改进版本
所以,这个问题的答案是在处理类别分布不平衡的分类任务时,我们应该优先选择StratifiedKFold而不是KFold。
例如
假设有一个包含16个数据点的数据集,并且类别分布不平衡。在该数据集中,12个数据点属于类别A,其余(即4个)属于类别B。类别B与类别A的比例为1/3。如果我们使用StratifiedKFold并设置k = 4,那么在每次迭代中,训练集将包括来自类别A的9个数据点和来自类别B的3个数据点,而测试集将包括来自类别A的3个数据点和来自类别B的一个数据点。
正如我们所见,StratifiedKFold在划分中保留了数据集的类别分布,而KFold则不考虑这一点。