Python每日一记21>>>交叉验证

还记的前期我们对机器学习的数据集的划分都是利用train_test_split()将数据划分为训练集和测试集,而且各自的比例是我们指定的,但是这样具有的人为性可能导致模型的泛化能力不佳。
交叉验证就是为了解决这个问题:
1、简单交叉验证(K折交叉验证):其将数据集划分为几个部分(注意不是随即划分,而是依次划分),再进行建模和测试。如我们制定数据集划分为3个子集,分为1,2,3;然后对1和2建模,再在3上进行测试,得分取平均值;再对1,3建模,在2上测试,以此类推。这样得到的结果更具普遍性和随机性,模型的泛化能力就更佳。需要的函数是cross_val_score
form sklearn.model_selection import cross_val_score
form sklearn.datasets import load_iris
form sklearn.liner_model import LogisticRegression
data=load_iris()
logr=LogisticRegression()
score=cross_val_score(logr,data[‘data’],data[‘target’],cv=3)
print(score)
打印得分后,我们会得到三个得分,取平均值即可.
以上cross_val_score()中,cv指定子集个数。
需要记住的是,交叉验证不是构建可应用于新数据的模型的方法,其不会返回一个模型。在调用cross_val_score时,内部会构建多个模型,但交叉验证的目的知识评估给定算法在特定数据集上训练后的泛化能力,也就是说,没有预测的方法。当我们进行了交叉验证并且得分还OK的情况下,不需要对数据集划分成测试集和训练集,直接再次进行建模即可,建模后的数据就可以用于新数据集的预测。

下面再介绍其他交叉验证的方法
2、分层交叉验证
简单交叉验证的最大缺点就是,对于类别型标签,假如数据标签是【0,0,0,0,1,1,1,1,2,2,2,2】,分成三类的交叉验证会这样分【0,0,0,0】、【1,1,1,1】、【2、2、2、2】,那么这样的得分就会是0,这根本没什么意义。这就意味着,简单交叉验证方法失效了。
分层交叉验证能很好的解决这个问题,划分数据使得每个数据集中类别的比例与源数据集类别的比例一致。
当然我们不用过于担心,因为cross_val_score默认对分类变量使用分层k交叉验证,而对于回归模型默认使用简单K交叉验证。

之前的简单交叉也可以这样表示:
form sklearn.model_selection import K_Fold
form sklearn.model_selection import cross_val_score
form sklearn.datasets import load_iris
form sklearn.liner_model import LogisticRegression
data=load_iris()
logr=LogisticRegression()
kf=K_Fold(n_splits=5)
score=cross_val_score(logr,data[‘data’],data[‘target’],cv=kf)
print(score)
如果我们先要更加随即的交叉验证,那么可以kf=K_Fold(n_splits=5,shuffle=True,random_state=1)
这样划分数据集前,会打乱数据,避免出现简单交叉验证的错误。
3、其余的交叉验证还有留一法交叉验证、打乱划分交叉验证、分组交叉验证、各位可以自行去查看资料。

总之对于回归数据,简单交叉验证即可,对于分类数据,分层交叉验证或其他方法即可,推荐使用分层交叉验证或者简单交叉验证参数设置为shuffle=True。

猜你喜欢

转载自blog.csdn.net/weixin_44663675/article/details/88736723
今日推荐