试想现在收手拿到了数据集,希望做有监督训练。 需要将数据集分成训练集和测试集。 你会怎么做?
rand一个不重复的序列,然后按照比例截断。按照序列找到对应的行数作为训练集或者数据集。好吧,你是按照np array的格式写的。万一来了个dataframe的格式。 嗯把他转换一下,要么就用iloc定个位。 可是万一数据集格式不确定呢?来了个list。 想想都烦躁是不是。
这时候,你需要一个划分数据集的好帮手。sklearn.model_selection.train_test_split
有了它,朋友们注意了:什么np.array,scipy-sparse matrices 或者 pd.dataframe 统统搞定
其调用方式为sklearn.model_selection.train_test_split(*arrays, options)
*arrays: 可以是lists, np.array,scipy-sparse matrices 或者pd.dataframe(很全有没有)
下面就是option里的内容
test_size: float 代表比例必须是[0,1]之间,代表测试集占总数据集的比例。也可以是int 代表测试集的实际数量。如果给的是None, 所有的集合都是训练集。 默认为0.25。 但是朋友们注意了在版本0.21之后,只有在train_size(下面会说明这个参数) 不确定的情况下是0.25,不然的话会用全部的集合当成训练集。
train_size:和上面的参数一样,只是这里设置的是训练集的比例或者数量
random_state: 个人理解是随机数种子,必须是int或则None, 指定相同的随机数种子可以确保每次划分的口径一致
shuffle: 是否重新洗牌,这个参数很有意思,默认为True,在这个情况下,你上面定义的随机数种子才会有用。随机的打乱数据排列, 然后选择。当用False的时候,就是按照数据输入的顺序划分。开头是训练集,末尾是测试集。如果shuffle=False,参数stratify必须是None
stratify: 时候按照一定的比例抽取样本,这个参数很神奇。默认的情况是None, 给值得时候是也很神奇,给的是一个标签序列。比如说,你将原数据集的y标签给入超参。那么随机抽取的样本是按照y标签内样本分布抽取的
举几个例子
通常调用
import sklearn
import numpy as np
x=np.arange(10).reshape(5,2)
y=[1,0,0,0,1]
x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(x,y,test_size= 0.3,random_state=2)
print(x_train)
结果是
array([[2, 3],
[6, 7],
[0, 1]])
如果使用shuffle
x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(x,y,test_size= 0.3,random_state=2,shuffle=False)
print(x_train)
array([[0, 1],
[2, 3],
[4, 5]])
在这里random_state不起作用了
如果要求划分的集合按照输入y值得分布
x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(x,y,test_size= 0.3,random_state=2,stratify=y)
print(x_train)
array([[4, 5],
[0, 1],
[6, 7]])