书中介绍了一个典型偏误“数据窥探偏误”,这里先解释一下:人脑容易过度匹配,当发现某些数据模式有特征时,可能就会只训练某些有特征的数据,而这些数据很有可能不代表普遍规则,如果机器学习算法采用这些数据做训练,就会导致结果可能很好,但是在预测实际内容时,会缺乏泛化能力。我们需要科学的数据划分!
数据集划分:训练集(训练+验证)、测试集
假设数据量较大5000-10000内,可以用随机选择的方式,按照训练80%,测试20%进行分布。假设数据量在100000以上,可以考虑将训练集的比例增加,测试集比例降低。如果数据很少,则随机选择数据划分可能存在问题,要按照一定规则分布的规律中进行抽样选择。以房屋价格预测为例,预测的价格与人们的收入中位数属性密切相关,因此我们应该以收入中位数的属性特征进行样本的划分:
上图是收入中位数数据,我们可以看出,收入在2-4人数比较多,同时看出基本上在收入上是一个连续的分布,不能进行一个分层的抽样,因此,我们应该将上述数据进行一个划分,分成5类或者6类(这个分类可以自己定)。
操作步骤:1、使用numpy框架的ceil()函数进行取整操作
2、然后使用where()函数,将取整后的类别值大于5的类别统一归为类别
上述操作我们获得了一个分类标签属性“income_cat”,注意这个标签只是为了区别各个数据的收入中位数类别,因此这个标签可以在使用完毕之后进行删除。
使用sklearn框架中的Stratified-Shuffle Split类可以进行分层抽样。
上面的语句的意思是首先对需要分层的类别进行一个预设置,然后通过一个for循环按照数据中的“income_cat”属性中的分层情况进行划分,得出分布一样训练集和测试集。具体的类别怎么操作,请查阅链接
使用pandas.DataFrame中的drop()可以将函数中的某个属性进行删除,因此我们在使用完“income_cat”后在测试集中与训练集中将该属性删除:
至此,我们按照科学的方式对数据进行了划分,使得测试集与训练集的分布一致,这是一个合理科学的划分方式。
当我们将测试集与训练集划分好后,测试集不宜改动,我们应该重点关注训练集,并从中获取更多的易于构建我们机器学习系统的信息。
训练集的探索:
首先,创建一个训练集副本!任何探索都不能改变原始数据集合,应该创建副本,在副本上进行探索!使用copy()函数进行拷贝。
还是回归到数据集的属性上,“longitiude”与“latitude”是经纬度,这个数据是不会变的,相比其他的数据来说,这个数据在显示上更容易,因此我们可以对该数据进行可视化操作。
plot()函数是绘图函数,具体的介绍,请看链接