“bedrooms_per_room”与房屋中位数属性相关度比其他大部分属性高,说明新属性的创造是有效的。
五、机器学习算法的数据准备
针对给机器学习算法的数据准备,我认为有以下几个方面:
不完全数据的合理补全
非数值属性的变换
新增新属性,删除相关性差的属性
数据数值的合理化(归一化、均值化等)
从技术的角度,我们应该采用一套自动化的数据转换,而不是每次都手动转换。原因有以下几点:
可以在任意数据集上重现转换(比如:获得更新的数据库之后)
逐渐建立起一个转换函数的函数库,可重用
在实时系统中使用这些函数来转换新数据再给算法
可尝试多种转换系统,查看哪个转换组合最佳
首先,同样创建一个去除预测值的训练集(X_Train),将预测值传入新的list中(Y_train)。
准备工作完毕后,正式开始:
不完全数据的合理补全:
从之前的info()函数,我们已经得出有些数据是不全的,比如“total_bedrooms”。有三种办法对该属性值进行处理:
放弃缺失的地区
放弃该属性
将缺失值设置为某一个合理值
由于这个属性缺失数量比较小,因此打算采用第三种方式进行。
sklearn中的Imputer类可以处理该问题,首先应创建该类实例。由于这个类处理时需要纯数值的数据,因此我们要预先将非数值的数据进行删除后再做处理:
Imputer.fit()是计算各属性的策略值,并保存在imputer.statistics_中。这样做的好处就是我们不知道未来的数据中哪个部分存在缺失,我们可以针对这些缺失做出处理。
然后开始替换:
这个imputer实例将把housing_num中的缺失值替换为之前计算好的数值。转换后的X是一个numpy框架定义的数组,如果想转换为pandas的DataFrames,可以进行如下操作:
文本数据的处理:
“ocean_proximity”是一个文本属性,要变为数值属性,算法才能更好的工作。
sklearn中的LabelEncoder是实现这个功能的类。
废话不多说,直接上代码,马上就懂:
从结果可以发现,这个函数的功能是将文本集合映射为数字的过程。这个映射为:
内容和序号实现了映射,0对应‘1H OCEAN’,以此类推。
这里,我们需要考虑一个问题:映射的方式是没有错的,但是毕竟是数值,数值就存在大小,从数值上说1就是比4小,因此这个差异可能会导致学习算法的精准度,因此采用one-hot编码更好些!如果不晓得,请点此链接查询。
sklearn类提供了一个OneHotEncoder类来提供此服务。
先上代码,然后解释:
reshape()函数是将numpy数组的形状进行转换,这里的-1需要解释一下:一个参数为-1时,那么reshape函数会根据另一个参数的维度计算出数组的另外一个shape属性值。
fit_transform()函数是将fit()函数和transform()函数结合的函数,它的作用是先将数据做规则的操作,然后再对数据转换为标准形式。
housing_cat_1hot将会转变为一个scipy的矩阵,是一个稀疏的矩阵。当然如果需要转换为numpy类型的矩阵,只需要做如下操作: