【Python学习】 - sklearn学习 - 数据集分割方法 - 随机划分与K折交叉划分与StratifiedKFold与StratifiedShuffleSplit

一、随机划分

import numpy as np
from sklearn import datasetsiris = datasets.load_iris()
X = iris.data
y = iris.target# 1)归一化前,将原始数据分割
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2,stratify=y,  # 按照标签来分层采样shuffle=True, # 是否先打乱数据的顺序再划分random_state=1)   # 控制将样本随机打乱

函数声明:train_test_split(test_size, train_size, random_state=None, shuffle=True, stratify=None)

参数说明:

test_size:可以接收float,int或者None。如果是float,则需要传入0.0-1.0之间的数,代表测试集占总样本数的比例。如果传入的是int,则代表测试集样本数,如果是None,即未声明test_size参数,则默认为train_size的补数。如果train_size也是None(即两者都是None),则默认是0.25。

train_size:和前者同理。

random_state:可以接收int,随机种子实例,或者None。random_state是随机数生成器使用的种子,如果是None则默认通过 ' np.random ' 来生成随机种子。

stratify:接收一个类数组对象 或 None。如果不为None,则数据将以分层的方式进行分割,使用这个作为分类标签。(找了半天关于分层的方式进行分割的具体说明,总算找到个像样的,见下文)

shuffle: 默认是True,是否在分割之前重新洗牌数据。如果shuffle = False那么stratify必须是None。

关于stratify参数的详细说明:

stratify是为了保持split前类的分布。比如有100个数据,80个属于A类,20个属于B类。如果train_test_split(… test_size=0.25, stratify = y_all), 那么split之后数据如下:
training: 75个数据,其中60个属于A类,15个属于B类。
testing: 25个数据,其中20个属于A类,5个属于B类。

用了stratify参数,training集和testing集的类的比例是 A:B= 4:1,等同于split前的比例(80:20)。通常在这种类分布不平衡的情况下会用到stratify。

将stratify=X_data(数据)就是按照X中的比例分配

将stratify=Y_data(标签)就是按照y中的比例分配

一般来说都是 stratify = y 的

 

二、K折交叉划分

传送门

 

定义与原理:将原始数据D随机分成K份,每次选择(K-1)份作为训练集,剩余的1份(红色部分)作为测试集。交叉验证重复K次,取K次准确率的平均值作为最终模型的评价指标。过程如下图所示,它可以有效避免过拟合和欠拟合状态的发生,K值的选择根据实际情况调节。

 

注意这两句是等价的。而使用参数average='macro'或者'weighted'是不等价的
print(precision_score(y_test, y_pred,average='micro'))
print(np.sum(y_test == y_pred) / len(y_test))

K-Fold是最简单的K折交叉,n-split就是K值,shuffle指是否对数据洗牌,random_state为随机种子
K值的选取会影响bias和viriance。K越大,每次投入的训练集的数据越多,模型的Bias越小。但是K越大,又意味着每一次选取的训练集之前的相关性越大,而这种大相关性会导致最终的test error具有更大的Variance。一般来说,根据经验我们一般选择k=5或10。

 

 使用iris数据集进行简单实战:

import numpy as np
from sklearn import datasetsiris = datasets.load_iris()
X = iris.data
y = iris.targetfrom sklearn.model_selection import KFold
from sklearn.ensemble import GradientBoostingClassifier as GBDT
from sklearn.metrics import precision_scoreclf = GBDT(n_estimators=100)
precision_scores = []kf = KFold(n_splits=5, random_state=0, shuffle=False)
for train_index, valid_index in kf.split(X, y):x_train, x_valid = X[train_index], X[valid_index]y_train, y_valid = y[train_index], y[valid_index]clf.fit(x_train, y_train)y_pred = clf.predict(x_valid)precision_scores.append(precision_score(y_valid, y_pred, average='micro'))
print('Precision', np.mean(precision_scores))

进一步加深理解K折交叉验证:

 

注意:

1.  for循环中参数如果是两个,则永远都是训练集和验证集的下标!!而不是x和y!!(即不是数据和标签!)

2.  for trn_idx,val_idx in kf.split(X) :,这里可以只有X,没有y!因为如果只需要提取出下标来的话,则和数据标签没啥关系,我只是要分出训练集和验证集!

如果有X和y,则维度必须一致!!否则报错:比如下面这个例子:

