交叉验证 | 机器学习

news2024/9/20 14:33:15

1、交叉验证

1.1概念
交叉验证的核心思想:对数据集进行多次划分,对多次评估的结果取平均,从而消除单次划分时数据划分得不平衡而造成的不良影响。因为这种不良影响在小规模数据集上更容易出现,所以交叉验证方法在小规模数据集上更能体现出优势。
将数据集划分为n份,依次使用其中1份作为测试集,其他n-1份作为训练集,多次计算模型的准确性

在这里插入图片描述

交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表,可以在一定程度上减小过拟合。

2、目的:

模型评估(周志华《机器学习》p24)和模型选择。

  • 模型评估
    数据集被划分成训练集、测试集两部分,训练集和测试集的划分采用N折交叉的方式。
    交叉验证的优势在于:
    避免由于数据集划分不合理而导致的问题,比如模型在训练集上过拟合,这种过拟合可能不是模型导致的,而是因为数据集划分不合理造成的。这种情况在用小规模数据集训练模型时很容易出现,所以在小规模数据集上用交叉验证的方法评估模型更有优势。

原文链接:https://blog.csdn.net/qq_40305043/article/details/115352782
可以看成是模型选择过程中的一个步骤:先对候选的每个模型进行评估,再选出评估表现最好的模型作为最终模型。把这种策略用于划分训练集和测试集,就可以进行模型评估;

  • 模型选择
    模型选择,也可以称为超参数选择。数据集需要划分成训练集、验证集、测试集三部分,训练集和验证集的划分采用N折交叉的方式。

验证集是在训练过程中用于检验模型的训练情况,从而确定合适的超参数;
测试集是在训练结束之后,测试模型的泛化能力。
把这种策略用于划分训练集和验证集,就可以进行模型选择。
交叉重复的使用数据集分为训练集和测试集,这次用于训练集,下次可能用于测试集。一般用在数据量不是很充条件下,评估模型好坏。
如果样本大于一万条的话,我们一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。
用训练集来训练模型,
用验证集来评估模型预测的好坏和选择模型及其对应的参数。
把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。
简单:30%测试集,70%训练集

3、交叉验证与过拟合的关系

交叉验证通过寻找最佳模型的方式来解决过拟合,通过训练集和测试集,通过调整不同的分布,而正则化则是通过约束参数的范数来解决过拟合。
当用交叉验证进行模型选择时,可以从多种模型中选择出泛化能力最好的(即最不容易发生过拟合)的模型。从这个角度上讲,交叉验证是避免发生过拟合的手段。同样是解决过拟合的方法,交叉验证与正则化不同:

4. 交叉验证的优缺点

  • 优点:

获得对模型更合理更准确的评估,尤其是数据集很小时,更能体现出这个优势。

  • 缺点:

增加了计算量。

5. 交叉验证的使用场景

如果当前有多个候选模型,想从中选出一个最合适的模型,就可以用交叉验证的方法进行模型选择,尤其是当数据集很小时。
如果当前只有一个模型,想获得对这个模型的performance最客观的评估,就可以用交叉验证的方法进行模型评估,尤其是当数据集很小时。

在这里插入图片描述

五、实例代码

import numpy as np
from sklearn import datasets
from sklearn.cross_validation import train_test_split
#train_test_split进行数据切分
#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import cross_val_score

def main():
    # 加载iris数据集
    iris = datasets.load_iris()
    # 读取特征
    X = iris.data
    # 读取分类标签
    y = iris.target
    # 定义分类器,k近邻选择为5
    knn = KNeighborsClassifier(n_neighbors = 5)
    # 进行交叉验证数据评估, 数据分为5部分, 每次用一部分作为测试集
    scores = cross_val_score(knn, X, y, cv = 5, scoring = 'accuracy')
    # 输出5次交叉验证的准确率
    print(scores)

if __name__ == '__main__':
main()
#最后输出结果
#[ 0.96666667  1.          0.93333333  0.96666667  1.        ]

参考:https://blog.csdn.net/weixin_42691585/article/details/113971857

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

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

相关文章

Profinet转ModbusTCP网关连接昆仑通态触摸屏配置案例

本案例是模拟将Modbus TCP 设备数据接入到西门子PROFINET 网络中。 使用设备为西门子 S7-1500 型 PLC, Profinet转ModbusTCP网关。MODBUS 从站昆仑通态触摸屏。 配置方法: 打开博图,新建项目并添加站点。 添加1513PLC。 设置好IP并处于联网状态 导入Pr…

【前端】小程序开发入门:安装开发工具、目录结构与项目配置

文章目录前期准备目录结构app.jsonpageswindow其他前期准备 开发小程序要先申请一个对应的AppID:微信小程序 (qq.com) 微信官方小程序开发文档:微信开放文档 (qq.com) 然后安装一个小程序开发工具: 选择稳定版: 安装后打开&…

组合由于继承

目录 前言: 1.什么是继承? 2.继承的劣势、问题? 3.组合相比继承有哪些优势? 4、如何判断该用组合还是继承? 参考资料 前言: 我们在平时日常开发设计的过程中,经常会有人提到一条经典的设…

音视频基础之封装格式与音视频同步

