线性回归的推导与优化

2020-12-18 09:36:10 浏览数 (1)

写在前面的的话

大家好,我是小一

这是大话系列的第7节算法,也是本系列的第15篇原创文章。

文章较长,建议先收藏再阅读。文末附线性回归的思维导图。

线性回归

学习线性回归之前必须先要了解什么是回归,了解回归之前我们先从分类算法说起。

前面我们介绍的算法都属于分类算法,分类顾名思义就是预测样本对应的应该是哪一类,比如决策树实战中预测泰坦尼克号的乘客生还还是遇难,比如knn实战中预测对应的书写数字应该属于哪一类(即哪一个数字)等等这些都属于分类算法

可以看到分类算法对应的目标变量都是类别型,而在回归算法中对应的目标变量都是连续型。

像下面这个图,就是一个回归问题的预测。再举个简单的例子,比如可以根据房屋的面积、户型、楼层等指标预测房屋的价格,这也是一个回归问题,因为我们最终预测的结果不是一个类别型变量,而是一个连续型变量。

在回归算法中,我们一般会遇到单变量回归和多变量回归,这个其实和一元方程、多元方程是一样的。

如果只有一个自变量,我们称之为一元回归,如果有两个及以上的自变量,我们称之为多元回归,就好比区分一元方程和多元方程一样。

单变量线性回归
相关概念介绍

一元一次方程 y=ax b中,指的是未知数的个数(即x),指的是未知数的最大幂数(即x的几次方),那么回归也就是针对输入变量x和输出变量y之间的一个映射,单变量线性回归只有一个输入特征,而且它的拟合曲线呈线性分布

就和上面的图中的直线一样,就是我们针对样本点预测出的一条最优拟合曲线。

在单变量线性回归中,最终的拟合曲线可能是条笔直的直线,也可能是一个曲线,但是它一定是线性分布的。

预测函数

首先先来了解一下我们线性回归算法的目的:确定一条最优的拟合曲线。说的通俗易懂点,就是确定一个能够使预测结果最优的函数方程。

所以针对给定的数据集x和y,预测函数会根据输入特征x计算输出值h(x)。其中输入和输出的函数关系如下:

h_theta(x) = theta_0 theta_1x

可以看到我们最终的目的是确定这样的一个预测函数,使得预测函数h计算出来的值与真实值y的整体误差最小。

为了达到这个目的,我们需要找到合适的

theta_0,theta_1

的值,而这个

theta_0,theta_1

称之为单变量线性回归模型的模型参数。

损失函数

为了达到上面的目的,我们需要对整体的一个误差进行评估,求得在整体误差最小的情况下的

theta_0,theta_1

的值

我们在评估样本整体误差的时候,一般采用平方和计算整体的误差,所以我们的损失函数方程可以写成:

J(theta) = J(theta_0,theta_1) = frac{1}{2m}sum_{i=1}^m(h(x^{(i)})-y^{(i)})^2

其中,

h(x^{(i)})

表示预测的值,

y^{(i)}

表示实际值,上标i表示第i个样本,1/2是为了方便计算,后面你会遇到。

通过上面损失函数我们可以计算整体样本的误差情况,为了模型预测的能尽可能准确,我们当然是希望整体误差越小越好

再观察一下损失函数,如果我们能够找到最优的

theta_0,theta_1

,那么预测的结果

h(x^{(i)})

也就更接近实际值

y^{(i)}

,样本的整体误差

J(theta)

也就最小。

所以问题又回到了找到合适的

theta_0,theta_1

的值

ok,在解决这个问题的时候,梯度下降算法就派上用场了。

梯度下降算法

首先在一个三维空间中,以

theta_0

作为x轴,以

theta_1

作为y轴,以损失函数

J(theta_0,theta_1)

作为z轴,那我们的目的就是在找到z轴最小值的同时确定其所对应的x轴上的值

theta_0

和y轴上的值

theta_1

梯度算法的原理是,先随机选择一组

theta_0,theta_1

,同时选择一个参数α作为移动的步幅。然后,让x轴上的

theta_0

分别向特定的方向移动一小步,这个步幅的大小由参数α决定。经过多次迭代之后,x轴和y轴上的值决定的点就慢慢的靠近z轴上的最小处。

