0%

数据分割之KFold,StratifiedKFold,RepeatedKFold

n折交叉验证数据分割

KFold

首先看官网对这个类的定义(括号中均为默认参数)

1
class sklearn.model_selection.KFold(n_splits=5, *, shuffle=False, random_state=None)

KFold返回的是索引,共有三个参数:

n_splits,n折交叉验证,作者一般取10。

shuffle,洗牌的意思。若shuffle=False,则返回的测试集索引连续且固定。比如我们有50个样本,若采用十折交叉验证,则返回的测试集索引依次为,0-4,5-9……,代码实例于下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.model_selection import KFold,StratifiedKFold,RepeatedKFold
import pandas as pd
import numpy as np

#导入有50个样本的数据集
df = pd.read_excel('raw_org_0.xlsx')
y = df['Ads_En']
data = np.array(df)

kf = KFold(n_splits=10, shuffle=False)
for n, index in enumerate(kf.split(data)):
print('-----第{}组测试集索引为:-----'.format(n+1))
print(index[1])
print('-----第{}组训练集索引为:-----'.format(n+1))
print(index[0])

(后续为了解释方便将不打印出训练集系数)

shuffle=True,则返回的测试集索引随机且不连续。仍以50个样本为例,若采用十折交叉验证,代码实例于下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.model_selection import KFold,StratifiedKFold,RepeatedKFold
import pandas as pd
import numpy as np

#导入有50个样本的数据集
df = pd.read_excel('raw_org_0.xlsx')
y = df['Ads_En']
data = np.array(df)

kf = KFold(n_splits=10,shuffle=True)
for n, index in enumerate(kf.split(data)):
print('-----第{}组测试集索引为:-----'.format(n+1))
print(index[1])

第一次运行结果:

第二次运行结果:

可以看出当参数shuffle=True,每次返回的索引值都不同。

random_state:在shuffle=False时没有意义。在shuffle=True时,设置成一个数字会使每次生成的随机数字相同,还以之前的50个样本的数据集为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.model_selection import KFold,StratifiedKFold,RepeatedKFold
import pandas as pd
import numpy as np

#导入有50个样本的数据集
df = pd.read_excel('raw_org_0.xlsx')
y = df['Ads_En']
data = np.array(df)

kf = KFold(n_splits=10,shuffle=True,random_state=10)
for n, index in enumerate(kf.split(data)):
print('-----第{}组测试集索引为:-----'.format(n+1))
print(index[1])

第一次运行结果:

第二次运行结果:

StratifiedKFold

1
class sklearn.model_selection.StratifiedKFold(n_splits=5, *, shuffle=False, random_state=None)

参数与KFold中的参数相同,唯一不同是“The folds are made by preserving the percentage of samples for each class.” 即划分后的训练集和验证集中类别分布尽量和原数据集一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold

X = np.array([[10, 1], [20, 2], [30, 3], [40, 4], [50,5], [60,6], [70,7],[80,8],[90,9],[100,10],
[110, 1], [120, 2], [130, 3], [140, 4], [150,5], [160,6], [170,7],[180,8],[190,9],[200,10]])
# 两个类别:2:3
Y2 = np.array([1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2])

kfolds = KFold(n_splits=4, shuffle=False)

for n, val_idx in enumerate(kfolds.split(X, Y2),start=1):
print('Y数据比例是2:3,kfold划分测试集{}结果{}'.format(n,Y2[val_idx[1]]))

print('------------我是分割线------------')
skf = StratifiedKFold(n_splits=4, shuffle=False)

for n, val_idx in enumerate(skf.split(X, Y2),start=1):
print('Y数据比例是2:3,StratifiedKFold划分测试集{}结果{}'.format(n,Y2[val_idx[1]]))

RepeatedKFold

1
class sklearn.model_selection.RepeatedKFold(*, n_splits=5, n_repeats=10, random_state=None)

生成的一定是随机的,只不过是加了重复的次数