300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python 模型交叉验证法_使用交叉验证法(Cross Validation)进行模型评估

python 模型交叉验证法_使用交叉验证法(Cross Validation)进行模型评估

时间:2020-02-17 19:50:33

相关推荐

python 模型交叉验证法_使用交叉验证法(Cross Validation)进行模型评估

scikit-learn中默认使用的交叉验证法是K折叠交叉验证法(K-fold cross validation):它将数据集拆分成k个部分,再用k个数据集对模型进行训练和评分.

1.K折叠交叉验证法(K-fold cross validation)

############################# 使用交叉验证法对模型进行评估 #######################################

#导入红酒数据集

from sklearn.datasets import load_wine

#导入交叉验证工具

from sklearn.model_selection import cross_val_score

#导入用于分类的支持向量机模型

from sklearn.svm import SVC

#载入红酒数据集

wine = load_wine()

#设置SVC的核函数为linear

svc = SVC(kernel='linear')

#使用交叉验证法对SVC进行评分

scores = cross_val_score(svc,wine.data,wine.target,cv=3)

#打印结果

print('交叉验证得分:{}'.format(scores))

交叉验证得分:[0.83333333 0.95 ]

#使用.mean()来获得分数平均值

print('交叉验证平均分:{:.3f}'.format(scores.mean()))

交叉验证平均分:0.928

#设置cv参数为6

scores = cross_val_score(svc,wine.data,wine.target,cv=6)

#打印结果

print('交叉验证得分:\n{}'.format(scores))

交叉验证得分:

[0.86666667 0.9 0.93333333 0.96666667 1. 1. ]

#计算交叉验证平均分

print('交叉验证平均分:{:.3f}'.format(scores.mean()))

交叉验证平均分:0.944

#打印红酒数据集的分类标签

print('酒的分类标签:\n{}'.format(wine.target))

酒的分类标签:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

如果用不分层的K折叠的交叉验证法,那么在拆分数据集的时候,有可能每个子集中都是同一个标签,这样的话模型评分都不会太高,而分层k折叠交叉验证法的优势在于,它会在每个不同分类中进行拆分,确保每个子集中都有数量一致的不同分类的标签.

2.随机差分交叉验证(shuffle-split cross-validation)

#导入随机差分工具

from sklearn.model_selection import ShuffleSplit

#设置拆分的份数为10个

shuffle_split = ShuffleSplit(test_size=.2,train_size=.7,n_splits = 10)

#对拆分好的数据集进行交叉验证

scores = cross_val_score(svc,wine.data,wine.target,cv=shuffle_split)

#打印交叉验证得分

print('随机拆分交叉验证模型得分:\n{}'.format(scores))

#计算交叉验证平均分

print('随机拆分交叉验证平均分:{:.3f}'.format(scores.mean()))

随机拆分交叉验证模型得分:

[0.94444444 0.97222222 0.97222222 0.97222222 0.94444444 0.97222222

0.97222222 0.97222222 0.94444444 1. ]

随机拆分交叉验证平均分:0.967

3.一个一个试(leave-one-out)

其原理和k折叠交叉验证相似,不同的是,它把每一个数据点都当成一个测试集,所以测试集中有多少样本,它就要迭代多少次.针对于小数据集来说,其评分是最高的

#导入LeaveOneOut

from sklearn.model_selection import LeaveOneOut

#设置cv参数为leaveoneout

cv = LeaveOneOut()

#重新进行交叉验证

scores = cross_val_score(svc,wine.data,wine.target,cv=cv)

#打印迭代次数

print('打印迭代次数:{}'.format(len(scores)))

#打印评分结果

print('模型平均分:{:.3f}'.format(scores.mean()))

打印迭代次数:178

模型平均分:0.955

总结 :

我们为什么要使用交叉验证法?

当我们使用train_test_split方法进行数据集的拆分时,train_test_split用的是随机拆分的方法,万一我们拆分的时候,测试集中都是比较容易进行分类或者回归的数据,而训练集中都比较难,那么模型的得分就会偏高,反之模型的得分就会偏低.我们也不太可能把所有的random_state遍历一遍,而交叉验证法正好弥补了这个缺陷,它的工作原理导致它要对多次拆分进行评分再取平均值,这样就不会出现我们前面所说的问题了.

文章引自 : 《深入浅出python机器学习》

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。