机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 探索和可视化数据以获得见解

到目前为止,你只是快速浏览了数据来大致了解你正在处理的数据类型。现在的目标是更深入了解。

首先,确保你已经把测试集放在一边,你只是在探索训练集。其次,如果训练集非常大,你可能希望对探索集进行采样,使探索阶段的操作变得简单快捷。在这种情况下,训练集很小,所以你可以直接在完整数据集上工作。由于你要实验完整训练集的各种变换,因此你应该制作一份原始副本,以便之后可以恢复:

2.4.1 可视化地理数据

因为数据集包含地理信息(纬度和经度),所以创建所有地区的散点图来可视化数据是个好主意(见图2-11):

图2-11:数据的地理散点图

这看起来很像加州,但除此之外很难看到任何特定的模式。将alpha选项设置为0.2,可以更容易地可视化数据点密度高的地方(见图2-12):

现在好多了:你可以清楚地看到高密度区域,即湾区以及洛杉矶和圣迭戈周围,以及中央山谷中一长串相当高密度的区域(特别是萨克拉门托和弗雷斯诺周围)。

我们的大脑非常擅长发现图片中的模式,但你可能需要尝试使用可视化参数才能使模式脱颖而出。

图2-12:突出显示高密度区域的更好的可视化

接下来看看房价(见图2-13)。每个圆圈的半径代表该地区的人口数量(选项s),颜色代表价格(选项c)。在这里,你使用名为jet的预定义颜色图(选项cmap),其范围从蓝色(低)到红色(高)[8]

图2-13告诉你,房价与地理位置(例如靠近海洋)和人口密度密切相关,你可能已经知道了。聚类算法应该有助于检测主集群和添加新特征来衡量与集群中心的接近程度。海洋邻近度也可能是有用的属性,不过北加州沿海地区的房价不是太高,所以这个简单的规则也不是万能的。

图2-13:加州房价:红色为昂贵,蓝色为便宜,圆圈越大代表地区人口越多

2.4.2 寻找相关性

由于数据集不是太大,你可以使用corr()方法轻松计算出每对属性之间的标准相关系数(也称为皮尔逊r):

现在你可以查看每个属性与房价中位数的相关性:

相关系数取值范围为-1到1。它越接近1,表示存在越强的正相关。例如,当收入中位数上升时,房价中位数往往会上升。当系数接近-1时,表示存在很强的负相关。你可以看到纬度和房价中位数之间存在弱的负相关(即当你向北走时,价格略有下降的趋势)。最后,接近于0的系数意味着不存在线性相关。

查看属性之间相关性的另一种方法是使用Pandas的scatter_matrix()函数,该函数将每个数值属性与其他每个数值属性进行对比。由于现在有11个数值属性,你将得到112=121个图表,这些图表无法放在一页纸上,因此你要关注一些看起来与房价中位数最相关的属性(见图2-14):

图2-14:这个散布矩阵绘制了每个数值属性与其他每个数值属性的对比图,加上主对角线上每个数值属性的直方图(左上到右下)

如果Pandas把每个变量与它自身画一个图,则主对角线将全都是直线,这样毫无意义。因此取而代之的是,Pandas显示每个属性的直方图(有其他选项可用,有关更多详细信息请参阅Pandas文档)。

查看相关散点图,预测房价中位数最有希望的属性似乎是收入中位数,因此你可以放大散点图(见图2-15):

图2-15:收入中位数与房价中位数

这个图揭示了一些事情。首先,相关性确实很强,你可以清楚地看到上升趋势,而且点不是太分散。其次,你之前注意到的价格上限清晰可见,为500 000美元的水平线。但该图还揭示了其他不太明显的直线:450 000美元附近有一条水平线,350 000美元附近也有一条,280 000美元附近似乎隐约也有一条,再往下可能还有几条。你可能想尝试删除相应的地区,以防止你的算法学习重现这些数据。

相关系数仅衡量线性相关性(“随着x上升,y通常上升/下降”)。它可能会完全错过非线性关系(例如,“当x接近0时,y通常会上升”)。

图2-16展示了各种数据集及其相关系数。请注意,尽管事实上它们的轴显然不是独立的,但底行的所有图的相关系数都为0:这些是非线性关系的样例。此外,第二行显示相关系数为1或-1的样例,请注意,这与斜率无关。例如,以英寸为单位的身高与以英尺或纳米为单位的身高的相关系数为1。

图2-16:各种数据集的标准相关系数(来源:维基百科,公共领域图像)

2.4.3 实验不同属性组合

通过前面几节的介绍,希望你了解了探索数据和获得见解的几种方法。在将数据提供给机器学习算法之前,你确定了一些你可能想要清理的数据,并且你发现了属性之间有趣的相关性,尤其是与目标属性之间的相关性。你还注意到某些属性呈右偏分布,因此你可能希望对它们进行变换(例如,通过计算它们的对数或平方根)。当然,你的工作时数会因每个项目而有很大差异,但总体思路是相似的。

在为机器学习算法准备数据之前,你可能想要做的最后一件事是尝试各种属性组合。例如,如果你不知道一个地区有多少户人家,则该地区的房间总数就没有多大用处。你真正想要的是每个家庭的房间数。同样,卧室总数本身也不是很有用:你可能想将其与房间数量进行比较。每户人口似乎也是一个值得关注的有趣属性组合。你可以按如下方式创建这些新属性:

然后再次查看相关矩阵:

嘿,还不错!与房间或卧室总数相比,新的bedrooms_ratio属性与房价中位数的相关性更高。显然,卧室/房间比例较低的房子往往更贵。每户房间的数量也比一个地区的房间总数更具信息量,显然房子越大,它们就越贵。

这一轮探索不需要很彻底,关键是要从正确的脚步开始并快速获得见解,这将帮助你获得第一个相当不错的原型。但这是一个迭代过程:一旦你启动并运行了一个原型,你就可以分析它的输出来获得更多的见解并返回到这个探索步骤。