机器学习——数据划分

news2024/10/7 12:22:51

【说明】文章内容来自《机器学习入门——基于sklearn》,用于学习记录。若有争议联系删除。

1、数据划分

        在机器学习中,通常将数据集划分为训练集和测试集。训练集用于训练数据,生成机器学习模型;测试集用于评估学习模型的泛化性能和有效程度。

        数据划分一般有留出法、交叉验证法和自助法。

1.1留出法

        留出法(hold-out)是将已知数据集分成两个互斥的部分:一部分用来训练模型;另一部分用来测试模型,评估其误差。留出法的稳定性较差,通常会进行若干次随机划分,重复进行评估,取平均值作为评估结果。
        留出法具有如下优点:

  • 实现简单、方便,在一定程度上能评估泛化误差。
  • 训练集和测试集分开,缓解了过拟合问题。

留出法具有如下缺点:

  • 数据都只被使用了一次,没有得到充分利用。
  • 在测试集上计算出来的最后的评估指标与原始分组有很大关系,

        一般情况下,数据划分的大致比例是:训练集占70%~80%,测试集占20%~30%。测试数据不参与训练,只用于评估模型与数据的匹配程度。
train_test_split函数随机从样本中按比例选取训练数据和测试数据,语法形式为

x_train, x _test, y_train, y_test=sklearn.model_selection.train _test _split
(train data,train target, test_size,random state)

【参数说明】

  • train_data:待划分的样本数据
  • train_target:待划分样本数据的结果(标签)
  • test_size:测试数据占样本的比例。若为整数,则表示样本数量。若test_size= 0.3,表示将样本数据的30%作为测试集,计入x_test;其余70%数据记入x_train。
  • random_state:随机种子,保证每次都是同一个随机数,若为0或不填,每次生成随机数都不同。
  • x_train:划分出的训练集数据(特征值)
  • x_test:划分成的测试集数据(特征值)
  • y_train:划分出的训练集标签(目标值)
  • y_test:划分出的测试集标签(目标值)

示例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
#获取鸢尾花数据集
iris = load_iris()
#test_size 默认取值为25%,test_size取值为0.2,随机种子为22
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size = 0.2, random_state = 22)
print('训练集的特征值:\n', x_train, x_train.shape)

1.2 交叉验证法

        根据数据集大小的不同和数据类别不同,交叉验证法分为3种。

(1)留一交叉验证法
        当数据集较小时,采用留一交叉验证法。留一交叉验证法是指数据集划分数量等于样本量,这样每次只有一个样本用于测试。留一交叉验证法是K折交叉验证法的特殊形式,较为简单,随机采样一定比例作为训练集,剩下的作为测试集使用。
(2)K折交叉验证法
        当数据集较大时,采用K折交叉验证法。K折是指对数据集进行K次划分,使得所有数据在训练集和测试集中都出现,但每次划分不会重叠,相当于无放回抽样。
K折交叉验证法使用FKold函数
语法:Fkold(n_splits, shuffle, random_state)
参数说明:

  • n_splits:表示划分为几等分(至少是2)
  • shuffle:表示是否进行洗牌,即是否打乱划分。默认为fales,既不打乱。
  • random_state:随机种子数

当采用K折交叉验证时,需要使用以下两个方法:

  • get_n_splits([X,y,groups]):获取参数n_splits的值
  • split(X,[Y,group]):将数据集划分为训练集和测试集,返回索引生成器。

Kfold示例

import numpy as np
from sklearn.model_selection import KFold
X = np.array([[1,2],[3,4],[1,2],[3,4]])
#kf = KFold(n_splits = 2)
print(kf.get_n_splits(X))
for train_index, test_index in kf.split(X):
    print('train:\n',train_index,'test:\n',test_index)

(3)分层交叉验证法

        在构建模型时,调参是极为重要的步骤,只有选择最佳的参数,才能构建最优的模型。Sklearn 提供了cross_val_score函数一一以实现调参,将数据集划分为k个大小接近的互斥子集,然后每次用k一1个子集的并集作为训练集,将余下的子集作为测试集,如此反复进行k次训练和测试,返回k个测试结果的平均值。例如,10次10折交叉验证法是将数据集分成10份,轮流将其中9份作为训练数据,将剩余1份作为测试数据,这样迭代10次。通过传入的模型训练10次,最终对10次结果求平均值。
