《机器学习实战(基于scikit-learn和TensorFlow)》第二章内容的学习心得 (5)

image

“bedrooms_per_room”与房屋中位数属性相关度比其他大部分属性高,说明新属性的创造是有效的。

五、机器学习算法的数据准备

针对给机器学习算法的数据准备,我认为有以下几个方面:

不完全数据的合理补全

非数值属性的变换

新增新属性,删除相关性差的属性

数据数值的合理化(归一化、均值化等)

从技术的角度,我们应该采用一套自动化的数据转换,而不是每次都手动转换。原因有以下几点:

可以在任意数据集上重现转换(比如:获得更新的数据库之后)

逐渐建立起一个转换函数的函数库,可重用

在实时系统中使用这些函数来转换新数据再给算法

可尝试多种转换系统,查看哪个转换组合最佳

首先,同样创建一个去除预测值的训练集(X_Train),将预测值传入新的list中(Y_train)。

image

准备工作完毕后,正式开始:

不完全数据的合理补全:

从之前的info()函数,我们已经得出有些数据是不全的,比如“total_bedrooms”。有三种办法对该属性值进行处理:

放弃缺失的地区

放弃该属性

将缺失值设置为某一个合理值

由于这个属性缺失数量比较小,因此打算采用第三种方式进行。

sklearn中的Imputer类可以处理该问题,首先应创建该类实例。由于这个类处理时需要纯数值的数据,因此我们要预先将非数值的数据进行删除后再做处理:

image

Imputer.fit()是计算各属性的策略值,并保存在imputer.statistics_中。这样做的好处就是我们不知道未来的数据中哪个部分存在缺失,我们可以针对这些缺失做出处理。

然后开始替换:

image

这个imputer实例将把housing_num中的缺失值替换为之前计算好的数值。转换后的X是一个numpy框架定义的数组,如果想转换为pandas的DataFrames,可以进行如下操作:

image

文本数据的处理:

“ocean_proximity”是一个文本属性,要变为数值属性,算法才能更好的工作。

sklearn中的LabelEncoder是实现这个功能的类。

废话不多说,直接上代码,马上就懂:

image

从结果可以发现,这个函数的功能是将文本集合映射为数字的过程。这个映射为:

image

内容和序号实现了映射,0对应‘1H OCEAN’,以此类推。

这里,我们需要考虑一个问题:映射的方式是没有错的,但是毕竟是数值,数值就存在大小,从数值上说1就是比4小,因此这个差异可能会导致学习算法的精准度,因此采用one-hot编码更好些!如果不晓得,请点此链接查询。

sklearn类提供了一个OneHotEncoder类来提供此服务。

先上代码,然后解释:

image

reshape()函数是将numpy数组的形状进行转换,这里的-1需要解释一下:一个参数为-1时,那么reshape函数会根据另一个参数的维度计算出数组的另外一个shape属性值。

fit_transform()函数是将fit()函数和transform()函数结合的函数,它的作用是先将数据做规则的操作,然后再对数据转换为标准形式。

housing_cat_1hot将会转变为一个scipy的矩阵,是一个稀疏的矩阵。当然如果需要转换为numpy类型的矩阵,只需要做如下操作:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdzfp.html