本文咱们使用加州住房价格数据集,从零开始,一步一步创建模型,预测每一个区域的房价中位数。目的是完整实现一个机器学习的流程。
数组
问题分析
获取数据
为了方便,我已经事先将数据下载到本地,后台回复“房价”,便可获取。该数据集以每个街区为单位,包含街区的经纬度,居民年龄中位数,总房间数,总卧室数,人口数量,家庭数量,收入中位数,房价中位数,距离海边的描述等信息。街区在后文中也被称为区域,咱们最终是要根据每一个区域的其余特征预测该区域的房价中位数。微信
查看数据的结构
1.使用pandas读取数据,并用head()
方法查看前5行样例。能够看到一共有10个属性(特征)机器学习
2.使用info()
方法查看数据集的总体描述信息
ide
咱们能够得到如下信息:数据集一共包含20640个实例,其中total_bedroom有一些的缺失值。一共有9个float类型的属性,一个object类型的属性,ocean_proximity。学习
3.对于惟一一个分类属性,使用value_counts()
方法查看它的分布状况测试
能够看到,该属性共有5个取值,每一个取值都是字符串类型,后面咱们须要对其进行必定的转换。编码
4.对于数值属性,使用describe()
方法查看摘要,该方法默认处理数值类型的属性spa
结果输出了每一个属性的个数count,平均值mean,标准差std,最小值min,最大值max,还有25%,50%,75%三个百分位数。须要注意这里的空值会被忽略,因此total_bedroom的count值是20433。
.net
5.用直方图观察每一个属性,了解数据的分布状况
(点击查看大图,黑色的坐标轴标签不太容易看)
以其中一个属性median_income为例,从第二行第三列的子图中咱们能够看到,大多数的区域收入中位数约为2-4(单位未知)。收入超过10的区域不多。相似的能够对其余属性有一个认识。
划分训练集和测试集
以上咱们对整个数据集进行了熟悉,包括数据类型,缺失状况。每一个属性单独的取值等等。接下来咱们首先将数据划分为训练集和测试集,为后续创建模型作铺垫。创建模型要在训练集上进行分析,而不关注任何测试集的信息,这样有助于提高模型的泛化能力。须要注意的是,在进行划分时,有纯随机抽样的方式和分层抽样的方式。
1.纯随机抽样
2.分层抽样
这里使用分层抽样须要结合实际的情境。咱们从某渠道了解到,收入中位数对于预测房价的中位数有较大的影响。因此咱们考虑在测试集中,该属性各取值的比例和整个数据集中接近。
因为收入是数值型的,咱们首先须要将其离散化。
上面的代码将收入离散化为5类,输出了每一类的比例。接下来进行分层抽样。
分层抽样获得的start_test_set的不一样收入类别的比例与原数据集几乎一致。而随机抽样的各收入类别的比例则与它们有一些差异。
划分完训练和测试集以后,能够把income_cat属性删掉(代码略)。
数据探索和和可视化
这里咱们须要把测试集放在一边,只探索训练集,首先建立了一个副本。
1.探索不一样的经纬度区域的数量
从图中能够看出某些经纬度(须要结合地理知识)的区域较多,某些地域较少,这样对于区域的分布有了一个直观的认识。
2.探索房价与人口和地理位置的关系规律
圆点越大表明人口越多,颜色越深表明房价越高。能够看到沿海地区房价高,人口多的地方房价高。
3.探究不一样属性与房价中位数的相关性
相关系数法
分布矩阵
因为属性较多,所以只选取了与房价中位数最相关的几个。在上面的图中,对角线上展现了每一个属性的直方图,其余位置展现了两两属性间的散点图。
能够发现收入的中位数与房价中位数相关性最强。
咱们从图中可以发现两者的相关性,但也有几条水平的直线是”异常“值。例如房价50w,45w,28w处的直线。后续可能须要对其进行删除。
4.试验不一样属性的组合
这一步咱们能够从实际出发,经过现有的特征进行一些相互组合,衍生出新的特征。例如:
每一个家庭的房间数=总房间数(totals_rooms)/总家庭数(housholds)
每一个房间的卧室数=总的卧室数(total_bedrooms)/总的房间数(total_rooms)
每一个家庭的人口数=总的人口数/总的家庭数(housholds)
验证一下咱们新构造的三个特征与目标值之间的相关性系数:
能够看到新构造的属性比原来的两个属性与房价中位数的相关性更高。这一步能够帮助咱们更深刻的思考与预测目标相关的影响因素,帮助创建更深入的理解。
数据准备
在开始以前,须要把预测目标和基本属性分开。
1.数据清理
缺失值的处理
前面咱们提到total_bedrooms属性有缺失。咱们能够如下方法来处理:
Scikit-Learn中提供了Imputer类来处理缺失值。使用中位数填充缺失值的代码以下:
删除缺失的行,可使用pandas中的
dropna()
方法删除该列,可使用pandas中的
drop()
方法用平均值或中位数填充该值,可使用pandas中的fillna()方法
处理文本和分类属性
这里咱们来处理上一步中删掉的ocean_proximity属性,它是一个类别型变量。须要将其转换为数字才能输入模型。Scikit-Learn有两种方式处理这种状况。
① 使用LabelEncoder
encoder的classes_属性中对应的值依次被编码为0, 1, 2, 3, 4。
② 使用 OneHotEncoder
以上两种方法最终能够获得onehot形式的矩阵。但第一种方法首先获得一个scipy的稀疏矩阵,仅存储非0元素的位置,但仍然能够像使用二维数组来使用它。在调用toarray才能获得numpy的数组。第二种方法是直接获得最终的结果。更快捷。但当特征不少的时候,numpy数组的存储会比较占空间。
特征缩放
为了消除数据中量纲的影响,一般有两种方式对数据进行缩放:最大最小缩放和标准化。在scikitlearn中都提供了相应的方法。
最大最小缩放是将值减去最小值并除以最大值和最小值的差,将值最终归于0-1之间。标准化缩放则是首先减去平均值而后除以方差,最终范围不必定是0-1之间。
Scikit-Learn中提供了Imputer类来处理缺失值。使用中位数填充缺失值的代码以下:
因为中位数只能针对数值型属性计算,咱们须要先建立一个只有数值型属性的数据副本。
imputer计算好的缺失值存储在imputer.statistics中。经过上面的步骤,咱们就把total_bedrooms的缺失值用中位数进行了填充。
数据准备小结
上面咱们对数据进行了缺失值处理,分类变量onehot处理,特征缩放处理等。这里进行一下统一的总结。以下面代码所示。最终获得的训练集有16个特征。
对于这一环节的数据处理,sklearn中提供了pipline的方式,能够将这一系列过程流水线化。看起来更清晰。准备好了数据以后,接下来如何进行模型选取,评估,参数调整呢。这些详细的内容咱们下一篇文章再来系统学习~
小结
用下面的思惟导图对本文的内容串联一下,能够在后台回复“房价”获取本文的数据,代码,思惟导图和PDF版本。
reference:
《机器学习实战:基于Scikit-Learn和Tensorflow》第二章

以清净心看世界;
用欢喜心过生活。
超哥的杂货铺,你值得拥有~
长按二维码关注咱们
推荐阅读:
2.简单几步,教你使用scikit-learn作分类和回归预测
个人视频号已开通,目前已经发了3个做品,正在更新SQL相关的内容~欢迎关注!
本文分享自微信公众号 - 超哥的杂货铺(gh_a624b94bfdab)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。