cross_val_score函数的语法形式如下:

cross_val_score (estimator,train_x,train_y,cv=10)

参数说明如下

  • estimator:需要使用交叉验证的算法。
  • train_x:输人样本数据。
  • train_y:样本标签。
  • cv:进行10次训练。

交叉验证法有以下优点:

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

交叉验证示例

from sklearn import datasets
from sklearn.model_selection import train_test_split,cross_val_score

from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
iris = datasets.load_iris()
#加载iris数据集
x = iris.data
y = iris.target
#对应的数据标签
train_x, test_x, train_y, test_y =train_test_split(x, y, test_size = 1/3, random_state = 3)
#以1/3的比列划分训练集的训练结果和测试集的测试结果
k_range = range(1, 31)
cv_scores = []
#用来存放每个模型的结果
for n in k_range:
    knn = KNeighborsClassifier(n)
    scores = cross_val_score(knn, train_x, train_y, cv = 10)
    #采用knn算法进行交叉验证,进行10  次训练
    cv_scores.append(scores.mean())
plt.plot(k_range, cv_scores)
plt.xlabel('k')
plt.ylabel('Accuracy')
plt.show()
best_knn = KNeighborsClassifier(n_neighbors = 3)
#选择最优的k = 3传入模型
best_knn.fit(train_x, train_y)
#训练模型
print('score:\n',best_knn.score(test_x, test_y))

【运行结果】

1.3 自助法

        自助法是一种产生样本的抽样方法,其实质是有放回的随机抽样,自助法从数据集中随机抽取记录用于测试集,然后将其放回原数据集,继续下一次随机抽样,直到测试集中的数据条数满足要求为止。
语法:

ShuffleSplit(n_split, test_size, train_size, random_state)

参数说明:

  • n_splits:表示划分为几块(至少是2)
  • test_size: 测试集比例或样本数量
  • train_size:训练集比列或样本数量
  • random_state;随机种子数,默认为None

示例

import numpy as np
from sklearn.model_selection import ShuffleSplit
x = np.arange(5)
ss = ShuffleSplit(n_splits = 3, test_size = .25, random_state = 0)
for train_index, test_index in ss.split(x):
    print('TRAIN', train_index, 'TEST', test_index)

2、数据划分方法的选择原则

  1. 当数据集较大时,通常采用留出法或者K折交叉验证法
  2. 当数据集较小且难以有效划分训练集和测试集时,采用自助法
  3. 当数据集较小且可以有效划分训练集和测试集时,采用留一交叉验证法。

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

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

相关文章

如何让.NET应用使用更大的内存

我一直在思考为何Redis这种应用就能独占那么大的内存空间而我开发的应用为何只有4GB大小左右,在此基础上也问了一些大佬,最终还是验证下自己的猜测。 操作系统限制 主要为32位操作系统和64位操作系统。 每个进程自身还分为了用户进程空间和内核进程空…

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换 本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。 加密数据的方法可以分为…

人工智能工程师

据悉:为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署求,深入实施人才强国战略和创新驱动发展战略,加强全国数字化人才队伍建设,持续推进人…

Axure之交互与情节与一些实例

目录 一.交互与情节简介 二.ERP登录页到主页的跳转 三.ERP的菜单跳转到各个页面的跳转 四.省市联动 五.手机下拉加载 今天就到这里了,希望帮到你哦!!! 一.交互与情节简介 "交互"通常指的是人与人、人与计算机或物体…

lseek()函数的原型及使用方法,超详细

对于所有打开的文件都有一个当前文件偏移量(current file offset),文件偏移量通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。 读写操作通常开始于当前文件偏移量的位置,并且使其增大,增量为读写的字节数。文件被…

苹果M系列芯片安装Notepad-- 详细教程(亲测14以上系统也可用)

目录 1. 介绍2. 前言说明3. 安装使用教程3.1 下载3.2 安装3.3 打开3.4 最终效果 4. 主体功能一览5. 其他信息 1. 介绍 鉴于某些Notepad竞品作者的不当言论,Notepad–的意义在于:减少一点错误言论,减少一点自以为是。 Notepad–的目标&#xf…

Xpath注入

