交叉验证_验证的三种方法

交叉验证_验证的三种方法什么是交叉验证?它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。主要是用于小部分数据集中。通过图片可以看出,划分出来的测试集(tes

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

什么是交叉验证?

它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。

主要是用于小部分数据集中。通过图片可以看出,划分出来的测试集(test set)是不可以动的,因为模型参数的优化是使用验证集(validation set),这个结果是有偏差的,所以需要一个没见过的新数据集进行泛化能力测试。

交叉验证_验证的三种方法


为什么用交叉验证法?

  1. 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
  2. 还可以从有限的数据中获取尽可能多的有效信息。

 交叉验证用途?

交叉验证(Cross Validation)是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集 (training set),另一部分做为验证集(validation set),当然还要留出测试集部分(test set),首先用训练集对分类器进行训练,在利用验证集来优化模型的超参数(hyperparameter),最后来使用测试集来测试模型的泛化能力。

  1. 可以用来选择模型
  2. 大致判断当前模型状态是否处于过拟合
  3. 交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generalize)。(过拟合的泛化能力差)

交叉验证的方法?

1. 留出法(holdout cross validation)

在机器学习任务中,拿到数据后,我们首先会将原始数据集分为三部分:训练集验证集测试集。 

训练集用于训练模型,

验证集用于模型的参数选择配置,

测试集对于模型来说是未知数据,用于评估模型的泛化能力。

交叉验证_验证的三种方法

这个方法操作简单,只需随机把原始数据分为三组即可。 
不过如果只做一次分割,它对训练集、验证集和测试集的样本数比例,还有分割后数据的分布是否和原始数据集的分布相同等因素比较敏感,不同的划分会得到不同的最优模型,而且分成三个集合后,用于训练的数据更少了。

2. k折交叉验证(k-fold cross validation)

交叉验证_验证的三种方法

k折交叉验证是对留出法的改进,

k 折交叉验证通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感。

  • 第一步,不重复抽样将原始数据随机分为 k 份。
  • 第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。
  • 第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余机会作为训练集。
  • 在每个训练集上训练后得到一个模型,
  • 用这个模型在相应的测试集上测试,计算并保存模型的评估指标,
  • 第四步,计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。

k 一般取 10, 
数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。 
数据量大的时候,k 可以设小一点。

3.留一法(leave one out cross validation)

这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。 
但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。 
一般在数据缺乏时使用。

此外:

  1. 多次 k 折交叉验证再求均值,例如:10 次 10 折交叉验证,以求更精确一点。
  2. 划分时有多种方法,例如对非平衡数据可以用分层采样,就是在每一份子集中都保持和原始数据集相同的类别比例。
  3. 模型训练过程的所有步骤,包括模型选择,特征选择等都是在单个折叠 fold 中独立执行的。

4.自助采样法(bootstrapping)

通过自助采样法,即在含有 m 个样本的数据集中,每次随机挑选一个样本,再放回到数据集中,再随机挑选一个样本,这样有放回地进行抽样 m 次,组成了新的数据集作为训练集。

这里会有重复多次的样本,也会有一次都没有出现的样本,原数据集中大概有 36.8% 的样本不会出现在新组数据集中。

优点是训练集的样本总数和原数据集一样都是 m,并且仍有约 1/3 的数据不被训练而可以作为测试集。 
缺点是这样产生的训练集的数据分布和原数据集的不一样了,会引入估计偏差。 
此种方法不是很常用,除非数据量真的很少。


具体实现

1. 留出法(holdout cross validation)

from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X_trainval, y_trainval, test_size=0.2, random_state=0)

# 数据集分布为:训练集0.64, 验证集0.16, 测试集0.2
print(X_train.shape, y_train.shape)
print(X_val.shape, y_val.shape)
print(X_test.shape, y_test.shape)

 

2. k折交叉验证(k-fold cross validation)

import numpy as np
from sklearn.model_selection import KFold

X = ["a", "b", "c", "d"]
kf = KFold(n_splits=2)
for train, test in kf.split(X):
    print("%s %s" % (train, test))

 

from sklearn.model_selection import cross_val_score
# 可以通过修改模型参数,来选取最优参数组合
logreg = LogisticRegression()
scores = cross_val_score(logreg,cancer.data, cancer.target) #cv:默认是3折交叉验证,可以修改cv=5,变成5折交叉验证。
print("Cross validation scores:{}".format(scores))
print("Mean cross validation score:{:2f}".format(scores.mean()))

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168349.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月3日 上午9:16
下一篇 2022年8月3日 上午9:16


相关推荐

  • export方法_import怎么用

    export方法_import怎么用基础命令学习目录首页export的基本作用就是将父shell中的局部变量设置为环境变量,使得该变量可以在子shell中使用。下面设置两种情景对export进行原理解析。情景1.有一个名为myexport.sh的脚本,内容如下:#!/bin/shexportMY_PATH=/usr/local12在linux环境中打开终端运行该shell$shmy…

    2025年9月28日
    7
  • Jmeter——BeanShell PreProcessor的用法

    Jmeter——BeanShell PreProcessor的用法一 什么是 BeanShellBea 是一个小型嵌入式 Java 源代码解释器 具有对象脚本语言特性 能够动态地执行标准 JAVA 语法 并利用在 JavaScript 和 Perl 中常见的的松散类型 命令 闭包等通用脚本来对其进行拓展 BeanShell 不仅仅可以通过运行其内部的脚本来处理 Java 应用程序 还可以在运行过程中动态执行你 java 应用程序执行 java 代码 因为 BeanShell 是用 ja

    2026年3月17日
    2
  • FEC前向纠错_由于前向纠错法

    FEC前向纠错_由于前向纠错法实时音视频领域UDP才是王道        在 Internet 上进行音视频实时互动采用的传输层方案有TCP(如:RTMP)和UDP(如:RTP)两种。TCP协议能为两个端点间的数据传输提供相对可靠的保障,这种保障是通过一个握手机制实现的。当数据传给接收者时,接收者要检查数据的正确性。发送者只有接到接收者的正确性认可才能发送下一个数据块。如果没有接到确认报文,这个数据块就得重传。

    2022年8月11日
    17
  • pycharm 2022 激活 host【2021最新】

    (pycharm 2022 激活 host)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0VOERWDQ5R-eyJsa…

    2022年3月30日
    166
  • 树莓派之python安装到pycharm远程连接步骤

    树莓派之python安装到pycharm远程连接步骤树莓派 python 安装到 pycharm 远程连接步骤 1 从官网上下载树莓派系统到 pc 端 2 下载 diskgenius 将 TF 卡格式化成普通盘 3 在卡中创建 ssh 文件 不带后缀 用于树莓派和主机的远程连接 4 从官网下载 piimager 将下载的树莓派系统安装 TF 卡中 5 TF 插入树莓派 4B 开机自动开始安装系统 6 提示是否更新软件 直接 skip 跳过 7 更换镜像源 8 update upgrade 命令更新软件 9 安装虚拟键盘 可选 10 安装中文输入法 11 远程控制 pc 端安装 xshell12

    2026年3月18日
    2
  • spring cloud和dubbo的区别,各自优缺点「建议收藏」

    spring cloud和dubbo的区别,各自优缺点「建议收藏」区别:————————–来源(背景):Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点。SpringCloud,从命名我们就可以知道,它是SpringSource的产物,Spring社区的强大背书可以说是Java企业界最有影响力的组织了,除了SpringSource之外,还有Pivotal和Netfix是其强大的后盾与技术输…

    2022年6月12日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号