Sklearn : train_test_split()函数的用法

一、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。

  1. 设置shuffle
    设置shuffle为False,即在拆分数据前,不对原始数据集进行打乱,但是划分结果后的数据按原始数据的顺序排列。
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]]
  1. 设置random_state
    若你仍希望拆分前对原始数据集进行打乱处理,又希望每次重复执行你的代码时,划分后的数据能够相同,此时就可以设置rrandom_state,至于设置为多少我还没有搞懂,根据经验在1到10随便设置选一个整数就OK,结果没有影响。
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]]
  1. 设置stratify
    如果你的数据压根没有标签,就不用管这个参数;如果有标签,假设标签分别为0和1,表示正负样本,设置stratify就可以保证划分后的训练集和测试集中正负样本的比例近似相同。
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]

你可能感兴趣的:(sklearn,python,机器学习)