天天看点

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

作者:积极的python程序猿

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

一文教你如何用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 np
from 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 np
from 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 np
from 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:9
y = 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] # 训练集中有正样本           
一文教你如何用train_test_split函数轻松划分数据集

图片来源于网络

继续阅读