输入:XX = np.array(['A','B','C','D','E','F','G','H','I','J'])
yy = np.array(range(15))
kf = KFold(n_splits=2, random_state=0, shuffle=False)for trn_idx,val_idx in kf.split(XX,yy) :# 如果带上y?但是维度不一致?print('验证集下标和验证集分别是:')print(val_idx)print(XX[val_idx])报错:
ValueError: Found input variables with inconsistent numbers of samples: [10, 15]

 

输入:XX = np.array(['A','B','C','D','E','F','G','H','I','J'])
kf = KFold(n_splits=3, random_state=0, shuffle=False)for trn_idx,val_idx in kf.split(XX) :print('验证集下标和验证集分别是:')print(val_idx)print(XX[val_idx])输出:验证集下标和验证集分别是:
[0 1 2 3]
['A' 'B' 'C' 'D']
验证集下标和验证集分别是:
[4 5 6]
['E' 'F' 'G']
验证集下标和验证集分别是:
[7 8 9]
['H' 'I' 'J']
输入:XX = np.array(['A','B','C','D','E','F','G','H','I','J'])
kf = KFold(n_splits=5, random_state=0, shuffle=False)for trn_idx,val_idx in kf.split(XX) :# 如果带上y?但是维度不一致?
# =============================================================================
#     print('训练集下标和训练集分别是:')
#     print(trn_idx)
#     print(XX[trn_idx])
# =============================================================================print('验证集下标和验证集分别是:')print(val_idx)print(XX[val_idx])输出:
验证集下标和验证集分别是:
[0 1]
['A' 'B']
验证集下标和验证集分别是:
[2 3]
['C' 'D']
验证集下标和验证集分别是:
[4 5]
['E' 'F']
验证集下标和验证集分别是:
[6 7]
['G' 'H']
验证集下标和验证集分别是:
[8 9]
['I' 'J']
输入:from sklearn.model_selection import KFold
import numpy as np
x = np.array(['B', 'H', 'L', 'O', 'K', 'P', 'W', 'G'])
kf = KFold(n_splits=2)
d = kf.split(x)
for train_idx, test_idx in d:train_data = x[train_idx]test_data = x[test_idx]print('train_idx:{}, train_data:{}'.format(train_idx, train_data))print('test_idx:{}, test_data:{}'.format(test_idx, test_data))输出:train_idx:[4 5 6 7], train_data:['K' 'P' 'W' 'G']
test_idx:[0 1 2 3], test_data:['B' 'H' 'L' 'O']
train_idx:[0 1 2 3], train_data:['B' 'H' 'L' 'O']
test_idx:[4 5 6 7], test_data:['K' 'P' 'W' 'G']

为了更好的体现当前进行到的组数,可以进行如下更改:

输入:XX = np.array(['A','B','C','D','E','F','G','H','I','J'])
yy = np.arange(10)
kf = KFold(n_splits=2, random_state=0, shuffle=False)
for fold_, (trn_idx,val_idx) in enumerate(kf.split(XX,yy)) :print("fold n°{}".format(fold_+1))print('训练集下标和训练集分别是:')print(trn_idx)print(XX[trn_idx])print('验证集下标和验证集分别是:')print(val_idx)print(XX[val_idx])输出:
fold n°1
训练集下标和训练集分别是:
[5 6 7 8 9]
['F' 'G' 'H' 'I' 'J']
验证集下标和验证集分别是:
[0 1 2 3 4]
['A' 'B' 'C' 'D' 'E']
fold n°2
训练集下标和训练集分别是:
[0 1 2 3 4]
['A' 'B' 'C' 'D' 'E']
验证集下标和验证集分别是:
[5 6 7 8 9]
['F' 'G' 'H' 'I' 'J']

或者这样:

输入:XX = np.array(['A','B','C','D','E','F','G','H','I','J'])
yy = np.arange(10)
num = np.arange(10)
kf = KFold(n_splits=2, random_state=0, shuffle=False)
for fold_, (trn_idx,val_idx) in zip(num,kf.split(XX)) :print("fold n°{}".format(fold_+1))print('训练集下标和训练集分别是:')print(trn_idx)print(XX[trn_idx])print('验证集下标和验证集分别是:')print(val_idx)print(XX[val_idx])输出:fold n°1
训练集下标和训练集分别是:
[5 6 7 8 9]
['F' 'G' 'H' 'I' 'J']
验证集下标和验证集分别是:
[0 1 2 3 4]
['A' 'B' 'C' 'D' 'E']
fold n°2
训练集下标和训练集分别是:
[0 1 2 3 4]
['A' 'B' 'C' 'D' 'E']
验证集下标和验证集分别是:
[5 6 7 8 9]
['F' 'G' 'H' 'I' 'J']

 

