机器学习(一) 基于sklearn库的数据集划分(交叉验证)

机器学习中首要环节就是数据集的处理,其中数据集的处理从个人理解(如有错误敬请谅解)的角度来说包括两个方面:数据集划分和数据清理。其中数据集划分是指训练集、验证集和测试集的数据类别划分;数据清理是指数据的清洗、删除等等方面。这两天主要学的就是如何划分数据集。

一、数据集划分(交叉验证)

划分数据集的目的主要是为了后期训练模型参数的准确性以及测试结果的准确性,避免下列问题:

1.训练集和测试集分布不均匀,主要是指实际项目的数据集中如分类任务中1000个样本,其中A类样本和B类样本均为500个,但是在划分训练集和测试集的时候,训练集选了650个A类和50个B类样本,结果导致训练出来的模型偏向于A类样本,在测试或者实际预测的时候导致B类数据分类不正确;

2.训练集和测试集分布不均匀,主要是指实际项目的数据集中如分类任务中1000个样本,其中A类样本950个和B类样本为50个.那么在实际划分训练集和测试集的时候可能出现的极端情况就是选取了650个A类样本和50个B类样本,测试集中B类样本数为0,上述情况可导致模型测试不真实,与实际不符合。

 

二、基于sklearn的数据集划分(交叉验证)

交叉验证是指数据集按照一定的规律进行划分,包括样本数据的重复使用,即把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,当前训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

其中博主主要使用的是python编程语言,所以应用测试都是基于sklearn库哈。当前使用的sklearn库是0.20.0

1.KFold(K折):将所有的样例划分为 k 个组,称为折叠 (fold) (如果 k = n, 这等价于 Leave One Out(留一) 策略),都具有相同的大小(如果可能)。预测函数学习时使用 k - 1 个折叠中的数据,最后一个剩下的折叠会用于测试。

2.RepeatedKFold(RK折),重复 K-Fold n 次。当需要运行时可以使用它 KFold n 次,在每次重复中产生不同的分割。

3.LeaveOneOut (LOO) 是一个简单的交叉验证。每个学习集都是通过除了一个样本以外的所有样本创建的,测试集是被留下的样本。

4.LeavePOut 与 LeaveOneOut 非常相似,因为它通过从整个集合中删除P个样本来创建所有可能的训练/测试集。

5.ShuffleSplit 迭代器 将会生成一个用户给定数量的独立的训练/测试数据划分。样例首先被打散然后划分为一对训练测试集合。

其中由于标签的种类分布不均匀,这时不能采用上述的方法。此时应采用分层抽样方法,个人理解为就是基于标签的数据层进行划分,如数据集中有A类样本80%,B类样本20%,划分数据集的时候不管采用哪种方法应遵循训练集和测试集的样本标签比例保持为80%和20%。

6.StratifiedKFold 是 k-fold 的变种,会返回 stratified(分层) 的折叠:每个小集合中, 各个类别的样例比例大致和完整数据集中相同。

7.StratifiedShuffleSplit 。此交叉验证对象是StratifiedKFold和ShuffleSplit的合并,返回分层的随机折叠。折叠是通过保留每个类别的样品百分比来进行的。

如果潜在的生成过程产生依赖样本的 groups ,那么 i.i.d. 假设将会被打破。这样的数据分组是特定于域的。一个例子是从多个患者收集医学数据,从每个患者身上采集多个样本。而这样的数据很可能取决于个人群体。 在我们的例子中,每个样本的患者 ID 将是其 group identifier (组标识符)。

8.GroupKFold 是 k-fold 的变体,它确保同一个 group 在测试和训练集中都不被表示。

9.LeaveOneGroupOut 是一个交叉验证方案,它根据第三方提供的 array of integer groups (整数组的数组)来提供样本。这个组信息可以用来编码任意域特定的预定义交叉验证折叠。每个训练集都是由除特定组别以外的所有样本构成的。

10.LeavePGroupsOut 类似于 LeaveOneGroupOut ,但为每个训练/测试集删除与 P 组有关的样本。

11.GroupShuffleSplit 迭代器是 ShuffleSplit 和 LeavePGroupsOut 的组合,它生成一个随机划分分区的序列,其中为每个分组提供了一个组子集。

