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

本文作者:王 歌
文字编辑:戴 雯
技术总编:张 邯

前面我们在举例时,通常是将所使用的数据集按照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_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score, cross_val_predict
iris_sample = load_iris()
x = iris_sample.data
y = iris_sample.target
lrclf = 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)) #计算评分的均值

结果如下:

5ee9e7ca7d03ed9b3b827bf089d9a1ab.png

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

from sklearn.model_selection import LeaveOneOut
loo = 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))

结果如下:

25bb0ea7d031196cca3c58f01fc5103d.png

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

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

(2) n_repeats表示重复几次;

(3) random_state设置随机种子。

程序如下:

from sklearn.model_selection import RepeatedKFold
kf = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0) #种子设为0
predicted = 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))

结果如下:

ce434adc3ce87fe8525485284ebaf912.png

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

今天的内容就分享到这里啦,感兴趣的小伙伴快动手试试吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第29套)

第29套: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函 数fun的功能是对形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。 例如: b所指变量t中的学号、姓名、和三门课的成绩依次是: 10002、 “ZhangQi”、…

思科CCIE认证知识点之IPv6地址

IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议。 一、IPV6的地址: IPv6 地址共 128位,通过 8 个十六进制的地址块格式来…

python实现50行代码_50行Python代码,教你获取公众号全部文章

> 本文首发自公众号:python3xxx 爬取公众号的方式常见的有两种 - 通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章 - 通过微信公众号的素材管理,获取公众号文章。缺点是需要申请自己的公众号。 ![图片描述](//img.mukewang.com/5d21…

java部署平台_开源Java自动化部署平台JDeploy

JDeploy是Java Shell实现的基于Linux系统的自动化、可视化的项目部署平台,能部署Java服务、Java Web项目,可以简化项目部署操作,无需繁琐的黑窗口SSH指令及Jenkins复杂的配置。传统部署方式:从SVN/GIT服务器检出代码->在IDE中…

A*算法在最短路问题的应用及其使用举例

1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: 其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。另外定义h(n…

全国计算机等级考试题库二级C操作题100套(第30套)

第30套: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。例如:a所指变量中…

pytorch 使用cpu_想读读PyTorch底层代码?这份内核机制简介送给你

机器之心报道参与:思源学习 PyTorch 比较简单,但你能学习 PyTorch 内部机制吗?最近,有 14 年 ML 经验的大神 Christian 介绍了 PyTorch 的内核机制。虽然在实际使用中并不需要这些知识,但探索 PyTorch 内核能大大提升我…

java web 自定义标签_JavaWeb学习——自定义标签

自定义标签一、自定义标签概述使用标准JSP访问、操作JavaBean,是实现展现(HTML)与业务实现(Java代码)分离的第一步。然而,标准方法功能不够强大,以至于开发者无法仅仅使用它们开发应用,还要在JSP页面中使用Java代码。介于JavaBean…

739. Daily Temperatures - LeetCode

Question 739. Daily Temperatures Solution 题目大意:比今天温度还要高还需要几天 思路:笨方法实现,每次遍历未来几天,比今天温度高,就坐标减 Java实现: public int[] dailyTemperatures(int[] temperatur…

全国计算机等级考试题库二级C操作题100套(第31套)

第31套: 给定程序中,函数fun的功能是:对形参s所指字符串中下标为奇数的字符按ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符数组中,形成一个新串。 例如,形参s所指的…

Android 抽屉效果Demo

2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo。 转载:http://www.adobex.com/android/source/details/00000110.htm 转载于:https://my.oschina.net/androidcode/blog/103821

python 连接mysql_python连接MySQL

首先,要安装好MySQL,结果我给忘了。。 应该是这个,我还在下载:http://dev.mysql.com/downloads/file.php?id458460 然后,python要安装连接MySQL的包。 使用pypi下载,名字叫做MySQL-python。 然而pypi官方源…

W4_python_decorator_generator_Iteratable_Iterator_json_pickle

W4_python_decorator_generator_Iteratable_Iterator 50.第03章节-Python3.5-装饰器详解51.第04章节-Python3.5-装饰器应用详解52.第05章节-Python3.5-装饰器之函数即变量53.第06章节-Python3.5-装饰器之高阶函数54.第07章节-Python3.5-装饰器之嵌套函数55.第08章节-Python3.5-…

全国计算机等级考试题库二级C操作题100套(第32套)

第32套: 给定程序中,函数fun的功能是:在形参ss所指字符串数组中,将所有串长超过k的字符串中右边的字符删除,只保留左边的k个字符。ss所指字符串数组中共有N个字符串,且串长小于M。 请在程序的下划线处填入正确的内容并…

DIV中文字不换行解决办法

解决办法如下:word-wrap : normal | break-word设置或检索当当前行超过指定容器的边界时是否断开转行。normal:控制连续文本换行。break-word:内容将在边界内换行。如果需要,词内换行(word-break&#xff0…

python竞赛试题及答案_竞赛信息 | 蓝桥杯大赛Python组

蓝桥杯大赛 青少年创意编程Python组 竞赛规则及样题 — 竞赛规则 — 1 竞赛时长 Python编程组竞赛的选拔赛、省赛及国赛,竞赛时长均为120分钟,详细赛程安排另行通知。 2 竞赛形式 竞赛形式为个人赛,一人一机。 选手须自带笔记本计算机&#x…

全国计算机等级考试题库二级C操作题100套(第33套)

第33套: 给定程序的功能是:调用函数fun将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值为1,失败时返回值为0。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中&#…

Civil 3D 中使用COM API导入DEM数据创建曲面

Civil 3D提供的基于.net的API和基于COM的API,现在推荐大家使用.net API,但有时也需要使用COM API。 这个例子演示如何使用COM API来导入DEM数据生成Civil 3D曲面。 Civil 3D开发中使用COM API需要添加的引用比较啰嗦,建议使用向导创建项目简化操作&#…

牛客网第4场A

链接:https://www.nowcoder.com/acm/contest/142/A 来源:牛客网题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a ternary string s which can self-reproduce. Every second, a digit 0 is i…

全国计算机等级考试题库二级C操作题100套(第34套)

第34套&#xff1a; 用筛选法可得到2&#xff5e;n&#xff08;n<10000&#xff09;之间的所有素数&#xff0c;方法是&#xff1a;首先从素数2开始&#xff0c;将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0)&#xff1b;接着从数 表中找下一个非0数&#xff…