特征
Features
前言叨B叨
都到第五章了, 可能有些同学开始觉得有些烦躁了, 怎么还不上真二八经的代码? 事实上理解这些基本概念才是关键. 代码真没几句话, 因为最复杂的部分已经由先人封装好了, 我们只需要敲一两句话, 再配几个参数就妥妥的了.
今天主要讲数据中特征值的处理, 上一章提到过, 特征值的处理对最后预测结果的准确性有着决定性的关系. 所以这张大家务必仔细理解.
1. 特征工程(Feature engineering)
当使用监督学习解决问题时,我们将特征输入到机器学习算法中,该算法学习如何根据这些特征预测正确的输出。这是一个简单的想法,但是在实际的应用程序中,它需要大量的尝试和错误处理来找出哪些特性对建模最有用。特征工程是利用我们对问题的认识和分析来选择特征或创建新的特性,以此使机器学习算法更精确地工作。当您构建有监督的学习系统时,特性工程将消耗您的大部分时间。做好特征工程会大大改善模型的质量。
在训练机器学习算法时,为了获得最好的结果,我们要使算法尽可能简单地建模。这意味着我们希望输入的特征与输出值紧密相关。事实上,无用的特征可能会损害我们系统的准确性。让我们看一个例子。这里有张表格列出每个房子的大小,以及这些房子里盆栽植物的数量。房子的面积很可能有助于确定房子的价值。我们知道,基于我们对房地产市场的了解。因此,这将是一个很好的特征,我们要把它包括在我们的模型中。但是我估计如果不是兰花或是摇钱树之类的盆栽植物,数量多少也不会影响房子的最终价值。
盆栽植物只是装饰,它们便宜,而且很容易添加和去除。很少有人会根据房子里盆栽植物的数量来决定是否购买。在这种情况下,这个特征似乎会在模型中引入随机噪声,而不是告诉我们关于我们试图预测的实际值的任何东西,我们应该从我们的模型中删除这个特性。这就是特征工程的一个例子。
接下来让我们来看一些特征工程的不同策略。
到目前为止,我们已经讨论了从模型中添加和删除特性以提高精度的方法。
- 从我们的模型中包含或排除哪些特性是特征工程最简单的形式。
- 我们还可以将多个特性组合成一个特性。
显示每个房子的英尺和英寸的高度。高度可能是衡量房子价值的一个非常有用的度量标准,但是用不同单位去描述同一个特征会使模型更复杂。如果吗这两个值同时输入模型,那么该算法必须计算出这两组数字是相关的,是单个测量的一部分。如果我们预先处理我们的数据,只用一个单位的单个测量代替每一个高度测量就更好了。
工程策略的另一个特点是分级。分级是你做数值的测量和转换成一个类。让我们看一个例子。这里有一张表,我们的最后一个特征工程策略是one-hot编码方式(one-hot encoding)。
在我们的住房数据集中,一个分类数据的例子是社区的名字。我们不能直接将社区的名字输入到我们的模型中,因为它是一串文本而不是数字。相反,我们需要一种方法来将每个社区表示为一个数字。最简单的解决方案是给每个社区分配一个数字。但这并不适用于某些机器学习算法。
问题在于机器学习算法会认为这些数字的顺序是有意义的。它会假设大一些的数字比小一些的数字更重要。但是社区ID 2并不是社区ID 1的两倍。这些数字的顺序实际上毫无意义。这里的解决方案是使用一个不同的表示,称为one-hot 编码方式。
然后,我们将每一个设置为1或0,这取决于房子是否在那个社区。这被称为one-hot 编码。one-hot 编码对用机器学习模型容易理解的简单数值数据代替分类数据很有用。
2. 为房价预测选择最合适的特征
让我们看看这个房价预测项目的中的数据集,然后将我们所学到的关于特征工程的知识用起来。
让我们打开view_data.py。运行起来后让我们查看一下数据集中的每个特征,看看它是否需要修理修理,或者我们是否可以直接使用它。
首先看建造年份(year_built)。这项特征将告诉算法的每个房子的年龄,这似乎是一个重要的因素。这个特性是数字的,所以我们可以不用任何处理。接下来的几个特点也是数字,包括房子的储藏室数量,卧室的数目,全浴室的数目,半浴室,以及实用面积和总面积。
所以我们可以跳过它们。接下来我们有车库类型(garage_type)。看起来有三种可能的车库类型值: 没有车库, 独立车库, 非独立车库。车库类型貌似有助于我们的房价模型,但要使用这些数据,我们需要预先用one-hot编码方法处理它一下。
也就是说将单个特性更改为三个独立的特性。没有车库,有独立的车库,还有附属车库。对于每一个房子,只有其中一个将被设置为true。接下来的两个特点,车库和车库的尺寸大小和平方英尺平方英尺,我们应该能直接使用,无需任何额外的处理。好吧,让我们滚动。接下来,我们有几个true/false字段,有壁炉,有游泳池,有集中供暖,还有中央空调。true/false值在我们的模型中很好用。它们将被自动处理为1或0,所以不需要额外的处理工作。
接下来我们把每个房子的地址分成五个不同的字段。有门牌号码,街道名称,单元编号,邮政编码。在我们的模型中门牌号不会有任何用处。不太可能有人买房子是因为门牌号。更高的街道数并不意味着房子更有价值,它只是一个随机数。所以让我们从我们的模型中删除这个字段。单元数也一样。房子的位置对价值有很大的影响,所以我们需要在我们的模型要包含一些信息。
但是,有些字段提供重复的信息,说的是同一个意思。例如,如果我们知道一个房子的邮政编码,我们已经知道它在哪个城市,所以我们可能不需要在我们的模型中同时包含城市和邮政编码。街道名称是一个可以拿掉的特征。一条街道就是一个很小的区域,有时在某一条街上可能会增加房屋的价值,但在我们的模型中包括街道名称会使我们的模型复杂得多,因为在我们应用一个one-hot编码之后,我们将为数据集中的每一条街道提供一个新的特性。因此,让我们先把这个城市留在我们的模型中,然后对它应用one-hot编码。
现在我们不包含任何其他地址字段。这就是为什么特性工程是需要大量的尝试和排错。如果我们在模型中只包含城市名称,并不能得到好的结果,我们可能想再次使用街道名或其他地址字段再试一次。除非我们两种方法都试过,否则无法提前知道哪种方法会更好.
最后一点是房子的售价。这就是我们试图用我们的模型预测的y值或目标值。现在我们已经单独研究了每个字段,对于在模型中哪些特征需要修剪我们现在有了个基本概念。这将使我们的代码更容易编写。
3. 特征值用得越少越好:维度灾难(curse of dimensionality)
在构建机器学习模型时,尽可能地包含模型中的许多特征似乎是个好主意。数据越多越好,对吗?事实证明,然鹅并不总是这样。当我们在数据集中讨论更多数据时,我们可以指两种不同的东西。首先,我们可以讨论数据集中更多的数据行。对于我们的住房数据集,拥有更多的房屋记录是件好事。但我们也可以在数据中拥有更多的特性或列。有更多的功能是有帮助的,直到某一个阈值。终撞到了一堵墙--更多的特征反而降低了准确性。
我们仍然有和以前一样的100个数据点,但是现在我们添加了另一个特征,或者维度,这100个数据点只覆盖了图中可能的总面积的一小部分。为了更好地覆盖这个图表中所有可能的区域,我们现在需要的数据是我们的一维房价预测的10倍。换句话说,当我们在机器学习系统中添加更多的特性时,我们需要一个指数级的数据行来覆盖增加的空间。当我们开始获取成百上千的特征时,数据量和训练系统所需的时间可能是令人望而却步的。
因此,在构建机器学习系统时,不能为了增加特征数量而增加特征。你的目标是加入对预测有用的特征,排除对预测无效或者破坏的特征。
结语
本章至此, 后面还有三章. 待我慢慢道来.
如有错误请高手指正.
你的 关注-收藏-转发 是我继续分享的动力!