sklearn中的KFold简单介绍

这一部分主要讲解关于什么是K-foldCV(K折交叉验证),简单的使用一些案例进行分析,然后使用sklearn库函数中一些简单的案例进行分析。

在机器学习中,多数最主要的功能函数被封装到sklearn的库函数中,model_selection类中包含了K-foldCV的简单使用,可以直接使用这个进行调用。

一.关于K-Fold的简单介绍

  交叉验证就是将得到的数据集样本进行不同程度的切分,从而组合得到不同的训练集和测试集,使用训练集来训练模型,用测试集来评估模型预测的好坏。

  交叉验证通过重复使用数据,更进一步验证数据的准确性,一般数据量不大的时候会被用来使用,防止过拟合。

  使用交叉验证进行多次切分,可得到多组不同的训练集和测试集,训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

  目前交叉验证主要是一下几种:

  1.K-Fold Cross Valadation

  K折交叉验证会把样本数据随机的分成K份(一般是均分),每次随机的选择K-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择K-1份来训练数据。若干轮(小于K)之后,选择损失函数评估最优的模型和参数。

  将每个子集数据分别做一次测试集,其余的K-1组子集数据作为训练集,所以一般分成K份就这样会得到K组模型,用这K个模型最终的测试集的分类准确率的平均数作为此K-CV下分类器的性能指标。

  优点是可以降低由一次随机划分带来的偶然性,提高其泛化能力。但K折还有个问题就是因为是随机划分,很有可能划分的过程中刚好把类别都划分开了,比如第一折训练集里全是0标签,第二折测试集里全是1标签,这样对模型训练就不太好,在其中的某个模型学习的时候就没有学习到测试集的分类特征。在KFold中就是这样的,对于不平衡数据集,特别是一些比赛数据正类非常少,那么直接用KFold就可能出现这种问题。

  2.StratifiedKFold

  对非平衡数据可以用分层采样StratifiedKFold,就是在每一份子集中都保持和原始数据集相同的类别比例。若数据集有4个类别,比例是2:3:3:2,则划分后的样本比例约是2:3:3:2,StratifiedShuffleSplit() 划分中每个类的比例和完整数据集中的相同,若数据集有4个类别,比例是2:3:3:2,则划分后的样本比例也是2:3:3:2

二.代码示例

from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold

kfolder = KFold(n_splits=4,random_state=1)
for train, test in kfolder.split(X,y):
    print('Train: %s | test: %s' % (train, test),'\n')
>>>
Train: [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]

folder = StratifiedKFold(n_splits=4,random_state=0)
for train, test in sfolder.split(X,y):
    print('Train: %s | test: %s' % (train, test))
>>>
Train: [1 3 4 5 6 7] | test: [0 2]
Train: [0 2 4 5 6 7] | test: [1 3]
Train: [0 1 2 3 5 7] | test: [4 6]
Train: [0 1 2 3 4 6] | test: [5 7]

 

posted @ 2023-04-28 22:32  醉情梦短  阅读(274)  评论(0编辑  收藏  举报