数据预处理是个有意思的问题,因为它让线性模型变得可以」工作「了。

别急,我不是说我们之前讲的什么用都没有,只是它只能在比较小的范围内工作。今天,让我讲一些可以扩大线性模型威力的方法!

首先,我们可以对一些数据评估,来判断这个数据和我们想要的结果是否是线性关系的。

比如,你收集了别墅距离市中心的位置(你可能已经厌倦了这个例子,在讲下一个模型时,我尽可能换一个例子)。但实际上,别墅的价格很可能和距离的平方是线性关系,如果你不对距离提前处理,很可能让你最后训练出来的模型不够精确。怎么办呢?如果你是个高中生,正在饱受高考摧残的高中生,你应该知道该怎么做。如果你不知道的话,让我来给你补补数学。实际上,你只需要把之前代入公式的x换成x的平方就可以了。当然,我们也可以假设某些属性和数据的标记呈更复杂的关系。更一般的,我们假设所有的属性和标记的关系如下:

(这些是我编的,如果你真的收集了数据,看完今天的文章,你可以自己计算具体的关系)按照上面的表,我们把处理后的数据代入线性回归的模型,就可以让它变得真正起作用了。但是,我们是怎么知道数据之间的关系的呢?

实际上,我们不知道,是机器发现的。所以,关于数据预处理,我们有更一般的做法。

我们可以作出这样的假设:

还记得「:=「是赋值符号吧?没错,我们可以猜测原来的数据的一次项,二次项,三次项都分别和标记呈线性相关。这样一来,我们就有了3 x 8 + 1 = 25个θ了。这不是什么问题,让计算机用梯度下降法计算出几十个θ确实是小case。重新写一下我们的x:

这样看起来可能怪怪的,我们用a表示处理后的x

我们得到了新的特征值:

所以,相应的,我们要求的θ也就变成了这样:

到这里,你可能会有疑问,那如果属性值和标记呈指数或者对数关系,该怎么办呢?其实,我们已经不知不觉的解决了这个问题。如果你学过麦克劳林展开或是泰勒展开:

你会知道,对数或者指数也可以写成多项式的形式:

我们没有把ln10这样的系数写出来,因为它应该包含在θ里。我的意思是,如果你不写ln10,训练出来的θ可能是ln10,如果你写了ln10,训练出来的θ可能是1。最后的结果是一样的。

还有一个问题,那就是标记可能和某两个属性的乘积呈线性关系。

这也不是什么问题,因为你只要用更多的a把它们都表示出来就行了,当然,相应的,你会有更多的θ需要计算。

像这样:


接下来,让我介绍数据预处理的其他步骤。这主要包括了特征缩放均值归一。所谓特征缩放,其实就是属性缩放。特征,属性,其实是一个意思,只是叫法不同。

特征缩放的思想是让所有属性的取值范围大致相同,这样可以有效的加快梯度下降的速度。

例如,你收集到的最小的别墅是200平的,最大是别墅是1000平的。最矮的是2层的,最高的是5层的。那么,属性值满足的范围是:

在上面的例子中,不同的特征值取值的范围差别很大。让我来给你演示为什么我们不希望特征值取值的范围差别很大。假如我们收集到了以下数据:

(也是我编的)我们能得到下面的cost函数:

如果你几何想像能力比较好,你应该能显得出来它大致的形状。实际上,它的图像很像马里亚纳海沟或是千岛海沟,总之,它很像一个海沟。如果一个代价函数像一个海沟,而不是一个火山,那以为著我们在梯度下降的时候很难找到最合适的方向。(说到代价函数,其实人们更习惯用大写的字母J表示,但由于某些奇怪的历史原因,我一直用cost表示代价函数)直观的想像一下,当你身处一座火山的内壁,你想找到海拔最低的点,那只需要往中间的方向跑(或者滚)就行了。但如果你身处一个海沟,那么,你可能很容易的从内壁走到沟底,但接下来你会在沟底不停的徘徊。因此,我们的想法是把一个海沟变成火山。怎么办呢?我刚才已经说出了答案,只需要把我们的属性值进行适当的缩放,让他们的范围大致相同就可以了。那缩放到什么范围合适呢?实际上,并没有什么约定俗成的行业规范,但如果你问我的话,我推荐你用-1到1这个范围(其他范围也是完全可以的)。按照这种想法,我们可以对前两个特征值进行缩放:

如果你按照我的建议,把(-1,1)当作你属性值的范围的话,你只需要把每个元素都除上这个属性的绝对值的最大值就可以了。你可能还有一个疑惑,特征缩放是放在把一个属性值分成它的不同次幂这个过程之前,还是之后呢?其实,应该是之前的。而且,如果你足够细心的话,你可以发现我选择(-1,1)作为范围的另一个原因,那就是一个属于(-1,1)的数的任意次幂还是属于(-1,1)。这样,我就不用再费神重新特征缩放了。

最后的过程叫做均值归一,你应该在学习统计学时见过这个名词。它的用处就是让属性值的平均值为0,这样的目的也是让梯度下降进行的更快一点。我猜你已经想到怎么做了,只要先求出原来数据的平均值,在让每个值减去这个平均值就可以了。所以,综合特征缩放和均值归一,我们能得到下面的公式:

其中m为总样本数,也就是数据集的数目,k是任意一个样本的属性值。下一章,我们会讲解如何优化你的线性回归方程。
推荐阅读:
相关文章