从零开始实现一个端到端的机器学习项目[4]

从零开始实现一个端到端的机器学习项目[4],第1张

从零开始实现一个端到端的机器学习项目[4]

基于书籍《Hands-on Machine Learning with Scikit-Learn, Keras & TensorFlow》的笔记

文章目录
      • 2.4 从数据探索和可视化中获得洞见
        • 2.4.1 地理数据可视化
        • 2.4.2 寻找属性相关性
        • 2.4.3 试验不同属性的组合(一个不错的技巧)

2.4 从数据探索和可视化中获得洞见

前面已经大概了解了整个数据的结构。

本章的目标是继续深入探索一些数据特性,使用可视化,并且做一些对数据的额外处理。

首先,把测试集放在一边,我们只能去探索训练集做一些相应处理。

首先,创建一个副本,保证随便尝试而不损害训练集。

housing = strat_train_set.copy()
2.4.1 地理数据可视化

首先,我们来做一些地理数据的可视化

由于存在地理位置信息(我们将X和Y轴设置为经纬度)-来做一个类似于地图的数据可视化观察一下房子的分布。

housing.plot(kind="scatter", x="longitude", y="latitude",alpha=0.1) #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,
)
plt.legend()

​ Figure . California housing prices: red is expensive, blue is cheap, larger circles indi‐ cate areas with a larger population

根据上图,我们的结论是-人口密度和地理位置(是否临海)确实与房价息息相关。

一个有用的办法是

A clustering algorithm should be useful for detecting the main cluster and for adding new features that measure the proximity to the cluster centers.

​ 阅读原文,其告诉我们:使用一个聚类算法去检测主要的类别,然后对每个类别加入一个新的特征(如衡量与聚类中心距离的特征-这里可以是海洋邻近度)。

2.4.2 寻找属性相关性

由于数据集不大,所以使用corr()方法可以轻松计算出每对属性之间的标准相关系数(一般为皮尔逊系数r),这很有用,其将利于我们去发掘每一个特征的重要程度。

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,则说明两者没有什么线性相关性。

​ Figure. 各种数据的X轴和Y轴的图像和相关性

有几点值得注意:

  1. 相关系数仅测量线性相关性(如果X上升,则Y上升/下降),所以非线性相关性(例如X接近0,则Y上升)其可能会遗漏,如上图的最下面一排,它们的相关性系数都为0,但实则确实存在一些关系。
  2. 如上图的第二排,相关性与斜率完全相关,用m和dm来测量的你的身高的数据相关性系数为1。

还有一种办法可以检测属性之间的相关性,使用pandas的scatter_matrix() 函数,其会绘制出每个数值属性相对于其他数值属性的相关性。(pandas对于每个变量对自己的图像,使用的直方图图像,这将会比主对角线的四个图像(左上到右下)全是直线更有意义)下面我们选取几个与房价中位数属性最相关的数值属性进行绘制。

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

可以看到,这样的可视化结果将非常有益于我们从中发现一些模式。

接下来我们来重点看一下最重要的特征-收入中位数,我们画一个放大的其相关性散点图。

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

从上图可以看出,二者相关性确实很强,上升趋势明显,点也没有太分散,前面我们提到50万美元是一个边界值,从上图也可以看出存在一条明显的截断线,甚至中间也有几条不那么清晰的直线。这说明我们的数据集并不是那么干净,对于这些直线上的数据,我们可能会想办法删除这些数据,防止在机器学习算法中重现。

到此为止的小总结:

  1. 在准备开始给机器学习算法输入数据之前,你可能会识别出一些异常数据,需要提前清理掉。
  2. 同时,你还可能发现不同属性间的某种有趣的联系,特别是特征与目标属性间的联系。
  3. 你还可能注意到了某些属性的分布显示出了明显的“重尾”分布,于是你还需要对它们进行转换处理(例如,计算其对数-使得数据在给定数轴上分布更加的均匀)。

这是我们对目前做的EDA的一些summary.

2.4.3 试验不同属性的组合(一个不错的技巧)

在准备在机器学习算法输入数据之前,我们最后尝试一下各种属性的组合能不能创造新的与目标属性具有更强相关性的特征。

比如说“total_rooms"这个属性单看对于整个区域的房价中位数并没有意义,我们更想要知道这个区域中平均每一个家庭的房间数量是多少,还有等等。我们来尝试创建这些新的属性:

接下来,仍然使用housing.corr()来查看相关矩阵:

>>> corr_matrix = housing.corr()
>>> corr_matrix["median_house_value"].sort_values(ascending=False)
median_house_value 1.000000
median_income 0.687160
rooms_per_household 0.146285
total_rooms 0.135097
housing_median_age 0.114110
households 0.064506
total_bedrooms 0.047689
population_per_household -0.021985
population -0.026920
longitude -0.047432
latitude -0.142724
bedrooms_per_room -0.259984
Name: median_house_value, dtype: float64

可以看到,新的属性bedrooms_per_room的相关性较之前有了明显的提升(即如果一个区域内卧室/房间的比例越低,往往价格更贵-二室二厅一般贵于三室一厅(面积的因素)),整个,还有rooms_per_household也有明显的提升(房屋越大,价格越贵)-当然这些相关性都不算强,因为存在很多可能的其他因素的干扰。

这一轮的探索并不需要那么彻底,关键是获得一个快速的洞见,迈开第一步,然后开始思考我们的算法,后面我们还会回到这个步骤,整个机器学习项目的落地是一个不断迭代的过程,我们还可以分析系统的输出转而思考如何从输入来改善整个系统。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5657959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存