算法笔记(20)交叉验证及Python代码实现

常用交叉验证法包括K折叠交叉验证法(K-fold cross validation)、随机拆分交叉验证法(shuffle-split cross validation)、挨个儿试试法(leave-one-out)。

算法笔记(20)交叉验证及Python代码实现_第1张图片

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

K折叠交叉验证法将数据集拆分成K个部分,再用K个数据集对模型进行训练和评分。例如K=5,则数据集被拆分成5个,其中第一个子集会被作为测试数据集,另外4个用来训练模型,之后再用第二个子集作为测试集,而另外4个用来训练模型,以此类推,直到把5个数据集全部用完,这样我们会得到5个模型的评分。模型最终的评分使用5个得分的平均分来计算。
分层K折叠交叉验证法:每个子集中都有数量基本一致的不同分类标签
不分层K折叠交叉验证法:每个子集可能都是同一个标签

wine = load_wine()
svc = SVC(kernel='linear')

scores = cross_val_score(svc, wine.data, wine.target, cv=6)
print('交叉验证得分:\n{}'.format(scores))
print('交叉验证平均分:{:.3f}'.format(scores.mean()))

交叉验证得分:
[ 0.86666667 0.9 0.93333333 0.96666667 1. 1. ]
交叉验证平均分:0.944
分析:cross_val_score默认使用3个折叠,可以通过cv参数指定K值,分类模型默认使用分层K折叠交叉验证法。

随机拆分交叉验证法(shuffle-split cross validation)

原理:先从数据集中随机抽一部分数据集作为训练集,再从其余的部分随机抽一部分作为测试集,进行评分后再迭代,重复上一步的动作,直到把我们希望迭代的次数全部跑完。

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))

随机拆分交叉验证模型得分:
[ 0.91666667 0.91666667 0.91666667 0.94444444 0.97222222 0.91666667
0.91666667 0.97222222 0.97222222 0.97222222]
分析:每次迭代测试集设置为数据集的20%,训练集设置为数据集的70%,并且把整个数据集拆分成10个子集,模型进行了10次评分,最终得分是10个分数的平均值。

挨个儿试试法(leave-one-out)

原理:把每一个数据点都当成一个数据集,数据集里面有多少样本就要迭代多少次,数据集大的话,耗时,数据集少的话,准确度高。

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更加消耗资源,而且速度要慢一些

想要完整代码的朋友,可toutiao搜索“编程研究坊”关注后s信我,回复“算法笔记20“获取

你可能感兴趣的:(算法,python,人工智能,机器学习,分类,人工智能)