本篇博客介绍train_test_split,步骤1-4是自己手打代码和思路分享,步骤5介绍如何使用sklearn中的train_test_split,步骤3有介绍随机种子哦,简单易懂,适合小白入门
前言:机器学习就是把数据扔进算法,训练出模型(参数),用模型对未知数据进行预测。
谈一谈为什么要切分数据集:
①如果直接把全部数据都扔给算法得到模型然后再对数据(用于训练模型的数据)进行预测这很容易预测得很好,但对于未知数据却不一定好。
好比:老师布置作业给你做再给你评讲,考试的题目是作业的题目,可想而知大家都会考得很好。但对于作业题目外的考试大家能否考好是未知的,因为有些同学完成作业的题而且把原理搞懂了这些同学对同类型的考试就会考高分;而有些同学只记住老师讲解的过程,不懂原理,这部分同学很容易考低分。
②为了避免这种情况,考试时应该出原理一样但题目不一样的试卷,去检验学生是否明白了原理。类比到机器学习的数据集也是一样的:用一部分数据去训练模型,用不同的数据去预测,看看这个模型是否好。
① 把数据的索引乱序
shuffle_indexes = np.random.permutation(len(X))
② 按乱序的索引取出对应的索引
#按什么比例分割
test_ratio = 0.3
#测试集的大小
test_size = int(test_ratio * len(X))
#测试集的索引
test_indexes = shuffle_indexes[:test_size]
#训练集的索引
train_indexes = shuffle_indexes[:test_size]
③ 按索引取数据集
x_test = X[test_indexes]
x_train = X[train_indexes]
y_test = y[test_indexes]
y_train = y[train_indexes]
test_ratio:分割比例
seed:随机种子
这里谈一下随机种子:用train_test_split分割的数据集是随机取的,设置确定的值是为了两个可以一样。比如同个数据集,我在我的电脑设置随机种子为10,你们也设置为10分割后我们的数据是一样的
import numpy as np
def Train_test_split(x, y, test_ratio, seed):
if seed:
'''设置随机种子'''
np.random.seed(seed)
# 把数据的索引乱序
shuffle_indexes = np.random.permutation(len(x))
#按比例分割
test_size = int(test_ratio * len(x))
#测试集的索引
test_indexes = shuffle_indexes[:test_size]
#训练集的索引
train_indexes = shuffle_indexes[test_size:]
#取数据
x_train = x[train_indexes]
x_test = x[test_indexes]
y_train = y[train_indexes]
y_test = [test_indexes]
return x_train, x_test, y_train, y_test
① 用鸢尾花数据集实战
from sklearn import datasets
import numpy as np
#加载数据
iris = datasets.load_iris()
#初始化X_train和y_train
X = iris.data
print('数据集的大小:',X.shape)
y = iris.target
输出:数据集的大小: (150, 4)
② 切分数据集
x_train, x_test, y_train, y_test = Train_test_split(X, y, test_ratio=0.3, seed=66)
输出:
训练集的大小: (105, 4)
测试集的大小: (45, 4)
① 导入模块
from sklearn.model_selection import train_test_split
② 导入数据集
from sklearn import datasets
import numpy as np
#加载数据
iris = datasets.load_iris()
#初始化X_train和y_train
X = iris.data
y = iris.target
③分割数据集
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=66)