大数据-197 数据挖掘 机器学习理论 - scikit-learn 泛化能力 交叉验证

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(正在更新…)

章节内容

上节我们完成了如下的内容:

  • scikit-learn 算法库实现
  • 案例1 红酒
  • 案例 2 乳腺癌

在这里插入图片描述

交叉验证

确定了 K 之后,我们还能够发现一件事情,每次运行的时候学习曲线都在变化,模型的效果有时好有时坏,这是为什么?
实际上,这都是由于【训练集】和【测试集】的划分不同造成的,模型每次都使用不同的训练集进行训练,不同的测试集进行测试,自然也就有不同的结果。
在业务中,我们训练数据往往都是以往已经有的历史数据,但我们的测试数据却是新进入系统的数据,我们追求模型的效果,但是追求的是模型在未知数据集上的效果,在陌生的数据集上表现的能力被称为泛化能力,即我们追求的是模型的泛化能力。

泛化能力

我们在进行学习的时候,通常会将一个样本集分化为【训练集】和【测试集】,其中训练集用于模型的学习和训练,而后测试集通常用于评估训练好的模型对于数据的预测性的评估。

  • 训练误差代表模型在训练集上的错分样本比率。
  • 测试误差代表模型在测试集上的错分样本比率。

训练误差的大小,用来判断给定问题是不是一个容易学习的问题,测试误差反应了模型对未知数据的预测能力,测试误差小的学习方法具有很好的预测能力,如果得到的训练集和测试集没有交集,通常将此预测能力称为泛化能力(generalization ability)。
我们认为,如果模型在一套训练集和数据集上表现优秀,那说明不了问题,只能在众多不同的训练集和测试集上都表现优秀,模型才是一个稳定的模型,模型才是具有真正意义上的泛化能力。
为此,机器学习领域有发挥神作用的技能:【交叉验证】,来帮助我们认识模型。

k折交叉验证

最常用的交叉验证是 K 折交叉验证,我们知道训练集和测试集的划分会干扰模型的结果,因此用交叉验证 N 次的结果求出均值,是对模型效果的一个更好的度量。

在这里插入图片描述

带交叉验证的学习曲线

对于带交叉验证的学习曲线,我们需要观察的就不仅仅是最高的准确率了,而是准确率高且方差还相对较小的点,这样的点泛化能力才是最强的,在交叉验证+学习曲线的作用下,我们选出的超参数能够保证更好的泛化能力。

from sklearn.model_selection import cross_val_score as CVS
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.2,random_state=420)
clf = KNeighborsClassifier(n_neighbors=8)
#训练集对折6次,一共6个预测率输出
cvresult = CVS(clf,Xtrain,Ytrain,cv=6) 
#每次交叉验证运行时估算器得分的数组
cvresult 

执行结果如下:
在这里插入图片描述
查看均值、方差

# 均值:查看模型的平均效果
cvresult.mean()
# 方差:查看模型是否稳定
cvresult.var()

执行结果如下所示:
在这里插入图片描述
绘制图片进行查看:

score = []
var = []
#设置不同的k值,从1到19都看看
krange=range(1,20) 
for i in krange:clf = KNeighborsClassifier(n_neighbors=i)cvresult = CVS(clf,Xtrain,Ytrain,cv=5)# 每次交叉验证返回的得分数组,再求数组均值score.append(cvresult.mean()) var.append(cvresult.var())plt.plot(krange,score,color='k')
plt.plot(krange,np.array(score)+np.array(var)*2,c='red',linestyle='--')
plt.plot(krange,np.array(score)-np.array(var)*2,c='red',linestyle='--')

运行结果如下:
在这里插入图片描述
输出的图片如下所示:
在这里插入图片描述

是否需要验证集

最标准,最严谨的交叉验证应该有三组数据:训练集、验证集和测试集。当我们获取一组数据之后:

  • 先将数据集分成整体的训练集和测试集
  • 然后我们把训练集放入交叉验证中
  • 从训练集中分割更小的训练集(k-1 份)和验证机(1 份)
  • 返回的交叉验证结果其实是验证集上的结果
  • 使用验证集寻找最佳参数,确认一个我们认为泛化能力最佳的模型
  • 将这个模型使用在测试集上,观察模型的表现

通常来说,我们认为经过验证集找出最终参数后的模型的泛化能力是增强了的,因此模型在未知数据(测试集)上的效果会更好,但尴尬的是,模型经过交叉验证在验证集上的调参之后,在测试集上的结果没有变好的情况时有发生。

