k折交叉验证
不同于train_test_split,将数据划分为训练集和测试集。5折交叉验证,将数据划分为(大致)相等的5部分,使用第1折作为测试集,其他折(2-5)作为训练集,得到一个精度,依次,使用第2折作为测试集,其他折(1、3、4、5)作为训练集,共得到5个精度,取平均值即得到模型精度,这样得到的模型精度更准确。通常来说,数据的前五分之一是第一折,第二个五分之一是第二折,以此类推。k折交叉验证,默认是3折,通常取5或10折。
sklearn是利用model_selection模块中的cross_val_score函数来实现交叉验证的,参数是选的模型、x和y、折数,输出模型精度。
from sklearn.model_selection import cross_val_score
print(cross_val_score(模型,x,y,cv=5))
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris=load_iris()
logreg=LogisticRegression()
scores=cross_val_score(logreg,iris.data,iris.target,cv=5)
print(scores)
print(scores.mean())
输出
输出5个精度,并对精度求平均。
分层k折交叉验证
print(iris.target)
输出
如你所见,数据的前三分之一是类别0,中间三分之一是类别1,最后三分之一是类别2。如果在这个数据集上进行3折交叉验证,第一折只包含类别0,第二折只包含类别1,第三折只包含类别2,得到的精度是不正确的。所以在分类问题中不使用简单的k折交叉验证,而是使用分层k折交叉验证,每个折中类别的比例和整个数据集中的比例相同,可以通过将kfold的shuffle参数设为True来实现。
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris=load_iris()
logreg=LogisticRegression()
kfold=KFold(n_splits=3,shuffle=True,random_state=0)
scores=cross_val_score(logreg,iris.data,iris.target,cv=kfold)
print(scores)
print(scores.mean())
输出