时间序列数据的特点是时间 (autocorrelation(自相关性)) 附近的观测之间的相关性。 然而,传统的交叉验证技术,例如 KFold 和 ShuffleSplit 假设样本是独立的且分布相同的,并且在时间序列数据上会导致训练和测试实例之间不合理的相关性(产生广义误差的估计较差)。 因此,对 “future(未来)” 观测的时间序列数据模型的评估至少与用于训练模型的观测模型非常重要。为了达到这个目的,一个解决方案是由 TimeSeriesSplit 提供的。

12.

TimeSeriesSplit 是 k-fold 的一个变体,它首先返回 k 折作为训练数据集,并且( k+1) 折作为测试数据集。 请注意,与标准的交叉验证方法不同,连续的训练集是超越前者的超集。 另外,它将所有的剩余数据添加到第一个训练分区,它总是用来训练模型。这个类可以用来交叉验证以固定时间间隔观察到的时间序列数据样本。

下面是实际的sklearn调用代码。

# -*- coding: utf-8 -*-
"""
Created on Tue Nov  5 09:10:35 2019@author: kofzh
"""import numpy as np
from sklearn.model_selection import StratifiedShuffleSplit,ShuffleSplit,LeavePOut,LeaveOneOut,StratifiedKFold,KFold,RepeatedKFoldX=np.array([[1,2,3,4],[11,12,13,14],[21,22,23,24],[31,32,33,34],[41,42,43,44],[51,52,53,54],[61,62,63,64],[71,72,73,74]
])y=np.array([1,1,0,0,1,1,0,0])'''适合样本便签分类均匀的数据集'''
#K折
kf =KFold(n_splits=4,random_state=1)
print("KFold")
for train,test in kf.split(X,y):print('Train:%s | Test:%s '%(train,test),'\n')#print(X[train],X[train])#RK折,其中n_splits为数据集分成的份数,n_repeats为Test数据集中单一数据出现的次数,默认为10
random_state= 12883823
rkf= RepeatedKFold(n_splits=4,n_repeats=4,random_state=random_state)
print("RKFold")
for train,test in rkf.split(X,y):print('Train:%s | Test:%s '%(train,test),'\n')#print(X[train],X[train])#loo,测试集样本留一,其余均为训练集。感觉和K折的n_splits=样本数一样
loo = LeaveOneOut()
print("loo")
for train,test in loo.split(X,y):print('Train:%s | Test:%s '%(train,test),'\n')#lpo,删除p个样本,p>1时样本会重叠
lpo = LeavePOut(p=2)
print("lpo")
for train,test in lpo.split(X,y):print('Train:%s | Test:%s '%(train,test),'\n')#随机训练集和测试集划分
ss= ShuffleSplit(n_splits=4,test_size=0.25,random_state=0)
print("ss")
for train,test in ss.split(X,y):print('Train:%s | Test:%s '%(train,test),'\n')
'''''''''''''''''''''''''''''''''适合样本便签分类不均匀的数据集'''
#sK折,K折的变种,主要不同为数据集的标签分布与训练集的各个标签类别基本一致
x2 = np.ones(10)
y2 = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
sf = StratifiedKFold(n_splits =3,random_state=0)
print("St")
for train,test in sf.split(x2,y2):print('Train:%s | Test:%s '%(train,test),'\n')#SSS折,SS折的变种,主要不同为数据集的标签分布与训练集的各个标签类别基本一致
sss = StratifiedShuffleSplit(n_splits =3,test_size=2)
print("Sss")
for train,test in sss.split(x2,y2):print('Train:%s | Test:%s '%(train,test),'\n')
'''''''''''''''''''''''''''''''''适合样本以组为分类的数据集'''
from sklearn.model_selection import GroupKFold,LeaveOneGroupOut,LeavePGroupsOut,GroupShuffleSplit
x3 = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]
y3 = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"]
groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]#gk折,k折的变种,主要不同为数据集的标签分布与组类别有关
gkf = GroupKFold(n_splits =3 )
print("gkf")
for train,test in gkf.split(x3,y3,groups= groups):print('Train:%s | Test:%s '%(train,test),'\n')#gloo折,loo折的变种,主要不同为数据集的标签分布与组类别有关
gLOO = LeaveOneGroupOut( )
print("gLOO")
for train,test in gLOO.split(x3,y3,groups= groups):print('Train:%s | Test:%s '%(train,test),'\n')#glPo折,lPo折的变种,主要不同为数据集的标签分布与组类别有关
gLPO = LeavePGroupsOut(n_groups = 2)
print("gLPO")
for train,test in gLPO.split(x3,y3,groups= groups):print('Train:%s | Test:%s '%(train,test),'\n')#gss折,LeavePGroupsOut和Shuffle的组合
x4 = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 0.001]
y4 = ["a", "b", "b", "b", "c", "c", "c", "a"]
groups = [1, 1, 2, 2, 3, 3, 4, 4]
gss = GroupShuffleSplit(n_splits=4, test_size=0.2, random_state=0)
print("gss")
for train, test in gss.split(x4, y4, groups=groups):print("%s  %s" % (train, test))
'''''''''''''''''''''''''''''''''适合样本基于时间序列的数据集'''
from sklearn.model_selection import TimeSeriesSplit
x5 = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y5 = np.array([1, 2, 3, 4, 5, 6])tss = TimeSeriesSplit(n_splits=3)
print(tss)
TimeSeriesSplit(max_train_size=None, n_splits=3)
print("tss")
for train, test in tss.split(x5):print("%s  %s" % (train, test))

