红色石头的个人网站:redstonewill.com

目前为止,我们已经对数据有了初步的认识,大体上明白了我们要处理的数据类型。现在,我们将进入更深入的研究。

首先,确保已经划分了测试集并放置一边,我们只会对训练集进行操作。另外,如果训练集很大,可以从中采样一些作为探索集(exploration set),方便进行快速处理。在我们这个例子中,数据集比较小,所以直接在训练集上处理即可。我们还要创建一个训练集的复制副本,这样就不会改动原来的训练集了。

housing = strat_train_set.copy()

1. 地理数据可视化

因为数据集中包含了地理位置信息(经纬度),所以创建所有地区的散点图来可视化数据是个好主意(如下图所示)。

housing.plot(kind="scatter", x="longitude", y="latitude")

这看起来有点像加州,但是很难看出任何规律。我们设置参数 alpha = 0.1,这样就更容易看出数据点的密度了(如下图所示)。

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)

现在,我们可以很清晰地看出这些密度较大的区域了。

通常来说,人类的大脑非常善于发现图片中的模式,但是也需要使用一些可视化参数来让这些模式更加突出。

接下来,我们来看一下房屋价格(如下图所示)。其中,圆的半径代表地区人口(参数 s),圆的颜色代表房价(参数 c)。我们将使用预先定义好的颜色图 jet(参数 cmap),颜色范围从蓝色(低房价)到红色(高房价)。

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,s=housing["population"]/100, label="population", figsize=(10,7),c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,sharex=False)
plt.legend()
save_fig("housing_prices_scatterplot")

注意,参数 sharex=False 修复了显示 x 轴和 legend 不显示的 bug。感谢 Wilmer Arellano 给的建议。出处:https://github.com/pandas-dev/pandas/issues/10611。

这张图显示出房价与地理位置(例如沿海)和人口密度关系很大,这一点你可能早就知道。可以使用聚类算法检测主要的聚集,增加新的特征测量到聚类中心的距离。尽管加州北部沿海地区的房价并不高,但是 ocean_proximity 属性仍然非常有用。总的来说,预测房价并不是使用一个简单规则就行的。

2. 寻找关联性

因为数据集不是很大,我们可以使用 corr() 方法直接计算任意两个属性的标准相关系数(也称皮尔逊相关系数)。

corr_matrix = housing.corr()

现在,我们来看一下每个属性与房价中位数的相关系数分别是多少:

>>> corr_matrix["median_house_value"].sort_values(ascending=False)median_house_value 1.000000
median_income 0.687170
total_rooms 0.135231
housing_median_age 0.114220
households 0.064702
total_bedrooms 0.047865
population -0.026699
longitude -0.047279
latitude -0.142826
Name: median_house_value, dtype: float64

相关系数范围在 [-1, 1] 之间,越接近 1 表示正相关性越强,例如房价中位数与收入中位数。相关系数越接近 -1 表示负相关性越强。你可以看到房价中位数与维度呈现负相关性(数据显示越往北方,房价呈下降趋势)。最后,相关系数接近 0 表示无线性相关。下图展示了 x 轴与 y 轴对应数据的相关系数。

相关系数仅仅测量的是线性相关性(如果 x 增大,y 也同样增大或减小),可能完全忽略非线性关系(例如,x 在 0 附近,y 会增大)。注意,上图中最下面的那几张图表示的都是相关系数为零的情况,但是它们是非线性相关。第二行展示的几个图形相关系数为 1 或 -1,注意与直线的斜率无关。

另外一种检查不同属性特征之间的相关系数的方法是使用 Pandas 的 scatter_matrix 函数。它将对每个数值属性与其它所有数值属性的相关性进行作图。因为现在有 9 个数值属性,总共有 9x9=81 个图,页面放不下这么多。所以,我们只选择几个与房价中位数关系较大的属性来作图。