原因其实是:

  • 我们自己分的训练集和测试集,会影响模型的效果
  • 交叉验证后的模型的泛化能力增强了,表现它在未知数据集上方差更小,平均水平更高,但却无法保证它在现在分出来的测试集上预测能力最强
  • 如此来说,是否有测试集的存在,其实意义不大

如果我们相信交叉验证的调整结果是增强了模型的泛化能力,那即便测试集上的测试结果并没有变好(甚至变坏),我们也认为模型是成功的。
如果我们不相信交叉验证的调整结果能够增强模型的泛化能力,而一定要依赖测试集来进行判断,我们完全没有进行交叉验证的必要,直接用测试集上的结果用来跑学习曲线就好了。
所以,究竟是否需要验证集,其实是存在争议的,在严谨的情况下,大家还是使用了有验证集的方式。

其他交叉验证

交叉验证的方法不止“K 折”一种,分割训练集和测试集的方法也不止一种,分门别类的交叉验证占据了 sklearn 中非常长的一章。
所有的交叉验证都是在分割训练集和测试集,只不过侧重的方向不同。

  • K 折就是按顺序取训练集和测试集
  • ShuffleSpilt 就侧重于让测试集分布在数据的全方位之内
  • StratifiedKFold 则认为训练数据和测试数据必须在每个标签分类中占有相同的比例

各类交叉验证的原理繁琐,大家在机器学习的道路上一定会逐渐遇到更难的交叉验证,但是万变不离其宗:本质上交叉验证是为了解决训练集和测试集的划分对模型带来的影响,同时检测模型的泛化能力。

在这里插入图片描述

交叉验证的折数不可太大,因为折数越大抽出来的数据集越小,训练数据所带来的信息量就会越小,模型会越来越不稳定。

避免折数太大

如果你发现不使用交叉验证的时候模型表现很好,一使用校验验证模型的效果就骤降

  • 一定要查看你的标签是否有顺利
  • 然后就是查看你的数据量是否太小,折数是否太高

如果将上面例题的代码中将 cv 将 5 改成 100,代码如下所示:

score = []
var = []
#设置不同的k值,从1到19都看看
krange=range(1,20) 
for i in krange:clf = KNeighborsClassifier(n_neighbors=i)cvresult = CVS(clf,Xtrain,Ytrain,cv=100)# 每次交叉验证返回的得分数组,再求数组均值score.append(cvresult.mean()) var.append(cvresult.var())plt.plot(krange,score,color='k')
plt.plot(krange,np.array(score)+np.array(var)*2,c='red',linestyle='--')
plt.plot(krange,np.array(score)-np.array(var)*2,c='red',linestyle='--')

生成图片如下图所示:
在这里插入图片描述

折数过大:

  • 运算效率变慢
  • 预测率方差变大,难以保证在新的数据集达到预期预测率

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构-复杂度

从本期开始,我们将开始数据结构的学习,我会定期将我学习的内容这里上传到博客中,欢迎大家和我一起学习! 一、什么是数据结构和算法 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种…

Kubernetes中的secrets存储

华子目录 2.secrets2.1secrets功能介绍2.2secrets的创建2.2.1从文件创建2.2.2编写yaml文件 2.3secret的使用案例2.3.1将secret挂载到volume中2.3.2设置子目录映射secret密钥2.3.3将secret设置为环境变量2.3.4存储docker register的认证信息spec.imagePullSecrets[] 2.secrets …

Java已死,大模型才是未来?

作者:不惑_ 引言 在数字技术的浪潮中,编程语言始终扮演着至关重要的角色。Java,自1995年诞生以来,便以其跨平台的特性和丰富的生态系统,成为了全球范围内开发者们最为青睐的编程语言之一 然而,随着技术的…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在医疗资源日益紧张的背景下&#xff0…

Mac下载 安装MIMIC-IV 3.0数据集

参考blog MIMIC IV 3.0数据库安装方法_mimic数据下载-CSDN博客 MIMIC IV数据库安装&#xff08;二&#xff09;_mimic数据库安装-CSDN博客 MIMIC-IV3.0安装_mimic iv 3.0-CSDN博客 MIMIC-IV-v2.0安装教程_mimic iv 安装教程-CSDN博客 MIMIC IV 3.0数据库安装方法或者思路&…

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

UI 组件的二次封装

