这是大话系列的第7节算法,也是本系列的第15篇原创文章。
文章较长,建议先收藏再阅读。文末附线性回归的思维导图。
学习线性回归之前必须先要了解什么是回归,了解回归之前我们先从分类算法说起。
前面我们介绍的算法都属于分类算法,分类顾名思义就是预测样本对应的应该是哪一类,比如决策树实战中预测泰坦尼克号的乘客生还还是遇难,比如knn实战中预测对应的书写数字应该属于哪一类(即哪一个数字)等等这些都属于分类算法
可以看到分类算法对应的目标变量都是类别型,而在回归算法中对应的目标变量都是连续型。
像下面这个图,就是一个回归问题的预测。再举个简单的例子,比如可以根据房屋的面积、户型、楼层等指标预测房屋的价格,这也是一个回归问题,因为我们最终预测的结果不是一个类别型变量,而是一个连续型变量。
在回归算法中,我们一般会遇到单变量回归和多变量回归,这个其实和一元方程、多元方程是一样的。
如果只有一个自变量,我们称之为一元回归,如果有两个及以上的自变量,我们称之为多元回归,就好比区分一元方程和多元方程一样。
一元一次方程 y=ax+b中,元指的是未知数的个数(即x),次指的是未知数的最大幂数(即x的几次方),那么回归也就是针对输入变量x和输出变量y之间的一个映射,单变量线性回归只有一个输入特征,而且它的拟合曲线呈线性分布
就和上面的图中的直线一样,就是我们针对样本点预测出的一条最优拟合曲线。
在单变量线性回归中,最终的拟合曲线可能是条笔直的直线,也可能是一个曲线,但是它一定是线性分布的。
首先先来了解一下我们线性回归算法的目的:确定一条最优的拟合曲线。说的通俗易懂点,就是确定一个能够使预测结果最优的函数方程。
所以针对给定的数据集x和y,预测函数会根据输入特征x计算输出值h(x)。其中输入和输出的函数关系如下:
可以看到我们最终的目的是确定这样的一个预测函数,使得预测函数h计算出来的值与真实值y的整体误差最小。
为了达到这个目的,我们需要找到合适的的值,而这个称之为单变量线性回归模型的模型参数。
为了达到上面的目的,我们需要对整体的一个误差进行评估,求得在整体误差最小的情况下的的值
我们在评估样本整体误差的时候,一般采用平方和计算整体的误差,所以我们的损失函数方程可以写成:
其中,表示预测的值,表示实际值,上标i表示第i个样本,1/2是为了方便计算,后面你会遇到。
通过上面损失函数我们可以计算整体样本的误差情况,为了模型预测的能尽可能准确,我们当然是希望整体误差越小越好
再观察一下损失函数,如果我们能够找到最优的,那么预测的结果也就更接近实际值,样本的整体误差也就最小。
所以问题又回到了找到合适的的值
ok,在解决这个问题的时候,梯度下降算法就派上用场了。
首先在一个三维空间中,以作为x轴,以作为y轴,以损失函数作为z轴,那我们的目的就是在找到z轴最小值的同时确定其所对应的x轴上的值和y轴上的值。
梯度算法的原理是,先随机选择一组,同时选择一个参数α作为移动的步幅。然后,让x轴上的分别向特定的方向移动一小步,这个步幅的大小由参数α决定。经过多次迭代之后,x轴和y轴上的值决定的点就慢慢的靠近z轴上的最小处。
上面这个图是从正上方视角去看刚才的那个三维空间。
我们随机选择的点在x0处,经过多次迭代之后,慢慢的靠近圆心处,也就是z轴上最小值附近。
这里面有一个核心问题需要注意,在x0处为什么会走向图中的x1处,为什么不是另一个方向呢?换个说法就是在x0处如何确定移动的方向?
想必你可能还记得一丢丢梯度的概念,ok,这一丢丢就够了
梯度就是在一个点处沿着该方向(梯度的方向)变化最快,那我们沿着梯度方向岂不是可以使得损失函数增加的最少?
整理一下梯度的思路:我们要让不停地迭代,由当前的值,根据的偏导数函数,计算在上的斜率,然后再乘以学习率α,就可以让往的方向迈一小步。
根据梯度下降公式:
我们可以确定的更新过程:
其中,α是学习率(也就是每一步的步长),m是训练样本的个数,针对上面这个公式,我们可以在每一步去更新的值,这样我们最终确定的就是当前样本集的最优模型参数。
上面我们所说的线性回归是只有一个输入特征,但是在实际中并不全是单输入特征的场景,相比之下,多变量输入特征的案例会更多些。也就是这节的多变量线性回归
此时多变量线性回归输出的y值由输入特征共同决定,对应的此时的预测函数模型可以写成:
若为常数1,则此时的预测函数可以写成:
根据向量乘法运算原则,预测函数也可以写成如下的形式:
写成向量形式的预测函数不但因为简洁,还可以在实现算法时通过Numpy的矩阵运算来提高效率
同理此时的损失函数可以写成:
和单变量线性回归的形式相同,此时多变量线性回归的损失函数的矩阵形式可以写成:
X为m×(x+1)维的训练样本矩阵,Y表示由所有的训练样本的输出构成的向量。
同样的道理,此时我们也可以通过梯度下降法计算损失函数来确定最优的参数θ,注意此时的θ表示的列向量
根据单变量梯度下降公式:
我们可以得到此时的梯度下降法参数更新公式:
根据这个公式,我们在进行编码的时候可以按照这个顺序:
确定学习率α
α太大意味着会直接跨过目的地,使得损失函数无法收敛;太小则意味着需要很多次才能达到目的地,会迭代较多次数,算法的效率较低。
确定参数起始点
比如我们可以让所有的参数都以1作为起点,即。这样就可以通过预测值和成本函数计算在参数起始位置的成本。一般情况下可以选择极点附近作为起始点,或者根据实际情况灵活选择。
计算参数的下一组值
根据梯度下降的参数迭代公式,分别同时计算出新的θ的值,然后使用新的θ的值得到新的西预测函数,根据新的预测函数,代入成本函数算出新的成本。
确认成本函数是否收敛
通过比较新的成本和旧的成本看成本是不是变得越来越小。如果两次的差异小于误差范围,就可以近似认为已经找到了最小成本。如果大于,则需要重复计算参数θ,直到找到最优解。
在线性回归的预测中,很容易出现两个问题:过拟合和欠拟合。
如果模型在训练集上学的过好,模型就会记住训练样本的细节,导致模型在测试集的泛化效果较差,这种现象称为过拟合(Overfitting)。与过拟合相对应的是欠拟合(Underfitting),即模型在训练集上的拟合效果较差。
针对欠拟合我们可以增加特征的维度、使用较少的训练样本等方式来进行模型优化;针对过拟合我们可以增加惩罚项、减少特征输入个数、使用更多的训练样本等来进行模型优化。
当线性回归模型欠拟合时我们通常使用增加特征维度来进行优化,例如我们可以通过增加特征多项式来让模型更好的拟合数据。
比如有两个特征x1、x2,我们可以增加两个特征的乘积x1x2作为新特征x3,或者增加作为新特征x3等等,通过增加特征维度的方法让模型更好的拟合样本数据。
当线性回归模型过拟合时我们通常使用正则化的方法来进行优化,此时我们主要是对损失函数进行优化:
前半部分是我们在线性回归模型中的损失函数,也就是预测值和实际值的误差。后半部分是加入的正则项,其中λ既可以维持对训练样本的拟合,又可以避免对训练样本的过拟合。
从数学角度分析,损失函数增加了一个正则项后,损失函数不再唯一的由预测值和真实值的误差所决定,还会和参数θ的大小有关。
比如某个比较大的θ的值会让的值很小,但会导致很大,最终的结果是成本函数太大,此时可以通过调整参数λ,通过控制正则项的权重,从而避免线性回归算法的过拟合。
利用正则化的成本函数,可以推导出正则化后的参数迭代函数:
可以看到α和λ都是正数,而m是训练样例的个数,所有因子会在每次迭代的时候把收缩一点点。如果从损失函数的公式中来看,因为和成正比,所以迭代时不断减少θ的值可以让损失函数尽可能的小。
在线性回归模型中,还有一点需要特别注意,那就是是数据归一化,特别是当我们通过多项式的方式添加特征的时候,特征的分布很不一致。
例如x1的范围是[1,10]之间,而特征x2的范围是[1,10000]之间,这个时候就需要进行数据归一化,在进行特征归一化之后,可以使得样本的特征分布都在[0,1]之间。
通过对数据归一化之后可以使算法收敛的更快,提升模型拟合的计算效率。但是在对模型预测的过程中,预测的结果需要乘以归一化处理的系数。
优点:
思想简单,实现容易。对于小数据量、简单的关系建模迅速有效;
是许多强大的非线性模型的基础。
容易理解,结果具有很好的可解释性,有利于决策分析。
能解决回归问题。
缺点:
对于非线性数据或者数据特征间具有相关性多项式回归难以建模.
难以很好地表达高度复杂的数据。
当然了你要说分类模型可以解决吗?也可以的。只不过各有所长,各有所短,而且针对样本特征需要进行相应的处理。
还是老规矩,加小一微信领取高清思维导图,或者每次推文后都会在交流群内分享,需要的自己保存。
更多算法请点击文章开头的专辑