from pandas.tools.plotting import scatter_matrixattributes = ["median_house_value", "median_income", "total_rooms",
"housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12, 8))

上图中,主对角线对应的相关系数全是直线(自己与自己的相关系数始终为 1),作图没有实质意义,因此显示的实际上是每个属性的柱状图。关于其它选项设置,可以参阅 Pandas 的文档。

看起来,最有可能用来预测房价中位数的属性是收入中位数,让我们把该图放大来看:

housing.plot(kind="scatter", x="median_income", y="median_house_value",
alpha=0.1)

这张图说明了几点:第一,相关性较强。你可以清楚看到数据点整体呈上升趋势,并不分散。第二,我们之前提过的价格上限 $500,000 呈现一条水平直线。同样在 $450,000、$350,000 和 $280,000 的位置也呈现了较弱的水平直线。在训练模型的时候最好移除这些样本点,防止算法学习到这些不好的数据。

3. 尝试结合不同的属性

希望前面的章节给了你一些探索数据、获取规律的方法。你发现了一些数据怪癖,在把数据放入机器学习算法之前,将其清除。你也发现了不同属性之间的相关性,尤其是与目标属性的相关性。你也注意到有些属性呈现长尾分布,可以进行转换处理(例如计算它们的对数)。当然,不同项目的处理方法并不完全相同,但是大致思路是类似的。

在准备数据给机器学习算法之前,你还可以尝试进行不同的属性组合。例如,如果你不知道地区有多少户,只知道地区总的房间数也没什么作用。你最想知道的是每户有多少房间。类似地,知道卧室数量也没什么用,你可能需要将其与房屋数量进行比较。还有,每户人口数应该也比较重要。下面,我们来创建这些属性:

housing["rooms_per_household"] = housing["total_rooms"]/housing["households"]
housing["bedrooms_per_room"] = housing["total_bedrooms"]/housing["total_rooms"]
housing["population_per_household"]=housing["population"]/housing["households"]

现在,我们再来看一下相关矩阵:

>>> corr_matrix = housing.corr()
>>> corr_matrix["median_house_value"].sort_values(ascending=False)median_house_value 1.000000
median_income 0.687170
rooms_per_household 0.199343
total_rooms 0.135231
housing_median_age 0.114220
households 0.064702
total_bedrooms 0.047865
population_per_household -0.021984
population -0.026699
longitude -0.047279
latitude -0.142826
bedrooms_per_room -0.260070
Name: median_house_value, dtype: float64

看起来还不错!bedrooms_per_room 属性与房价中位数的相关性比单独的 total_roomstotal_bedrooms 与房价中位数的相关性更大。可以看出,bedroom/room 比值越小,房价越高。rooms_per_household 属性也比 total_rooms 包含了更多的信息——显然,房屋越大,价格就越高。

这一轮的探索不一定要非常完备。重要的是正确开始并快速发现一些规律,这将帮助你得到第一个合理的原型。这是一个迭代的过程:一旦你得到一个原型开始运行,你就可以分析它的输出,发现更多规律,然后回过头来继续探索数据,不断优化模型。

项目地址:

https://github.com/RedstoneWill/Hands-On-Machine-Learning-with-Sklearn-TensorFlow


Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记 4 —— 数据探索与可视化、发现规律相关推荐

  1. Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记1 — 机器学习基础知识简介

    红色石头的个人网站:redstonewill.com 本章介绍的是每一个数据科学家都应该知道并听说的机器学习许多基本的概念和术语.这将是一个高层次的概括(本书唯一没有很多代码的一章).内容很简单,但是 ...

  2. Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记2 — 机器学习的主要挑战

    红色石头的个人网站:redstonewill.com 简而言之,因为机器学习的主要任务就是选择合适的机器学习算法在数据集上进行训练,所以不好的算法和不好的数据都可能严重影响训练效果.下面我们先来看看不 ...

  3. 《Scikit-Learn与TensorFlow机器学习实用指南》第16章 强化学习

    第16章 强化学习 来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@friedhelm739 校对:@飞龙 强化学习(RL)如今是机器 ...

  4. 《Scikit-Learn与TensorFlow机器学习实用指南》第7章 集成学习和随机森林

    第7章 集成学习与随机森林 来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@friedhelm739 校对:@飞龙 假设你去随机问很多 ...

  5. 《Scikit-Learn与TensorFlow机器学习实用指南》第9章 启动并运行TensorFlow

    第9章 启动并运行TensorFlow 来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@akonwang @WilsonQu 校对:@ ...

  6. Sklearn 与 TensorFlow 机器学习实用指南(补档)

    协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 ApacheCN - 机器学习交流群 629470233 ApacheCN 学习资源 利用 P ...

  7. 《Sklearn 与 TensorFlow 机器学习实用指南》 第6章 决策树

    来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@Lisanaaa @y3534365 校对:@飞龙 和支持向量机一样, 决策树是一种多 ...

  8. 《Scikit-Learn与TensorFlow机器学习实用指南》第10章 人工神经网络介绍

    第10章 人工神经网络介绍 来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@akonwang @friedhelm739 校对:@飞龙 ...

  9. 《Scikit-Learn与TensorFlow机器学习实用指南》第11章 训练深层神经网络

    第11章 训练深层神经网络 来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@akonwang @飞龙 校对:@飞龙 @Zeyu Zho ...

最新文章

  1. Nature Methods:Rob Knight发布Striped UniFrac算法轻松分析微生物组大数据
  2. 做一个有胆识的有为青年
  3. php session_regenerate_id,什么时候以及为什么我应该使用session_regenerate_id()?
  4. python语法笔记(四)
  5. Maven (1)---maven 基础知识
  6. 声明式智能推荐系统应用架构探索
  7. 如何在ps中调整文字的行距和间距_Wps如何调整文字字符的间距
  8. LeetCode(806)——写字符串需要的行数(JavaScript)
  9. 完美解决office2013 错误1402
  10. 计算机多系统启动光盘制作,制作启动光盘,小编教你如何制作光盘启动盘
  11. 使用SimHash进行海量文本去重
  12. 项目管理手记(七)--DRP系统的文化输出与营销
  13. 中国科学院计算机博士范,范习之 博士
  14. 实验吧 ctf题目 天下武功唯快不破
  15. Julia1.4文档 —— 2. Julia的基本数值类型
  16. 模型的评估指标(一)
  17. 舍弗勒、斯凯孚、阿尔斯通、默沙东、联合利华、洲际、希尔顿、盖璞等外企在中国 | 美通社头条...
  18. 让我们旋转跳跃不停歇~~~当3D打印遇上八音盒!(三)
  19. python怎么调字体_python怎么改字体
  20. 巴西龟饲养日志----冬眠记录2

热门文章

  1. 将.protobuf文件转成.cs文件方法
  2. 职场中一路走来却拂不去一丝失落——一个女IT的告白
  3. hdu 1532(最大流)
  4. nyoj42一笔画问题
  5. 弄懂CNN,然后提升准确率4.21-4.27
  6. python 全栈开发,Day82(点赞和踩灭,用户评论)
  7. (转)怎么实时查看mysql当前连接数
  8. 机器学习——正则化-L2
  9. mysql与web服务器之间的分离操作
  10. 深入浅出 kvm qemu libvirt