上面这个图是从正上方视角去看刚才的那个三维空间。

我们随机选择的点在x0处,经过多次迭代之后,慢慢的靠近圆心处,也就是z轴上最小值附近。

这里面有一个核心问题需要注意,在x0处为什么会走向图中的x1处,为什么不是另一个方向呢?换个说法就是在x0处如何确定移动的方向?

想必你可能还记得一丢丢梯度的概念,ok,这一丢丢就够了

梯度就是在一个点处沿着该方向(梯度的方向)变化最快,那我们沿着梯度方向岂不是可以使得损失函数

J(theta_0,theta_1)

增加的最少?

整理一下梯度的思路:我们要让

theta_j

不停地迭代,由当前

theta_j

的值,根据

J(theta)

的偏导数函数,计算

J(theta)

theta_j

上的斜率,然后再乘以学习率α,就可以让

theta_j

J(theta)

的方向迈一小步。

根据梯度下降公式:

theta_j = theta_j-alpha frac{partial}{partialtheta_j}J(theta)

我们可以确定

theta_0,theta_1

的更新过程:

theta_0 = theta_0-frac{alpha}{m}sum_{i=1}^m(h(x^{(i)})-y^{(i)})
theta_1 = theta_1-frac{alpha}{m}sum_{i=1}^m((h(x^{(i)})-y^{(i)})x_i)

其中,α是学习率(也就是每一步的步长),m是训练样本的个数,针对上面这个公式,我们可以在每一步去更新

theta_0,theta_1

的值,这样我们最终确定的

theta_0,theta_1

就是当前样本集的最优模型参数。

多变量线性回归
相关概念介绍

上面我们所说的线性回归是只有一个输入特征,但是在实际中并不全是单输入特征的场景,相比之下,多变量输入特征的案例会更多些。也就是这节的多变量线性回归

预测函数

此时多变量线性回归输出的y值由输入特征

x_1,x_2,x_3,...,x_n

共同决定,对应的此时的预测函数模型可以写成:

h_theta(x) = theta_0 theta_1x_1 theta_2x_2 ... theta_nx_n

x_0

为常数1,则此时的预测函数可以写成:

h_theta(x) = sum_{j=0}^ntheta_jx_j

根据向量乘法运算原则,预测函数也可以写成如下的形式:

h_theta(x) = [theta_0 theta_1 ... theta_n] begin{bmatrix}x_0\x_1\...\x_n end{bmatrix}=theta^Tx

写成向量形式的预测函数不但因为简洁,还可以在实现算法时通过Numpy的矩阵运算来提高效率

损失函数

同理此时的损失函数可以写成:

J(theta) = frac{1}{2m}sum_{i=1}^m(h(x^{(i)})-y^{(i)})^2

和单变量线性回归的形式相同,此时多变量线性回归的损失函数的矩阵形式可以写成:

J(theta) = frac{1}{2m}(Xtheta-Y)^T(Xtheta-Y)

X为m×(x 1)维的训练样本矩阵,Y表示由所有的训练样本的输出

y^(i)

构成的向量。

同样的道理,此时我们也可以通过梯度下降法计算损失函数来确定最优的参数θ,注意此时的θ表示的列向量

梯度下降法

根据单变量梯度下降公式:

theta_j = theta_j-alpha frac{partial}{partialtheta_j}J(theta)

我们可以得到此时的梯度下降法参数更新公式:

theta_j = theta_j-frac{alpha}{m}sum_{i=1}^m((h(x^{(i)})-y^{(i)})x_j^{(i)})

根据这个公式,我们在进行编码的时候可以按照这个顺序:

  • 确定学习率α α太大意味着会直接跨过目的地,使得损失函数无法收敛;太小则意味着需要很多次才能达到目的地,会迭代较多次数,算法的效率较低。
  • 确定参数起始点 比如我们可以让所有的参数都以1作为起点,即
theta_0=1,theta_1=1,...,theta_n=1

