一、train_test_split官方文档链接
二、参数介绍
① X :(必需) 待划分的样本集
② y :(非必需) 样本标签target(如果你只是想把数据简单的分为两部分,不涉及分类算法等需要标注数据标签的情况就无须设置)
③ train_size : (非必需) int型或float型,整型表示划分后的数据个数;浮点型表示划分数据的比例。
④ test_size :(非必需) 同上
⑤ random_state :(非必需) int 类型,默认值为None。先笼统的认为是一个控制分裂过程随机性的一个参数。不用管内部实现过程。
⑥ shuffle :(非必需) 默认为True。控制拆分数据前,原始数据集是否需要打乱再拆分。
⑦ stratify :(非必需)
三、自己动手看一下效果
1. 自定义一个数据集:
import numpy as np
x = np.arange(1, 25).reshape(12, 2)
y = np.array([0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0])
print("原始数据集:\n",x)
print("数据标签:\n",y)
输出如下:
原始数据集:
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]
[13 14]
[15 16]
[17 18]
[19 20]
[21 22]
[23 24]]
数据标签:
[0 1 1 0 1 0 0 1 1 0 1 0]
2.先用最简单的执行方式,了解一下各个参数的作用
首先默认一切非必须参数为默认值:
from sklearn.model_selection import train_test_split
x_train,x_test = train_test_split(x)
print("训练数据为:\n",x_train)
print("测试数据为:\n",x_test)
输出如下:
训练数据为:
[[ 9 10]
[13 14]
[ 5 6]
[11 12]
[15 16]
[21 22]
[23 24]
[ 7 8]
[ 1 2]]
测试数据为:
[[17 18]
[19 20]
[ 3 4]]
由于shuffle默认值为True,即原始数据在划分前做了打乱处理,因此分裂后的数据是乱序的。若此时重新执行当前代码,输出结果如下:
训练数据为:
[[ 7 8]
[23 24]
[ 1 2]
[ 3 4]
[19 20]
[15 16]
[21 22]
[17 18]
[13 14]]
测试数据为:
[[11 12]
[ 5 6]
[ 9 10]]
可以发现,输出变了,(emmm,大部分实验场景下,这种每次都变的输入并不利于后续的研究分析,应该避免,但是也不排除有些情况下,就是希望数据每次都不一样,OK,你自己判断一下。我不管。。。)。若要避免这种情况有两种解决方式,分别是设置shuffle和random_state,详情见3、4。
x_train,x_test = train_test_split(x,shuffle=False)
输出结果如下:
训练数据为:
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]
[13 14]
[15 16]
[17 18]]
测试数据为:
[[19 20]
[21 22]
[23 24]]
x_train,x_test = train_test_split(x,random_state=1)
重复执行两次上述代码,划分后的数据集两次相同,输出结果如下:
训练数据为:
[[21 22]
[ 3 4]
[13 14]
[ 1 2]
[15 16]
[23 24]
[19 20]
[17 18]
[11 12]]
测试数据为:
[[ 5 6]
[ 7 8]
[ 9 10]]
x = np.arange(1, 25).reshape(12, 2)
y = np.array([0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0])
x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y)
输出结果如下:
数据标签:
[0 1 1 0 1 0 0 1 1 0 1 0]
训练数据为:
[[21 22]
[ 3 4]
[ 7 8]
[17 18]
[15 16]
[ 1 2]
[ 9 10]
[13 14]
[11 12]]
训练数据标签为:
[1 1 0 1 1 0 1 0 0] #(emmm这里样本总个数太少了,不明显,你可以自己试一下大样本的结果)正负样本比例4/5
测试数据为:
[[23 24]
[ 5 6]
[19 20]]
测试数据标签为: #正负样本比例2/1
[0 1 0]