这里学习一下xpath注入 xpath其实是前端匹配树的内容 爬虫用的挺多的 XPATH注入学习 - 先知社区 查询简单xpath注入 index.php <?php if(file_exists(t3stt3st.xml)) { $xml simplexml_load_file(t3stt3st.xml); $user$_GET[user]; $query"user/username[name&q…

【网络安全技术】传输层安全——SSL/TLS

一、TLS位置及架构 TLS建立在传输层TCP/UDP之上&#xff0c;应用层之下。 所以这可以解决一个问题&#xff0c;那就是为什么抓不到HTTP和SMTP包&#xff0c;因为这两个在TLS之上&#xff0c;消息封上应用层的头&#xff0c;下到TLS层&#xff0c;TLS层对上层消息整个做了加密&…

SpringBoot 3.2.0 版本 mysql 依赖下载错误

最近想尝试一下最新的 SpringBoot 项目&#xff0c;于是将自己的开源项目进行了一些升级。 JDK 版本从 JDK8 升级至 JDK17。SpringBoot 版本从 SpringBoot 2.7.3 升级到 SpringBoot 3.2.0 其中 JDK 的升级比较顺利&#xff0c;毕竟 JDK 的旧版本兼容性一直非常好。 但是在升级…

STM32_通过Ymodem协议进行蓝牙OTA升级固件教程

目录标题 前言1、OTA升级的重要性和应用场景2、理论基础2.1、单片机的启动流程2.2、什么是IAP&#xff1f;2.3、什么是OTA&#xff1f;2.4、什么是BootLoader&#xff1f;2.5、Ymodem协议是什么&#xff1f;2.6、IAP是如何实现的&#xff1f; 3、具体操作3.1、软硬件工具准备3.…

链表基础知识(二、双向链表头插、尾插、头删、尾删、查找、删除、插入)

目录 一、双向链表的概念 二、 双向链表的优缺点分析​与对比 2.1双向链表特点&#xff1a; 2.2双链表的优劣&#xff1a; 2.3循环链表的优劣 2.4 顺序表和双向链表的优缺点分析​ 三、带头双向循环链表增删改查实现 3.1SList.c 3.2创建一个新节点、头节点 3.3头插 3.…

互联网加竞赛 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

libxls - 编译

文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译 概述 想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在…

C# WPF上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件上面如果一个操作比较缓慢&#xff0c;或者说需要很长的时间&#xff0c;那么这个时候最好添加一个进度条&#xff0c;提示一下当前任务的进展…

Kubernetes - 超简单手动安装 Dashboard WebUI

相关链接 ​​​​​​版本对照&#xff1a;Releases kubernetes/dashboard GitHubKubernetes - 一键卸载 Kubernetes-Dashboard-CSDN博客Kubernetes - Dashboard Token 访问登录永不过期配置-CSDN博客 版本推荐 Kubernetes Dashboard&#xff1a;2.0.3Kubernetes&#xff…

基于Springboot的旅游网站设计与实现(论文+调试+源码)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

DSP芯片行业分析:预计2029年将达到57亿美元

DSP芯片用在工业机器人领域&#xff0c;相当于起着关节的作用&#xff0c;有了DSP的控制&#xff0c;机器人反应更迅速&#xff0c;行动更精准。工业机器人在工作中需要处理大量的数据&#xff0c;随着工业机器人的应用日益广泛和普及&#xff0c;DSP芯片在这方面的应用越来越多…

为什么在Android中需要Context?

介绍 在Android开发中&#xff0c;Context是一个非常重要的概念&#xff0c;但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念&#xff0c;并解释为什么在Android应用中需要使用它。 Context的来源 Context的概念来源于Android框架…

java21特性学习

jdk21下载地址 JDK21文件 JDK21是javaSE平台最新的长期支持版本。 Java SE Java Archive | Oracle JDK21版本说明 JDK 21 Release Notes, Important Changes, and Information JavaSE 版本字符串格式 Version-String Format JavaSE平台采用了基于时间的发布模型,JDK每六个…

抖店怎么快速起店?不掺杂汤汤水水,全是干货!

我是电商珠珠 我做抖店也已经有三年的时间了&#xff0c;团队也从原来的几人扩大到了70。对于抖店的玩法已经完全摸透熟通&#xff0c;在做店的同时也会带着学生一起做店&#xff0c;他们经常问的问题就是抖店怎么快速起店。 今天&#xff0c;我就来给大家做个分享。根据我的…