资源经验分享使用交叉验证法(Cross Validation)进行模型评估

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

2019-12-04 | |  78 |   0

原标题:使用交叉验证法(Cross Validation)进行模型评估

原文来自:博客园      原文链接:https://www.cnblogs.com/weijiazheng/p/10963882.html


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

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的核函数为linear
svc = SVC(kernel='linear')
#使用交叉验证法对SVC进行评分
scores = cross_val_score(svc,wine.data,wine.target,cv=3)
#打印结果
print('交叉验证得分:{}'.format(scores))
交叉验证得分:[0.83333333 0.95 ]


1
2
#使用.mean()来获得分数平均值
print('交叉验证平均分:{:.3f}'.format(scores.mean()))
交叉验证平均分:0.928


1
2
3
4
#设置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.        ]


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
#设置拆分的份数为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折叠交叉验证相似,不同的是,它把每一个数据点都当成一个测试集,所以测试集中有多少样本,它就要迭代多少次.针对于小数据集来说,其评分是最高的


1
2
3
4
5
6
7
8
9
10
#导入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机器学习》


免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com


上一篇:使用网格搜索优化模型参数

下一篇:K-近邻算法(KNN)

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...

  • 反向传播是什么?

    深度学习系统能够学习极其复杂的模式,它们通过调...