未验证 提交 88ce75be 编写于 作者: K Keqi Huang 提交者: GitHub

校对 第2章 端到端的机器学习项目 已经完成的部分

上级 125334af
......@@ -31,7 +31,7 @@
[Quora.com question](https://link.jianshu.com?t=http%3A%2F%2Fgoo.gl%2FzDR78y)
[Datasets subreddit](https://link.jianshu.com?t=https%3A%2F%2Fwww.reddit.com%2Fr%2Fdatasets)
本章,我们选择的是StatLib的加州房产价格数据集(见图2-1)。这个数据集基于1990年加州普查的数据。数据已经有点老(1990年还能买一个湾区不错的房子),但是它有许多优点,利于学习,所以假设这个数据为最近的。为了便于教学,我们添加了一个分类属性,并除去了一些。
本章,我们选择的是StatLib的加州房产价格数据集(见图2-1)。这个数据集基于1990年加州普查的数据。数据已经有点老(1990年还能买一个湾区不错的房子),但是它有许多优点,利于学习,所以假设这个数据为最近的。为了便于教学,我们添加了一个分类属性,并除去了一些。
![](https://upload-images.jianshu.io/upload_images/7178691-4af1bd6b259d5b12.png)
......@@ -49,7 +49,7 @@
## 划定问题
问老板的第一个问题应该是商业目标是什么?建立模型可能不是最终目标。公司要如何使用、并从模型受益?这非常虫咬,因为它决定了如何划定问题,要选择什么算法,评估模型性能的指标是什么,要花多少精力进行微调。
问老板的第一个问题应该是商业目标是什么?建立模型可能不是最终目标。公司要如何使用、并从模型受益?这非常重要,因为它决定了如何划定问题,要选择什么算法,评估模型性能的指标是什么,要花多少精力进行微调。
老板告诉你你的模型的输出(一个区的房价中位数)会传给另一个机器学习系统(见图2-2),也有其它信号会传入后面的系统。这一整套系统可以确定某个区进行投资值不值。确定值不值得投资非常重要,它直接影响利润。
......@@ -64,7 +64,7 @@
>
> 另一方面,如果没有监控,失效的组件会在不被注意的情况下运行一段时间。数据会受到污染,整个系统的性能就会下降。
下一个要问的问题是,现在的解决方案效果如何。老板通常会给一个参考性能,以及如何解决问题。老板说,现在分区的放假是靠专家手工估计的,专家队伍手机最新的关于一个区的信息(不包括房价中位数),他们使用复杂的规则进行估计。这种方法费钱费时间,而且估计结果不理想,误差率大概有15%。
下一个要问的问题是,现在的解决方案效果如何。老板通常会给一个参考性能,以及如何解决问题。老板说,现在分区的房价是靠专家手工估计的,专家队伍收集最新的关于一个区的信息(不包括房价中位数),他们使用复杂的规则进行估计。这种方法费钱费时间,而且估计结果不理想,误差率大概有15%。
Okay,有了这些信息,你就可以开始设计系统了。首先,你需要划定问题:监督或非监督,还是强化学习?这是个分类任务、回归任务,还是其它的?要使用批量学习还是线上学习?继续阅读之前,请暂停一下,尝试自己回答下这些问题。
......@@ -86,7 +86,7 @@ Okay,有了这些信息,你就可以开始设计系统了。首先,你需
>
> * m是测量RMSE的数据集中的实例数量。
> 例如,如果用一个含有2000个分区的验证集求RMSE,则m = 2000。
> * x(i)是数据集第ith个实例的所有特征值(不包含标签)得矢量,y(i)是它的标签(这个实例的输出值)。
> *   x(i)是数据集第ith个实例的所有特征值(不包含标签)的矢量,y(i)是它的标签(这个实例的输出值)。  
> 例如,如果数据集中的第一个分区位于经度–118.29°,纬度33.91°,有1416名居民,收入中位数是$38372,房价中位数是$156400(不考虑其它特征),则有:
>
> ![](https://upload-images.jianshu.io/upload_images/7178691-25c88114ac85b76c.png)
......@@ -105,7 +105,7 @@ Okay,有了这些信息,你就可以开始设计系统了。首先,你需
> 例如,如果系统预测第一区的房价中位数是$158400,则ŷ(1) = h(x(1)) = 158400。预测误差是ŷ(1) – y(1) = 2000。
> RMSE(X,h)是使用假设h在样本集上测量的损失函数。
>
> 我们使用小写斜体表示标量值(例如_m_或_y(1)_)和函数名(例如_h_),小写粗体表示矢量(例如x(i)),大写粗体表示矩阵(例如X)。(译者注:MarkDown表示粗体斜体太麻烦了,忽略字体。)
> 我们使用小写斜体表示标量值(例如 _m_ 或 _y(1)_ )和函数名(例如 _h_ ),小写粗体表示矢量(例如 **x(i)** ),大写粗体表示矩阵(例如**X**)。(译者注:MarkDown表示粗体斜体太麻烦了,忽略字体。)
虽然大多数时候RMSE是回归任务可靠的性能指标,在有些情况下,你可能需要另外的函数。例如,假设存在许多异常的分区。此时,你可能需要使用绝对平均误差(Mean Absolute Error,也称作平均绝对偏差,见等式2-2):
......@@ -151,7 +151,7 @@ $ mkdir -p $ML_PATH
```
还需要一些Python模块:Jupyter、NumPPandas、Matplotlib和Scikit-Learn。如果所有这些模块都已经在Jupyter中运行了,你可以直接跳到下一节“下载数据”。如果还没安装,有多种方法可以进行安装(包括它们的依赖)。你可以使用系统的包管理系统(比如Ubuntu上的apt-get,或macOS上的MacPorts或HomeBrew),安装一个Python科学计算环境比如Anaconda,使用Anaconda的包管理系统,或者使用Python自己的包管理器pip,它是Python安装包(自从2.7.9版本)自带的。可以用下面的命令检测是否安装pip:
还需要一些Python模块:Jupyter、NumPy、Pandas、Matplotlib和Scikit-Learn。如果所有这些模块都已经在Jupyter中运行了,你可以直接跳到下一节“下载数据”。如果还没安装,有多种方法可以进行安装(包括它们的依赖)。你可以使用系统的包管理系统(比如Ubuntu上的apt-get,或macOS上的MacPorts或HomeBrew),安装一个Python科学计算环境比如Anaconda,使用Anaconda的包管理系统,或者使用Python自己的包管理器pip,它是Python安装包(自从2.7.9版本)自带的。可以用下面的命令检测是否安装pip:
```
$ pip3 --version
......@@ -300,7 +300,7 @@ def load_housing_data(housing_path=HOUSING_PATH):
图2-5 数据集的顶部五行
每一行都表示一个分区。共有10个属性(截图中可以看到6个):经度、维度、房屋年龄中位数、总房间数、卧室数量、人口数、家庭数、收入中位数、房屋价值中位数、大海距离。
每一行都表示一个分区。共有10个属性(截图中可以看到6个):经度、维度、房屋年龄中位数、总房间数、卧室数量、人口数、家庭数、收入中位数、房屋价值中位数、大海距离。
info()方法可以快速查看数据的描述,包括总行数、每个属性的类型和非空值的数量(见图2-6)。
......@@ -310,7 +310,7 @@ info()方法可以快速查看数据的描述,包括总行数、每个属性
数据集中共有20640个实例,按照机器学习的标准这个数据量很小,但是非常适合入门。总房间数只有20433个非空值,意味着207个分区缺少这个值。后面要对它进行处理。
所有的属性都是数值的,除了大海距离这项。它的类型是对象,因此可以包含任意Python对象,但是因为是从CSV文件加载的,所以必然是文本。当查看顶部的五行时,你可能注意到那一列的值是重复的,意味着它可能是一个分类属性。可以使用value_counts()方法查看都有什么类型,每个类都有多少分区:
所有的属性都是数值的,除了大海距离这项。它的类型是对象,因此可以包含任意Python对象,但是因为是从CSV文件加载的,所以必然是文本。当查看顶部的五行时,你可能注意到那一列的值是重复的,意味着它可能是一个分类属性。可以使用value_counts()方法查看都有什么类型,每个类都有多少分区:
```
>>> housing["ocean_proximity"].value_counts()
......@@ -329,7 +329,7 @@ Name: ocean_proximity, dtype: int64
图2-7 每个数值属性的概括
count、mean、min和max几行的意思很明了。注意,空值被忽略了(所以,卧室总数是20433而不是20640)。std是标准差(揭示数值的分散度)。25%、50%、75%展示了对应的分位数:每个分位数指明小于这个值,且指定分组的百分比。例如,25%的分区的房屋年龄中位数小于15,而50%的小于29,75%的小于37。这些值通常称为25th分位数(或1st四分位数),中位数,75th分位数(3rd四分位数)。
count、mean、min和max几行的意思很明了。注意,空值被忽略了(所以,卧室总数是20433而不是20640)。std是标准差(揭示数值的分散度)。25%、50%、75%展示了对应的分位数:每个分位数指明小于这个值,且指定分组的百分比。例如,25%的分区的房屋年龄中位数小于18,而50%的小于29,75%的小于37。这些值通常称为25th分位数(或1st四分位数),中位数,75th分位数(3rd四分位数)。
另一种快速了解数据类型的方法是画出每个数值属性的柱状图。柱状图(的纵轴)展示了特定范围的实例的个数。你还可以一次给一个属性画图,或对完整数据集调用hist()方法,后者会画出每个数值属性的柱状图(见图2-8)。例如,你可以看到略微超过800个分区的median\_house\_value值差不多等于$500000。
......@@ -349,15 +349,15 @@ plt.show()
注意柱状图中的一些点:
1. 首先,收入中位貌似不是美元(USD)。与数据采集团队交流之后,你被告知数据是经过缩放调整的,过高收入中位数的会变为15(实际为15.0001),过低的会变为5(实际为0.4999)。在机器学习中对数据进行预处理很正常,不一定是问题,但你要明白数据是如何计算出来的。
1. 首先,收入中位貌似不是美元(USD)。与数据采集团队交流之后,你被告知数据是经过缩放调整的,过高收入中位数的会变为15(实际为15.0001),过低的会变为5(实际为0.4999)。在机器学习中对数据进行预处理很正常,不一定是问题,但你要明白数据是如何计算出来的。
2. 房屋年龄中位数和房屋价值中位数也被设了上线。后者可能是个严重的问题,因为它是你的目标属性(你的标签)。你的机器学习算法可能学习到价格不会超出这个界限。你需要与下游团队核实,这是否会成为问题。如果他们告诉你他们需要明确的预测值,即使超过$500000,你则有两个选项:
2. 房屋年龄中位数和房屋价值中位数也被设了上限。后者可能是个严重的问题,因为它是你的目标属性(你的标签)。你的机器学习算法可能学习到价格不会超出这个界限。你需要与下游团队核实,这是否会成为问题。如果他们告诉你他们需要明确的预测值,即使超过$500000,你则有两个选项:  
a.对于设了上限的标签,重新收集合适的标签;
b.将这些分区从训练集移除(也从测试集移除,因为若房价超出$500000,你的系统就会被差评)。
3. 这些属性值有不同的量度。我们会在本章后面讨论特征缩放。
4. 最后,许多柱状图的尾巴很长:相较于左边,它们在中位数的右边延伸过远。对于某些机器学习算法,这会使检测规律变得更难些。我们会在后面尝试变换处理这些属性,使其变为正分布。
4. 最后,许多柱状图的尾巴很长:相较于左边,它们在中位数的右边延伸过远。对于某些机器学习算法,这会使检测规律变得更难些。我们会在后面尝试变换处理这些属性,使其变为正分布。
希望你现在对要处理的数据有一定了解了。
......@@ -382,7 +382,7 @@ def split_train_test(data, test_ratio):
```
然后可以像下面使用这个函数:
然后可以像下面这样使用这个函数:
```
>>> train_set, test_set = split_train_test(housing, 0.2)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册