[机器学习笔记] 将数据拆分成训练集和测试集的几种方法
问题描述:
一般情况下, 我们习惯将原始数据中的80% 作为训练集, 20% 作为测试集(当数据量足够大的时候,也可以将10% 作为测试集。 数据量较小时,如果每次都是随机划分训练集,执行多次训练后,模型可能就获取了完成是数据集。这是我们想要避免的。
解决上述的问题的方案有以下几种:
- 将第一次运行产生的测试集和训练集保存,后续训练时,先加载保存的训练集和测试集数据
- 设置 random_state, 保证每次分配的测试集相同
- 上述两种方法,当原始数据集增加后,仍然会出现测试数据和训练数据混合的问题,所以当原始数据集会不断增加时,可以将数据集中的某个字段转换成标识符,再将标识符转成哈希值,如果哈希值 < 最大哈希值 * 20%, 则将放入测试集
方法 2 对应代码如下:
from sklearn.model_selection import train_test_split
# 设置测试集大小为20%的原始数据, 设置random_state可以保证每次执行训练时,拆分得到的训练集和测试集都相同, random_state 可以设置成任意整数,只要每次训练使用的值相同即可
train_test_split(data, test_size=0.2, random_state=42)
或者使用numpy 生成随机的无序序列,来划分测试集和训练集
def split_train_test(data, test_ratio):np.random.seed(42)shuffled_indices = np.random.permutation(len(data)) # 生成和原数据等长的无序索引test_set_size = int(len(data) * test_ratio)test_indices = shuffled_indices[:test_set_size]train_indices = shuffled_indices[test_set_size:]return data.iloc[train_indices], data.iloc[test_indices]
方法3 对应代码如下:
# 划分训练集和测试集 - 方法三
# 目前被选为测试集的数据,再数据增加之后, 要保证也不会被选择为训练集
# 可以根据某个稳定的特征来创建唯一的标识符,比如id
def test_set_check(identifier, test_ratio):return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2 ** 32def split_train_test_by_id(data, test_ratio, id_column):ids = data[id_column]in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio))return data.loc[~in_test_set], data.loc[in_test_set]
问题描述:
比如我们想要做一次抽样调查,已知人口中男女比例为47% : 53%, 那么我们的抽样数据中的男女比例也需要保持这样的比例,上述的随机抽样方式显然不满满足这个需求。将人口划分为均匀子集,每个子集称为一层,然后从每层抽取正确的数据量,以确保测试集代表了总的人口比例,这个过程就是分层抽样。
# 比如下面预测房价的例子,我们已知收入和房价强相关,但是收入是连续值,我们先将收入数据划分为5档。
from matplotlib import pyplot as plt
housing['income_cat'] = pd.cut(housing['median_income'], bins=[0., 1.5, 3.0, 4.5, 6., np.inf], labels=[1, 2, 3, 4, 5]) # 将收入数据划分为5档
housing['income_cat'].hist() # 画出直方图
plt.show()# n_splits=1 表示分成1份, 测试集大小为20%, random_state=42 保证每次训练模型产生的测试集和训练集都不变
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(housing, housing['income_cat']): # 根据收入类别进行分类strat_train_set = housing.loc[train_index]strat_test_set = housing.loc[test_index]# 查看测试集中收入类别比例分布
print('分层抽样的收入类别比例分布:')
print(strat_test_set['income_cat'].value_counts() / len(strat_test_set))print('原数据中收入类别的比例分布:')
print(housing['income_cat'].value_counts() / len(housing))
可以看到执行分层抽样后各个收入类别的比例和原始数据一致
分层抽样的收入类别比例分布:
3 0.350533
2 0.318798
4 0.176357
5 0.114583
1 0.039729
Name: income_cat, dtype: float64
原数据中收入类别的比例分布:
3 0.350581
2 0.318847
4 0.176308
5 0.114438
1 0.039826
Name: income_cat, dtype: float64
[机器学习笔记] 将数据拆分成训练集和测试集的几种方法相关推荐
- Scikit-learn API:train_test_split函数 将数据分割为训练集和测试集
函数原型 sklearn.model_selection.train_test_split(*arrays, **options) 函数功能 将数组或矩阵随机的分割成训练集和测试集,注意这里是随机的. ...
- R语言实现数据抽样创建训练集和测试集
主要参考<数据挖掘:R语言实战>(黄文,王正林编著) 在收集数据过程中,绝大多数情况下,并不采取普查的方式获取总体中所有样本的数据信息,而是以各类抽样方法抽取其中若干代表性样本来进行数据获 ...
- 处理训练集和测试集分布同的方法(对抗训练)
https://www.kaggle.com/c/santander-value-prediction-challenge 在kaggle该题中,需要通过所给的匿名变量来预测target值 featu ...
- python机器学习 train_test_split()函数用法解析及示例 划分训练集和测试集 以鸢尾数据为例 入门级讲解
文章目录 train_test_split()用法 获取数据 划分训练集和测试集 完整代码脚手架 train_test_split()用法 python机器学习中常用 train_test_split ...
- 机器学习中训练集和测试集归一化(matlab版)
转载自 https://blog.csdn.net/lkj345/article/details/50352385 背景介绍: 归一化后加快了梯度下降求最优解的速度,归一化有可能提高精度. 训练集 ...
- 5.sklearn之转换器(划分训练集和测试集、以及标准化、归一化数据会用transform,独热编码也会用到)
文章目录 1. 什么是转换器? 2. 测试集和训练集 2.1 训练集 .测试集.验证集 2.2 拆分训练集测试集有个问题 2.3 代码 3. 标准化 3.1 上离差标准化代码(举一反三就好了,其他几个 ...
- fgvc-aircraft-2013b飞机细粒度数据训练集和测试集划分python代码
fgvc-aircraft-2013b是细粒度图像分类和识别研究中经典的benchmarks,它包含四种类型的标注: (1)按照manufacturer进行划分,可分为30个类别,例如ATR.Airb ...
- 31,32,33_过拟合、欠拟合的概念、L2正则化,Pytorch过拟合欠拟合,交叉验证-Train-Val-Test划分,划分训练集和测试集,K-fold,Regularization
1.26.过拟合.欠拟合及其解决方案 1.26.1.过拟合.欠拟合的概念 1.26.1.1.训练误差和泛化误差 1.26.1.2.验证数据集与K-fold验证 1.26.1.3.过拟合和欠拟合 1.2 ...
- oxford5k和paris6k数据集介绍_sklearn函数:KFold(分割训练集和测试集)
上一篇介绍了train_test_split函数: 橘猫吃不胖:sklearn函数:train_test_split(分割训练集和测试集)zhuanlan.zhihu.com 主要场景是,我们想要将 ...
最新文章
- SpringBoot常见功能特性分析
- 阿里P7/P8学习路线图——技术封神之路
- Feign从配置文件中读取url
- 阿里云 centos mysql_在阿里云的CentOS环境中安装配置MySQL的教程
- 这就是数据分析之数据集成
- 嵌入式操作系统内核原理和开发(基础)
- Maven错误:“No goals have been specified for this build...”问题解决
- PHP连接MYSQL出现乱码的原因与解决方法
- IIS6.0系统日志中出现此错误Timer_MinBytesPerSecond,Timer_ConnectionIdle
- 爬虫python下载视频_利用python爬虫通过m3u8文件下载ts视频
- matlab怎样设置中文界面
- 【Redis 开发与运维】总结篇
- 超全!0基础程序员从入门到工作(持续更新...)
- 电压跟随器的问答汇总
- MarkText常用快捷键
- STM32+W25QXX实现模拟U盘-HAL库
- 中兴oltc320用户手册_中兴OLT常用命令
- Echarts图表及数据刷新问题
- 滚动条自动显示和隐藏
- iOS 冰与火之歌 - 利用 XPC 过 App 沙盒
热门文章
- 百度云盘API文件上传参数详解
- 轩小陌的Python笔记-day26 必备SQL语句、表关系及授权
- 华为云发布代码检查服务;微软向其美国雇员提供“无限制”休假时间;付费版 ChatGPT|极客头条
- MySQL如何配置环境
- 美容美发美甲店做活动效果提升30%的营销方案18个套路
- npm安装慢 ,卡在sill idealTree buildDeps不动
- 15 个 “高效实用” 的Python工具库!
- 3万元微型电动车,能否成为蔚来的“回港”利器?
- Linux根目录下各目录的作用
- 高通量测序数据分析:RNA-seq