其实总结可知:上述方法主要分为5类,K折和RK折、LOO折、LPO折、SS折。其余均是基于样本数据标签的分布或者其他原因的变种方法。

 

三、基于时间序列的数据集划分

从上述基于时间序列的数据集划分的时候,发现只能从过去N个时刻(N可自行设置)预测未来1个时刻的数据,不能满足我们想要的过去N个时刻预测未来M个时刻的数据,当然了大佬可以自行写代码完成,但是对于我等小弟最好是找个现成成熟的代码来完成。由于涉及到相应的商业机密,不能将源代码放出来,不过可以将相应的参考链接给出来,可以自行优化即可。

https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/

四、总结:

从数学角度来说,交叉验证以及数据清洗都是更准确的生成放入模型进行训练的X和Y罢了。。。

参考文献:

1.https://sklearn.apachecn.org/docs/0.21.3/30.html

2.https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/

3.https://blog.csdn.net/weixin_39306118/article/details/89527635

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

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

相关文章

敏捷项目开源管理软件ScrumBasic(2)- 多项目支持

1.加入Project对象模型 public class Project{[Key][MaxLength(32)]public string ID { get; set; }public string Name { get; set; }public int Order { get; set; }public ICollection<UserStory> Stories { get; set; }public ApplicationUser Creator { get; set; }…

postgresql表和列注释(描述)

2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL添加表和列注释。本文为测试表test&#xff0c;默认无注释。 test# \d关联列表架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 -------------------------------------------------public | test | …

Fifth scrum meeting - 2015/10/30

概述 从昨天开始&#xff0c;我们的开发工作终于进入了正轨&#xff0c;由于之前没有mooc服务器API接口&#xff0c;一些工作无法进行。 因为我们团队开始开发较晚&#xff0c;因此我们将开发阶段的截至时间定为了下周五&#xff0c;测试阶段则压缩为下周周六和周日两天。 我们…

计算机加入域 不能访问网络位置 解决办法

计算机加入域 不能访问网络位置 解决办法 启动以下服务 本文转自 onesthan 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/91xueit/1660286&#xff0c;如需转载请自行联系原作者

Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下&#xff1a; 景物(SCENE)通过镜头&#xff08;LENS&#xff09;生成的光学图像投射到图像传感器(Sensor)表面上&#xff0c;然后转为电信号&#xff0c;经过A/D&#xff08;模数转换&#xff09;转换…

win10 下pycharm+anaconda 编译生成pyd文件

由于生产部署的问题&#xff0c;需要把用python写的深度学习代码编译为可被调用的文件。上网搜索了下&#xff0c;暂时了解到win10下pyd文件比较流行。下面是直接引用某位博主的结论&#xff0c;个人感觉总结的很好。其中Cython库将已有的Python代码转化为C语言的代码&#xff…

JVM(4)之 使用MAT排查堆溢出

为什么80%的码农都做不了架构师&#xff1f;>>> 接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码&#xff1a;   代码中使用了一个无限循环来为list添加对象&#xff0c;如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误&a…

caffe 中的一些参数介绍

转自&#xff1a;http://blog.csdn.net/cyh_24/article/details/51537709 solver.prototxt net: "models/bvlc_alexnet/train_val.prototxt" test_iter: 1000 # test_interval: 1000 # base_lr: 0.01 # 开始的学习率 lr_policy: "step" # 学习率的…

python 制作二进制文件数据集(bin)

为了方便进行深度学习的程序调用与实现&#xff0c;需要将excel的数据文件转换为二进制文件。好处就是接口统一&#xff0c;读写速度快&#xff0c;节约空间。 一、调用库 使用xlrd读入execel表格&#xff0c;经过处理后转换为对应的dataframe结构&#xff0c;再使用pickle库…

远程连接mysql数据库注意点记录

一、如何新建独立帐号并设置权限 这里我使用Navicat作为我的数据库管理工具&#xff0c;打开Navicat。 选择“用户”--“新建用户” 输入用户名、主机、密码&#xff0c;需要注意的是&#xff0c;主机那不是写“localhost”&#xff0c;而是写“%” 然后可以设置“服务器权限”…

【域控管理】父域的搭建

从这篇博文开始&#xff0c;所有的域控系统都是在虚拟机中创建的。 在VM里安装Windows Server 2008 R2的方法就不多说了&#xff0c;无脑式安装&#xff0c;略过不提。 进到系统桌面&#xff0c;打开本地连接&#xff0c;设置网卡的IP地址&#xff0c;如下图&#xff1a; 注意&…

tensorflow2 tensorboard可视化使用

tensorflow2自带tensorboard&#xff0c;所以不必再自行安装tensorboard。 一、使用环境 win10 x64&#xff1b; anaconda3tensorflow2&#xff08;cpu版本&#xff09; 二、使用 1.在模型训练之前插入以下代码 log_dir os.path.join(logs) #win10下的bug&#xff0c; if…

IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)...