。这样就可以通过预测值和成本函数计算在参数起始位置的成本。一般情况下可以选择极点附近作为起始点,或者根据实际情况灵活选择。

  • 计算参数的下一组值 根据梯度下降的参数迭代公式,分别同时计算出新的θ的值,然后使用新的θ的值得到新的西预测函数,根据新的预测函数,代入成本函数算出新的成本。
  • 确认成本函数是否收敛 通过比较新的成本和旧的成本看成本是不是变得越来越小。如果两次的差异小于误差范围,就可以近似认为已经找到了最小成本。如果大于,则需要重复计算参数θ,直到找到最优解。
模型优化
介绍

在线性回归的预测中,很容易出现两个问题:过拟合和欠拟合。

如果模型在训练集上学的过好,模型就会记住训练样本的细节,导致模型在测试集的泛化效果较差,这种现象称为过拟合(Overfitting)。与过拟合相对应的是欠拟合(Underfitting),即模型在训练集上的拟合效果较差。

针对欠拟合我们可以增加特征的维度、使用较少的训练样本等方式来进行模型优化;针对过拟合我们可以增加惩罚项、减少特征输入个数、使用更多的训练样本等来进行模型优化。

线性回归欠拟合

当线性回归模型欠拟合时我们通常使用增加特征维度来进行优化,例如我们可以通过增加特征多项式来让模型更好的拟合数据。

比如有两个特征x1、x2,我们可以增加两个特征的乘积x1x2作为新特征x3,或者增加

x_1^2

作为新特征x3等等,通过增加特征维度的方法让模型更好的拟合样本数据。

线性回归过拟合

当线性回归模型过拟合时我们通常使用正则化的方法来进行优化,此时我们主要是对损失函数进行优化:

J(theta) = frac{1}{2m}sum_{i=1}^m(h(x^{(i)})-y^{(i)})^2 lambdasum_{j=1}^n theta_j^2

前半部分是我们在线性回归模型中的损失函数,也就是预测值和实际值的误差。后半部分是加入的正则项,其中λ既可以维持对训练样本的拟合,又可以避免对训练样本的过拟合。

从数学角度分析,损失函数增加了一个正则项后,损失函数不再唯一的由预测值和真实值的误差所决定,还会和参数θ的大小有关。

比如某个比较大的θ的值会让

(h(x^{(i)})-y^{(i)})^2

的值很小,但会导致

theta_j^2

很大,最终的结果是成本函数太大,此时可以通过调整参数λ,通过控制正则项的权重,从而避免线性回归算法的过拟合。

利用正则化的成本函数,可以推导出正则化后的参数迭代函数:

theta_j = theta_j(1-alphafrac{lambda}{m})-alphafrac{1}{m}sum_{i=1}^m((h(x^{(i)})-y^{(i)})x_j^{(i)})

可以看到α和λ都是正数,而m是训练样例的个数,所有因子

1-alphafrac{lambda}{m}

会在每次迭代的时候把

theta_j

收缩一点点。如果从损失函数的公式中来看,因为

J(theta)

theta_j^2

成正比,所以迭代时不断减少θ的值可以让损失函数尽可能的小。

数据归一化

在线性回归模型中,还有一点需要特别注意,那就是是数据归一化,特别是当我们通过多项式的方式添加特征的时候,特征的分布很不一致。

例如x1的范围是[1,10]之间,而特征x2的范围是[1,10000]之间,这个时候就需要进行数据归一化,在进行特征归一化之后,可以使得样本的特征分布都在[0,1]之间。

通过对数据归一化之后可以使算法收敛的更快,提升模型拟合的计算效率。但是在对模型预测的过程中,预测的结果需要乘以归一化处理的系数。

模型优缺点

优点:

  • 思想简单,实现容易。对于小数据量、简单的关系建模迅速有效;
  • 是许多强大的非线性模型的基础。
  • 容易理解,结果具有很好的可解释性,有利于决策分析。
  • 能解决回归问题。

缺点:

  • 对于非线性数据或者数据特征间具有相关性多项式回归难以建模.
  • 难以很好地表达高度复杂的数据。
思维导图
写在后面的话

稍稍总结一下,回归模型的目的是预测数值型的目标值,像诸如房价预测,年龄预测等等都可以通过回归模型去解决。

当然了你要说分类模型可以解决吗?也可以的。只不过各有所长,各有所短,而且针对样本特征需要进行相应的处理。

代码语言:javascript复制

0 人点赞