三、StratifiedKFold

StratifiedShuffleSplit允许设置设置train/valid对中train和valid所占的比例

# coding = utf-8
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn import datasets
from sklearn.ensemble import GradientBoostingClassifier as GBDT
from sklearn.metrics import precision_scoreiris = datasets.load_iris()
X = iris.data
y = iris.targetx_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.2,stratify=y,  # 按照标签来分层采样shuffle=True, # 是否先打乱数据的顺序再划分random_state=1)   # 控制将样本随机打乱clf = GBDT(n_estimators=100)
precision_scores = []kf = StratifiedShuffleSplit(n_splits=10, train_size=0.6, test_size=0.4, random_state=0)
for train_index, valid_index in kf.split(x_train, y_train):x_train, x_valid = X[train_index], X[valid_index]y_train, y_valid = y[train_index], y[valid_index]clf.fit(x_train, y_train)y_pred = clf.predict(x_valid)precision_scores.append(precision_score(y_valid, y_pred, average='micro'))print('Precision', np.mean(precision_scores))

 

四、StratifiedShuffleSplit

StratifiedShuffleSplit允许设置设置train/valid对中train和valid所占的比例

# coding = utf-8
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn import datasets
from sklearn.ensemble import GradientBoostingClassifier as GBDT
from sklearn.metrics import precision_scoreiris = datasets.load_iris()
X = iris.data
y = iris.targetx_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.2,stratify=y,  # 按照标签来分层采样shuffle=True, # 是否先打乱数据的顺序再划分random_state=1)   # 控制将样本随机打乱clf = GBDT(n_estimators=100)
precision_scores = []kf = StratifiedShuffleSplit(n_splits=10, train_size=0.6, test_size=0.4, random_state=0)
for train_index, valid_index in kf.split(x_train, y_train):x_train, x_valid = X[train_index], X[valid_index]y_train, y_valid = y[train_index], y[valid_index]clf.fit(x_train, y_train)y_pred = clf.predict(x_valid)precision_scores.append(precision_score(y_valid, y_pred, average='micro'))print('Precision', np.mean(precision_scores))

其他的方法如RepeatedStratifiedKFold、GroupKFold等详见sklearn官方文档。

https://www.programcreek.com/python/example/91149/sklearn.model_selection.StratifiedShuffleSplit

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

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

相关文章

【Python学习】 - sklearn - 用于生成数据的make_blobs模块

函数原型: sklearn.datasets.make_blobs(n_samples100, n_features2, centers3, cluster_std1.0, center_box(-10.0, 10.0), shuffleTrue, random_stateNone) 参数含义: n_samples: int, optional (default100) The total number of points equally di…

微服务架构及幂等性

微服务架构 微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。 和 微服务 相对应的,这…

【Python学习】 - Matplotlib二维绘图 - plt.matshow()和plt.imshow()区别对比

给定一个8*8的数据,用两种方式分别进行输出。 xx np.zeros((8,8),dtype np.uint8) xx[0,0] 13im Image.fromarray(xx) plt.imshow(im)plt.matshow(xx) plt.show() 输出: 得出结论: 首先我不知道为啥两个窗口是不一样大的。 其次发现图…

【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化

一、为什么要进行数据归一化 定义:把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程。原则:样本的所有特征,在特征空间中,对样本的距离产生的影响是同级的;问题:特征数字化后,由于取值…

【基于Python】 - 人工智能机器学习深度学习数据分析 - 常见问题,常用的套路与操作(持续更新)

20200221; 1.做分类问题的时候,给定你标签,你想知道每一类标签的出现频数,可以使用这个函数:np.bincount()。 如果想分析一下数据样本是否均衡的时候,可以考虑这种操作,代码十分简明。 2. 当…

Entity Framework 简介

转贴:链接https://www.cnblogs.com/davidzhou/p/5348637.html 侵删,谢谢 第一篇:Entity Framework 简介 先从ORM说起吧,很多年前,由于.NET的开源组件不像现在这样发达,更别说一个开源的ORM框架&#xff0…

【Python学习】 - pyecharts包 - 地图可视化