UI 组件的二次封装是指&#xff0c;在基础 UI 库的组件上进行自定义封装&#xff0c;以实现更贴合业务需求的功能和样式。通过二次封装&#xff0c;可以增强组件的复用性、便捷性和一致性&#xff0c;简化业务代码&#xff0c;同时降低后续维护成本。 1. 二次封装的原理 二次…

Redis高级篇之缓存一致性详细教程

文章目录 0 前言1.缓存双写一致性的理解1.1 缓存按照操作来分 2. 数据库和缓存一致性的几种更新策略2.1 可以停机的情况2.2 我们讨论4种更新策略2.3 解决方案 总结 0 前言 缓存一致性问题在工作中绝对没办法回避的问题&#xff0c;比如&#xff1a;在实际开发过程中&#xff0c…

python爬虫实现自动获取论文GB 7714引用

在写中文论文、本硕博毕业设计的时候要求非常严格的引用格式——GB 7714引用。对于普通学生来说都是在google scholar上获取&#xff0c;一个一个输入点击很麻烦&#xff0c;就想使用python完成这个自动化流程&#xff0c;实现批量的倒入论文标题&#xff0c;导出引用。 正常引…

redis v6.0.16 安装 基于Ubuntu 22.04

redis安装 基于Ubuntu 22.04 本文演示如何在ubuntu22.04下&#xff0c;安装redis v6.0.16&#xff0c;并配置测试远程访问。 Step1 更新环境 sudo apt updateStep2 安装redis sudo apt install redis-server -yStep3 启动 sudo systemctl restart redissudo systemctl sta…

✨基于python实现的文档管理系统✨

本项目是使用Django和layui实现的一个文档转换系统&#xff0c;支持各种文档的相互转换 &#x1f4c4; PPT转Word &#x1f4d1; PDF转Word &#x1f4da; 合并PDF &#x1f4dc; Word转PDF 系统支持用户注册、登录&#xff0c;还能管理你的转换任务&#xff1a; &#x1f504;…

ES索引:索引管理

索引管理 再讲索引&#xff08;Index&#xff09;前&#xff0c;我们先对照下 ElasticSearch Vs 关系型数据库&#xff1a; PUT /customer/_doc/1 {"name": "DLBOY" }系统默认是自动创建索引的 如果我们需要对这个建立索引的过程做更多的控制&#xff1a…

Linux安装Dcoker

目录 1、卸载&#xff08;可选&#xff09; 2、安装docker 3、启动docker 4、配置镜像加速 1、卸载&#xff08;可选&#xff09; 如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \…

智能无损网络技术详解

什么是智能无损网络&#xff1f; 智能无损网络是一种集流量控制与拥塞控制于一体的先进技术&#xff0c;旨在提升网络性能&#xff0c;降低时延。同时&#xff0c;它通过智能无损存储网络等技术实现网络和应用系统的优化融合。该技术为AI人工智能、集中式/分布式存储以及HPC等应…

基于SSM+小程序的购物管理系统1

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的购物管理系统1&#xff0c;可以实现首页、个人中心、商品分类管理、商品信息管理、特价商品管理、用户管理、留言板管理、系统管理、订单管理等功能。方便用户对首页、商品…

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&#xff06;数据集分享 [yolov8-seg-FocalModulation&#xff06;yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

ROS2入门学习——ROS在机器人中的运行

一、入门级基础平台TurtleBot TurtleBot 是 ROS 中重要且资源丰富的机器人之一&#xff0c;特别适合入门级机器人爱好者提供基础平台。用户可以直接利用其自带的软硬件&#xff0c;专注于应用程序的开发。TurtleBot 随着 ROS 的发展&#xff0c;一直处于开发前沿。 TurtleBot…

智谱发布AI助理,帮人类敲响AGI的大门

人工智能之父John McCarthy曾说&#xff1a;“只要AI可以开始正常工作&#xff0c;就不会有人再把它当AI了。”如今&#xff0c;这一预言正在逐渐变为现实。 10月25日&#xff0c;智谱AI推出了自主智能体AutoGLM&#xff0c;能够模拟人类操作手机&#xff0c;执行各种任务。 …

Profinet、Ethernet/IP 工业以太网无线通信解决方案

在工业现场&#xff0c;我们常常会面临这样的困扰&#xff1a;两个PLC之间、PLC 跟远程IO之间或者PLC 跟伺服之间由于种种原因不方便布线&#xff0c;严重影响了通讯效率和生产进程。为了解决这一难题&#xff0c;三格电子设计了一款工业以太网无线网桥&#xff0c;这款无线网桥…