封装格式的概念 封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。 一般来说,视频文件的后缀名就是它的封装格式。 封装的格式不一样,后缀名也就不一样。 比如&a…

MMPBSA结合自由能计算原理

MMPBSA结合自由能计算原理 计算结合自由能的方法有很多,例如,热力学积分(Thermodynamic Integration,TI)、自由能微扰(Free Energy Perturbation,FEP)、MM/PB(GB)SA、线性相互作用能…

安科瑞消防应急照明和疏散指示系统在城市隧道的应用分析

【摘要】:随着城市的发展,交通量越来越大,交通状况越来越复杂,城市隧道的修建也随之变多。当隧道照明正常时,隧道内路面有足够的照度,隧道中快速行驶的汽车,大部分司机不用打开车灯或只需打开车…

Swift 周报 第二十三期

前言 本期是 Swift 编辑组自主整理周报的第十四期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。 勇敢是即便知道好结局不会每每降临在…

项目中异常信息的统一处理以及JSR03校验

在项目中,我们经常会对前端传过来的数据判断是否有一些错误,比如:id是否为空,传过来的名称是否合格,如果不符合我们通常会抛出异常,那么小的项目可能每次抛出异常也不是很麻烦,但是对于一个大型…

详解HashMap

目录 1.hash code 2.数据结构 3.初始化 4.存取 4.1.put 4.2.get 5.迭代 6.扩容 7.JDK1.7版本存在的问题 7.1.性能跌落 7.2.循环链表 8.散列运算 9.扰动函数 1.hash code hash code是使用hash函数运算得到的一个值,是对象的身份证号码,用于…

将项目从 SVN 迁移到 GIT

场景 项目开发中,项目原本是用的SVN,已经用了一年了,现在公司要抛弃SVN用Git,要求把SVN的代码直接搬过去Git,并保留之前的历史提交记录。 操作步骤 找到已经被svn管理的项目的根目录 WinFarm,右键 Git Ba…

手把手教你将微信小程序放到git上

背景 首先,要创建一个自己的git仓库,这里默认大家都能够自己创建了git仓库了。如果不会创建仓库的话,百度一下,很容易就能够创建了!(后续,如有不知道在哪里,怎么创建仓库的话&#…

群晖-第4章-Docker安装redis

群晖-第4章-Docker安装redis 本章介绍群晖docker安装redis的方法。如果你需要外网访问,可以参考我的群晖第1章。 参考 群晖使用 docker部署 Redis - 编程之家 Redis设置密码_惜惜然的博客-CSDN博客 在本地新建一个文本文件,命名为redis.conf&#xff…

GEE学习笔记 六十四:绿色中国报告(个人版)

2019年上半年在遥感圈里最火的一篇文章莫过于这篇《China and India lead in greening of the world through land-use management》(China and India lead in greening of the world through land-use management | Nature Sustainability),…

Idea搭建Spring5.3.x源码阅读环境

1. 概述 Spring是一个轻量级Java开源框架,在Java项目开发过程中已经离不开Spring全家桶了,包括Spring、SpringBoot、SpringCloud等,学习好Spring基础源码也有助于更好在项目中使用Spring相关组件,在学习源码前需要搭建好源码学习…

二进制部署K8S

目录 一、环境准备 1、常见的k8s部署方式 2、关闭防火墙 3、关闭selinux 4、关闭swap 5、根据规划设置主机名 6、在master添加hosts 7、将桥接的IPv4流量传递到iptables的链 8、时间同步 二、部署etcd集群 1、master节点部署 2、查看证书的信息 2.1 创建k8s工作目…

使用useReducer + useContext 代替 react-redux

一. 概述 在 React16.8推出之前,我们使用react-redux并配合一些中间件,来对一些大型项目进行状态管理,React16.8推出后,我们普遍使用函数组件来构建我们的项目,React提供了两种Hook来为函数组件提供状态支持&#xff…

ccc-pytorch-基础操作(2)

文章目录1.类型判断isinstance2.Dimension实例3.Tensor常用操作4.索引和切片5.Tensor维度变换6.Broadcast自动扩展7.合并与分割8.基本运算9.统计属性10.高阶OP大伙都这么聪明,注释就只写最关键的咯1.类型判断isinstance 常见类型如下: a torch.randn(…

iOS开发:对苹果APNs远程推送原理的理解

本篇是对APNs推送原理的一个理解,希望看完后,能让你掌握一个知识点。 APNs是Apple Push Notification Service的缩写,也就是苹果的推送服务器。 远程通知的传递涉及几个关键组件: 您公司的服务器或第三方服务商,称为提供商服务器Apple 推送通知服务 (APNs)用户的设备您的…

Netty进阶实现自定义Rpc

项目地址:xz125/Rpc-msf (github.com)1 项目架构:RPC 框架包含三个最重要的组件,分别是客户端、服务端和注册中心。在一次 RPC 调用流程中,这三个组件是这样交互的:服务端(provider)在启动后会将它提供的服务列表和地址…

RocketMQ 第一章

RocketMQ 第一章 1、什么是MQ Message Queue(消息队列),从字⾯上理解:⾸先它是⼀个队列。FIFO 先进先出的数据结构 —— 队列。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的,而是解…