首先了解一下CGContextRef: An opaque type that represents a Quartz 2D drawing environment. Graphics Context是图形上下文,可以将其理解为一块画布,我们可以在上面进行绘画操作,绘制完成后,将画布放到我们的view中显示即可,view看作是一个画框. 自己学习时实现的demo&…

eclipse maven jetty插件方式启动项目

2019独角兽企业重金招聘Python工程师标准>>> 1. 2.点击run即可启动项目 参考:maven命令具体含义请自行百度.例子:maven clean的作用 / maven djetty 转载于:https://my.oschina.net/u/3146772/blog/1576710

AWS S3 Windows系统下的文件夹上传基于python

AWS S3 上传文件&#xff0c;基于cmd命令行发现无法上传文件夹&#xff0c;只能上传单个文件&#xff0c;不知道是我能力不行还是什么原因&#xff0c;如果有大佬了解的可以在下面评论下! 一、环境配置 1.win10 X64&#xff1b; 2.awscli 1.18.91 3.python&#xff08;程序…

windows系统环境变量过长解决方案(PATH too long installer unable to modify Path)

在按照官方文档安装PCL库时&#xff0c;发现如下danteng的错误&#xff0c;内心极度崩溃&#xff01;以前也遇到过&#xff0c;当时暂时解决了该问题&#xff0c;现在又遇到了重新解决一次&#xff0c;为了方便以后遇到该问题时不再不知所措&#xff0c;现做个笔记&#xff01;…

【数据结构作业—02】双链表

2.实现下述要求的Locate运算的函数 问题描述 设有一个带表头结点的双向链表L&#xff0c;每个结点有4个数据成员&#xff1a;指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate (L,…

第9章 接口

1、抽象类&#xff1a; 包含抽象方法的类叫抽象类&#xff0c;如果一个类包含一个或多个抽象方法(abstract void f();)&#xff0c;该类必须被限定为抽象的&#xff0c;否则编译出错。 1、抽象类不能被实例化&#xff0c;实例化的工作应该交由它的子类来完成&#xff0c;它只需…

用node-webkit(NW.js)创建桌面程序

以往写windows桌面程序需要用MFC、C#之类的技术&#xff0c;那么如果你只会web开发技术呢&#xff1f;或者说你有一个网站&#xff0c;但是你想把你的网站打包成一个桌面应用程序&#xff0c;该如何做呢&#xff1f; 答案就是用node-webkit这个开源框架&#xff0c;他封装了web…

kindeditor用法简单介绍(转)

1&#xff0c;首先去官网下载http://www.kindsoft.net/ 2&#xff0c;解压之后如图所示&#xff1a; 由于本人做的是用的是JSP&#xff0c;所以ASP,PHP什么的就用不上了&#xff0c;直接把那些去掉然后将整个文件夹扔进Myeclipse&#xff0c;如图&#xff1a; 里面有个报错&am…