深入浅出Python机器学习
上QQ阅读APP看书,第一时间看更新

3.3.2 生成训练数据集和测试数据集

在我们创建一个能够自动将酒进行分类的机器学习的算法模型之前,先要能够对模型的可信度进行评判,否则我们无法知道它对于新的酒所进行的分类是否准确。那么问题来了,如果我们用生成模型的数据去评估算法模型,那得分肯定是满分,这就好像我们按照一个体重75kg的人的身材数据缝制了一件衣服,那么这件衣服对于这个人肯定是百分之一百合身的,但如果换了一个体重85kg的人,这件衣服就不一定合适了。

所以我们现在要做的工作是,把数据集分为两个部分:一部分称为训练数据集;另一部分称为测试数据集。训练数据集就好比我们缝制衣服时所用到的模特的身材,而测试数据集则是用来测试这件衣服,对于别人来说究竟有多合身的模特。

在scikit-learn中,有一个train_test_split函数,它是用来帮助用户把数据集拆分的工具。其工作原理是:train_test_split函数将数据集进行随机排列,在默认情况下将其中75%的数据及所对应的标签划归到训练数据集,并将其余25%的数据和所对应的标签划归到测试数据集。

注意 我们一般用大写的X表示数据的特征,而用小写的y表示数据对应的标签。这是因为X是一个二维数组,也称为矩阵;而y是一个一维数组,或者说是一个向量。

接下来,我们使用train_test_split函数将酒的数据集中的数据分为训练数据集和测试数据集。在Jupyter Notebook中输入代码如下:

#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#将数据集拆分为训练数据集和测试数据集
X_train, X_test, y_train, y_test = train_test_split(
wine_dataset['data'], wine_dataset['target'], random_state=0)

此时,我们已经对酒数据集完成了拆分。在上述代码中,我们看到了一个参数称为random_state,并且我们将它指定为0。这是因为train_test_split函数会生成一个伪随机数,并根据这个伪随机数对数据集进行拆分。而我们有时候需要在一个项目中,让多次生成的伪随机数相同,方法就是通过固定random_state参数的数值,相同的random_state参数会一直生成同样的伪随机数,但当这个值我们设为0,或者保持缺省的时候,则每次生成的伪随机数均不同。

下面我们看一看train_test_split函数拆分后的数据集大概是什么情况,在Jupyter Notebook中输入代码如下:

运行代码,得到结果如图3-19所示。

图3-19 经过拆分的训练集与测试集的数据形态

【结果分析】此刻我们可以看到在训练数据集中,样本X数量和其对应的标签y数量均为133个,约占样本总量的74.7%,而测试数据集中的样本X数量和标签y数量均为45个,约占样本总数的25.3%。同时,不论是在训练数据集中,还是在测试数据集中,特征变量都是13个。