昨天是1.11,小光棍节,应该昨天发这篇才应景。算了,今天我们聊切数据。
第一个问题是:数据为什么要切呢?
这和模型训练的不同阶段有关。机器学习实际上需要用到至少两套数据集,分别为训练集和测试集,顾名思义,模型训练使用训练集,评估模型的好坏则使用测试集。
那么,这就有一个问题了。
数据的收集可没分什么训练测试,都是采集一条就录入一条,最后形成的是一个完整的数据集。
举个例子好了。这两天都在玩加州房价数据集,今天扒了扒,发现sklearn自己就带了一套类似的数据集,叫波士顿房价数据集(boston house-prices dataset),连下载都免了。今天就用它。
使用方法很简单。调用load_boston,就能得到array类型的数据集:
from sklearn import datasets
X,y = datasets.load_boston(return_X_y=True)
值得一讲的估计只有这个return_X_y=True,这也是这个API唯一的参数。
先讲一下这个波士顿房价数据集,一共506个样本,分成了两个array,一个array包含13个维度,名称和含义依次分别如下:
CRIM per capita crime rate by town
ZN proportion of residential land zoned for lots over 25,000 sq.ft.
INDUS proportion of non-retail business acres per town
CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
NOX nitric oxides concentration (parts per 10 million)
RM average number of rooms per dwelling
AGE proportion of owner-occupied units built prior to 1940
DIS weighted distances to five Boston employment centres
RAD index of accessibility to radial highways
TAX full-value property-tax rate per $10,000
PTRATIO pupil-teacher ratio by town
B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
LSTAT % lower status of the population
另一个array只有一个维度,记录的内容名叫MEDV ,意思是“Median value of owner-occupied homes in $1000’s”,简单来说就是价钱。
这个数据集明码实价,就是用来喂回归模型的,要预测的标的自然就是这个MEDV 。不过,有监督学习得先把参考答案蒙上,为了方便操作,数据集提供了参数return_X_y,默认是Fasle,只要设置为True,就会自动把两个array分开,方便训练模型。
现在已知条件和参考答案分开了,可是训练集和测试集还没分开。自己动手撸一段代码实现也不是不行,不过sklearn已经实现了一款趁手工具,大家用过都说好,这就是专业切分数据集的train_test_split。
这款Api名气大得很,几乎提到数据集处理的文章里面都有它。
看一下介绍:
一共6个参数,分为三类。第一个参数自然是输入待切分的数据集了,第二、第三个参数是设置训练集和测试集的大小,剩下三个参数则是调控随机抽样。
简单易懂,后五个参数都有默认值,直接塞入原始数据集看看吧:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)
输出的这四个变量分别是训练集的已知项、测试集的已知项、训练集的预测项和测试集的预测项。
怎么看效果呢?
还记得原始的数据集有506个样本吧,切分之后,训练集有379个样本,测试集则有127个样本。这是因为根据默认设置,训练集和测试集的比例是3:1。
下次再聊。