查看原文
其他

数据集的划分——交叉验证法

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王 歌 

文字编辑:戴 雯 

技术总编:张 邯



Python云端培训课程火热招生中~

      重大通知!!!爬虫俱乐部于2020年7月11日至14日在线上举行为期四天的Stata编程技术定制培训,招生工作已经圆满结束啦!!!

      另外,应广大学员需求,爬虫俱乐部将于2020年7月25日至28日线上举行Python编程技术训练营,本次培训采用理论与案例相结合的方式,帮助大家在掌握Python基本思想的基础上,学习科学计算技术与网络数据抓取技术,详情可点击《Python云端培训课程开始报名~》,或点击文末阅读原文直接提交报名信息呦~

导读



前面我们在举例时,通常是将所使用的数据集按照75%和25%的比例划分为训练集和测试集,这主要是为了我们举例方便,同时划分后的数据量也依然符合大样本的要求。其实在机器学习中还有其他划分数据集的方法,可以在本身数据总量就比较小时使模型达到很好的效果,我们今天介绍的交叉验证法就是比较常用的方法,它在我们将要介绍的集成学习的Stacking算法中经常使用到。

1方法介绍

我们往往会得到多个模型,而最终选择的模型必定是泛化能力强,也就是在未知的新数据上效果最好的模型,因此我们在训练模型前就要将我们所掌握的数据进行划分,严格来说一般会划分为训练集、验证集和测试集,在训练集上进行训练模型,在验证集上试验效果、调整参数设置,在测试集上进行最终的测试。为了保证最终的效果,这三个集合不能有交集,常见的比例是8:1:1。当然,通常我们只有训练集和测试集也是可以的,前面我们使用的样例数据集只有几百个,因此也没有划分验证集。我们所使用的train_test_split属于留出法,也就是随机将一部分数据作为训练集,剩下的作为测试集。但对样本信息的利用往往不充分,并且需要的样本量较大。如果我们本身样本量有限,并且想充分利用数据集中的信息,我们可以采用交叉验证法。
交叉验证法是将数据集划分为k个大小相似的互斥子集,并在划分时保持数据分布的一致性,每次用k-1个子集的并集作为训练集,剩余的做测试集,进行k次训练,最后取k次结果的均值。该方法依赖于k值的选取,通常取10,因此也称为k折交叉验证(k-fold-cross-validation),当k=1时称为留一法(Leave-One-Out)。由于留一法在样本量大时计算量较大,所以主要用于样本量比较少的情况。在实际应用中,我们只进行一次交叉验证可能是不够的,而要进行多次,称为p次k折交叉验证,一般取p=k=10。以上方法在sklearn中都有相应的类来实现,我们下面来看一下。

2程序实现

       我们这里依然使用的是鸢尾花的数据,同时使用Logistic回归训练模型。在sklearn中,通常使用 cross_val_predict实现k折交叉验证,它返回的是一个使用交叉验证以后的输出值,若要返回准确度评分,可以使用 cross_val_score。两者参数相同,第一个参数为所使用的分类器,第二个和第三个参数分别是属性值和标签值,最后一个参数 cv确定折数。我们这里进行5折的交叉验证,程序如下:

from sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score, cross_val_predictiris_sample = load_iris()x = iris_sample.datay = iris_sample.targetlrclf = LogisticRegression()predicted = cross_val_predict(lrclf, x, y, cv=5) #计算预测值print('5折交叉验证预测值:', predicted)scores = cross_val_score(lrclf, x, y, cv=5) #计算模型的评分情况print('评分:', scores)print('准确度:', metrics.accuracy_score(predicted, y)) #计算评分的均值
结果如下:

       若使用留一法,则要使用 LeaveOneOut类,没有参数需要设置。具体程序如下:

from sklearn.model_selection import LeaveOneOutloo = LeaveOneOut()scores = cross_val_score(lrclf, x, y, cv=loo)predicted = cross_val_predict(lrclf, x, y, cv=loo)print('留一法预测值:', predicted)scores = cross_val_score(lrclf, x, y, cv=loo)print('评分:', scores)print('准确度:', metrics.accuracy_score(predicted, y)
结果如下:

       假设进行5次5折交叉验证,我们使用 RepeatedKFold类,有三个参数:

(1) n_split表示要划分的折数;

(2) n_repeats表示重复几次;

(3) random_state设置随机种子。

程序如下:
from sklearn.model_selection import RepeatedKFoldkf = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0) #种子设为0predicted = cross_val_predict(lrclf, x, y, cv=5)print('5次5折交叉验证预测值:', predicted)scores = cross_val_score(lrclf, x, y, cv=kf)print('评分:', scores)print('准确度:', metrics.accuracy_score(predicted, y))
结果如下:

       在sklearn中还提供了许多其它交叉验证的类,比如使用 ShuffleSplit类可以随机的把数据打乱,然后分为训练集和测试集;对于时间序列的数据,可以使用 TimeSeriesSplit;若要实现分层抽样式的交叉验证,可以使用 StratifiedKFold;分层随机划分可以使用 StratifiedShuffleSplit,等等,大家可以根据自己的需要来选择合适的交叉验证方式。

以上就是本期推文的全部内容啦,感兴趣的小伙伴快动手试试吧~






对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
大数据视角下的大学录取分数排行
集成学习介绍之二——Boosting算法

PDF文本信息提取(二)

取长补短、互通有无 ——集成学习介绍之Bagging &随机森林
PDF表格信息提取
神经网络——brain
marktouse标记使用变量
换种视角看问题——支持向量机(SVM)
提取PDF文本信息:入门
毕业季|b站《入海》评论爬取
Stata云端课程来啦
利用广义线性模型实现的分类——Logistic回归
Requests get爬虫之设置headers
数据分析薪资待遇如何?——跟我来,带你看
Vardistinct一键去重计数
从statsmodels到线性回归
Pandas的GroupBy机制

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存