原标题:使用交叉验证法(Cross Validation)进行模型评估
原文来自:博客园 原文链接:https://www.cnblogs.com/weijiazheng/p/10963882.html
1.K折叠交叉验证法(K-fold cross validation)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from sklearn.datasets import load_wine
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
wine = load_wine()
svc = SVC(kernel = 'linear' )
scores = cross_val_score(svc,wine.data,wine.target,cv = 3 )
print ( '交叉验证得分:{}' . format (scores))
|
交叉验证得分:[0.83333333 0.95 ]
1 2 | print ( '交叉验证平均分:{:.3f}' . format (scores.mean()))
|
交叉验证平均分:0.928
1 2 3 4 | 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. ]
1 2 | print ( '交叉验证平均分:{:.3f}' . format (scores.mean()))
|
交叉验证平均分:0.944
1 2 | 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)
1 2 3 4 5 6 7 8 9 10 | from sklearn.model_selection import ShuffleSplit
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折叠交叉验证相似,不同的是,它把每一个数据点都当成一个测试集,所以测试集中有多少样本,它就要迭代多少次.针对于小数据集来说,其评分是最高的
1 2 3 4 5 6 7 8 9 10 | from sklearn.model_selection import 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机器学习》
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com