在k交叉验证中,可以利用cv参数来调节cross_cal_score所使用的参数。但scikit-learn允许提供一个交叉验证分离器作为cv参数,来对数据划分过程进行更精细的控制。
对于大多数使用场景而言,回归问题默认的k折交叉验证与分类问题的分层k折交叉验证的表现都很好,但有些情况下可能希望使用不同的策略。比如,我们想要在一个分类数据集上使用标准k折交叉验证来重现别人的结果。为了实现这一点,我们首先必须从model_selection模块中导入KFold分离器类,并用我们想要使用的折数来将其实例化,并将kfold分离器对象作为cv参数传入cross_val_score:
from sklearn.datasets import load_iris
import mglearn.plots
import matplotlib.pyplot as plt
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
iris=load_iris()
kfold=KFold(n_splits=5)
logreg=LogisticRegression()
print('Cross-validation score:\n{}'.format(cross_val_score(logreg,iris.data,iris.target,cv=kfold)))
通过这种方法,我们可以验证,在iris数据集上使用不分层3折交叉验证确实是一个不好的注意:
kfold=KFold(n_splits=3)
logreg=LogisticRegression()
print('Cross-validation score:\n{}'.format(cross_val_score(logreg,iris.data,iris.target,cv=kfold)))
要知道,在iris数据集中,每个折对应一个类别,因此学不到任何内容。解决这个问题的另一个方法是将数据打乱来代替分层,以打乱样本按标签的顺序。可以通过将KFold的shuffle参数设为True来实现这一点。如果我们将数据打乱,那么还需要固定random_state以获得可重复的打乱结果。否则,每次运行cross_val_score将会得到不同的结果,因为每次使用的是不同的划分。
在划分数据之前将其打乱可以得到更好的结果:
kfold=KFold(n_splits=3,shuffle=True,random_state=0)
print('Cross-validation score:\n{}'.format(cross_val_score(logreg,iris.data,iris.target,cv=kfold)))
标签:iris,val,交叉,Python,kfold,cross,score,import,验证
From: https://blog.csdn.net/weixin_39407597/article/details/140104719