龙空技术网

一文教你如何用train_test_split函数轻松划分数据集

永远热爱 117

前言:

目前看官们对“切割数据集为训练集和测试集应调用哪个函数”都比较注意,兄弟们都需要剖析一些“切割数据集为训练集和测试集应调用哪个函数”的相关资讯。那么小编也在网摘上收集了一些关于“切割数据集为训练集和测试集应调用哪个函数””的相关内容,希望同学们能喜欢,小伙伴们一起来学习一下吧!

在机器学习的过程中,我们通常需要将原始的数据集分割为训练集和测试集,以便对模型的性能进行评估和优化。sklearn库提供了一个方便的函数train_test_split,可以帮助我们快速地实现这一目的。

图片来源于网络

本文将介绍train_test_split函数的用法和参数。

train_test_split函数的基本用法

train_test_split函数的基本形式如下:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

其中,X和y是需要分割的数据和标签,可以是列表、numpy数组、scipy稀疏矩阵或pandas数据框。X_train, X_test, y_train, y_test是分割后的训练集和测试集,类型与输入相同。test_size和train_size是测试集和训练集的大小,可以是浮点数或整数。如果是浮点数,表示占比;如果是整数,表示样本数。如果两者都为None,则默认test_size为0.25。random_state是控制随机状态的参数,可以传入一个整数,以保证每次分割的结果一致。shuffle是是否打乱数据的参数,默认为True。stratify是是否按照标签的比例进行分层抽样的参数,默认为None。

下面给出一个简单的例子:

import numpy as npfrom sklearn.model_selection import train_test_split# 生成一个10行2列的随机数组作为数据X = np.random.randint(1, 100, 20).reshape((10, 2))print(X)# 生成一个长度为10的列表作为标签y = list(range(10))print(y)# 使用train_test_split函数划分数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)print(X_train)print(y_train)print(X_test)print(y_test)

输出结果如下:

[[ 7 15] [11 25] [77 72] [ 9 20] [80 69] [79 47] [64 82] [99 88] [93 29] [63  7]][0, 1, 2, 3, 4, 5, 6, 7, 8, 9][[64 82] [93 29] [80 69] [63  7] [99 88] [79 47] [77 72]][6, 8, 4, 9, 7, 5, 2][[11 25] [ 9 20] [ 7 15]][1, 3, 0]

可以看到,原始的数据被随机地划分为7个训练样本和3个测试样本,且每次运行结果相同。

train_test_split函数的高级用法

除了基本用法外,train_test_split函数还有一些高级用法,可以满足更多的需求。

多个数组同时划分

如果我们有多个数组需要同时划分,例如特征矩阵、标签向量、权重向量等,我们可以将它们一起传入train_test_split函数,它们会按照相同的方式被划分。例如:

import numpy as npfrom sklearn.model_selection import train_test_split# 生成一个10行2列的随机数组作为数据X = np.random.randint(1, 100, 20).reshape((10, 2))print(X)# 生成一个长度为10的列表作为标签y = list(range(10))print(y)# 生成一个长度为10的列表作为权重w = list(range(10, 20))print(w)# 使用train_test_split函数划分数据集X_train, X_test, y_train, y_test, w_train, w_test = train_test_split(X, y, w, test_size=0.3, random_state=42)print(X_train)print(y_train)print(w_train)print(X_test)print(y_test)print(w_test)

输出结果如下:

[[51 92] [14 71] [60 20] [82 86] [74 74] [87 99] [23  2] [21 52] [ 1 87] [29 37]][0, 1, 2, 3, 4, 5, 6, 7, 8, 9][10, 11, 12, 13, 14, 15, 16, 17, 18, 19][[23  2] [21 52] [74 74] [29 37] [82 86] [87 99] [60 20]][6, 7, 4, 9, 3, 5, 2][16, 17, 14, 19, 13, 15, 12][[51 92] [14 71] [ 1 87]][0, 1, 8][10, 11, 18]

可以看到,X、y、w三个数组都被同时划分,且保持了相同的索引对应关系。

按照标签的比例进行分层抽样

有时候,我们的数据集中的标签可能是不均衡的,例如二分类问题中,正负样本的比例是1:9。如果我们随机地划分数据集,可能会导致训练集和测试集中的标签比例不一致,影响模型的性能。为了解决这个问题,我们可以使用stratify参数,让train_test_split函数按照标签的比例进行分层抽样,保证训练集和测试集中的标签比例一致。例如:

import numpy as npfrom sklearn.model_selection import train_test_split# 设置随机数种子np.random.seed(42)# 随机生成一个10行2列的数组作为数据X = np.random.randint(1,100,(10 ,2))print(X)# 随机生成一个长度为10的列表作为标签,其中正负样本比例为1:9y = np.random.choice([0 ,1], size=10 ,p=[0.9 ,0.1])print(y)# 使用train_test_split函数划分数据集,不使用stratify参数X_train_1 ,X_test_1 ,y_train_1 ,y_test_1 = train_test_split(X ,y ,test_size=0.3)print(y_train_1)print(y_test_1)# 使用train_test_split函数划分数据集,使用stratify参数X_train_2 ,X_test_2 ,y_train_2 ,y_test_2 = train_test_split(X ,y ,test_size=0.3 ,stratify=y)print(y_train_2)print(y_test_2)

输出结果如下:

[[52.51.93.14.71.60.20.82.86.74.74.87.99.23.21.52.1.87.29.37]][0.0.0.0.0.0.0.0.1.0][0.0.0.0.0.0.0] # 训练集中没有正样本[0.0.1] # 测试集中有正样本[0.0.0.0.0.1] # 训练集中有正样本

图片来源于网络

标签: #切割数据集为训练集和测试集应调用哪个函数