安装: https://pan.baidu.com/s/1vAlSjVbHt0EDJY6C_38oEA 提取码:t9be 在这个链接中下载对应的.whl文件,放到下图所示的目录中。 然后打开anaconda prompt 找到对应的目录,输入: pip install pyecharts-0.1.9.4-py…

【机器学习】 - 关于图像质量评价IQA(Image Quality Assessment)

图像质量评价(Image Quality Assessment,IQA)是图像处理中的基本技术之一,主要通过对图像进行特性分析研究,然后评估出图像优劣(图像失真程度)。 主要的目的是使用合适的评价指标,使得评价结果…

【机器学习】 - CNN

什么是卷积神经网络,它为何重要? 卷积神经网络(也称作 ConvNets 或 CNN)是神经网络的一种,它在图像识别和分类等领域已被证明非常有效。 卷积神经网络除了为机器人和自动驾驶汽车的视觉助力之外,还可以成功…

Asp.Net中WebForm与MVC,Web API模式对比

webform,web mvc和web api都是asp.net官方的三套框架,想对比下三者的关系,查了下资料,web api跟web mvc基本同属一脉,只是mvc多了一个视图渲染,网上有些博客介绍了webform和mvc底层源码实现的不同&#xff…

【机器学习】 - Keras学习 - TensorBoard模块 - 可视化模型训练过程神器

运行环境:Win10 anaconda3。 TensorFlow版本:2.0.0 import numpy as np import tensorflow as tf import tensorflow.keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import matplotlib.pyplot as…

无废话SharePoint入门教程一[SharePoint概述]

一、前言 听说SharePoint也有一段时间了,可一直处在门外。最近被调到SharePoint实施项目小组,就随着工作一起学习了一下实施与开发。但苦于网上SharePoint入门的东西实在太少,导致自学入门很难,不知道SharePoint这东西到底能做什么…

SharePoint 站点结构及概念

简单的记录一下Sharepoint的结构与基本概念 一、服务器场 服务器场,即主机的集群.简单点说就是两台机器互相备份,两个或几台机器之间有心跳线,定时检测对端设备的情况,如果对端设备出现故障,一台机器就会接管出问题机器的受保护…

【Python学习】 - sklearn学习 - 自带数据集sklearn.datasets.x

sklearn 的数据集有好多个种 自带的小数据集(packaged dataset):sklearn.datasets.load_可在线下载的数据集(Downloaded Dataset):sklearn.datasets.fetch_计算机生成的数据集(Generated Datas…

sharepoint 概念及认证方式介绍

3.SharePoint Web 应用程序 我个人的理解,SharePoint Web 应用程序(SharePoint Web Application)代表的是 SharePoint 网站(集)的物理容器。 SharePoint Web 应用程序需要指定内容数据库、宿主 IIS 应用程序池、应用…

我们可以用SharePoint做什么

前言 不知不觉作为一个SharePoint的开发人员若干年了,从SharePoint api 开始学习,到了解SharePoint的结构,逐渐一点点了解sharepoint的体系;从SharePoint 的2007到2010到2013到SharePoint Online都接触了一些。本文会从个人的视角…

SharePoint REST API - 确定REST端点URL

SharePoint REST端点URI的结构 在你能够通过REST访问SharePoint资源之前,首先你要做的就是找出对应的URI端点,如果你对Client API熟悉,有些时候也可以参考Client API去猜测构建,例如。 客户端对象模型的方法: List.G…

【机器学习】 - 各种人脸数据集下载地址及说明汇总

1. Olivetti Faces人脸数据集 由40个人组成,共计400张人脸; 每人的人脸图片为10张,包含正脸、侧脸以及不同的表情; 整个数据集就是一张大的人脸组合图片,下载地址:https://cs.nyu.edu/~roweis/data/olivet…

【机器学习】 - 激活函数与交叉熵Sigmoid, Softmax, binary_crossentropy, categorican_crossentropy区别

Content: 为什么需要激活函数;一个神经元在做什么;激活函数 SigmoidSoftmax 4. 交叉熵损失函数 Binary cross-entropyCategorican cross-entropy为什么需要激活函数: Ans: 为了引入非线性变换。 如下图所示的红线和蓝线,在这个…

SharePoint 2013 Farm 安装指南——Least Privilege

写过很多关于SharePoint 2013 安装,这是第四篇。可能你会觉得为什么如此简单的安装至于花那么多精力去折腾吗。我的答案是肯定的。知识的积累不是一蹴而就的,而是循序渐进的去学习,每一个阶段都有独立的思考,于是乎第四篇SharePoi…