线性回归:机器学习基础技术
在前面几期,我介绍了几个常见的机器学习的方法,但是我深知自己不是这方面的专家,需要不断地进行学习!机器学习领域浩瀚无边,我们将面临的第一个问题就是令人眼花缭乱的学习算法,到底要用哪一个?现在已经有几千种机器学习算法,每年都会涌现几百种新的算法!如果要想学会所有的算法,那真的是天方夜谭,分享一句话:
诸事皆殚精竭虑,终将一事无成。
因此,凡事从基础做起,从基础学机器学习,日积月累,终将收获满满!
01 单变量回归
线性回归是一项简单又特别有效的技术,线性回归使用最小二乘法预测定量的结果,真的没有比久经考验的线性回归更简单的模型了。因此,在机器学习的道路上,线性回归是一个非常好的起点。
我们先从一个简单的对定量型响应变量的预测开始。令这个响应变量为Y,还有一个预测变量x,假设Y与x具有线性关系,那么这个预测模型可以表示为Y = B0 + B1x + e。我们规定, Y的预测值是一个函数,等于B0(截距)加上B1(斜率)乘以x再加上一个误差项e。最小二乘法选择模型参数,使预测值y和实际值Y的残差平方和( RSS)最小。
数据来源:alr4包中的预测怀俄明州蛇河流域的水量的数据。
进行数据探索,将X和Y换成有意义的变量名

这张图很有意思,它的数据是线性的,因为被最前端和最后端的两个疑似离群点影响,有一点轻微的曲线形状。
R使用lm()函数进行线性回归, lm()可以建立一个标准形式的回归模型fit = lm(Y~X)。建立模型之后,可以对拟合模型使用各种函数,以检验自己的假设。代码如下:
通过summary()函数,我们可以查看模型包含的一些项目,比如模型具体参数、关于残差的描述性统计量、系数、模型显著性代码、模型误差和拟合程度的摘要。因为p值是高度显著的,所以我们可以拒绝原假设。
为散点图加上一条由模型产生的最佳拟合直线。代码如下:

看起来拟合得不错!但是线性回归必须通过假设检验:
线性:预测变量与响应变量之间的关系是线性的。如果线性关系不能清晰呈现,可以对变量X或Y进行数据转换(对数转换、多项式转换、指数转换等)以解决问题。
误差不相关性:如果误差是相关的,那么你就有可能建立一个非常不规范的模型。
同方差性:误差是正态分布的,并具有相同的方差。这意味着对于不同的输入值,误差的方差是个固定值。如果违背了这个假设,参数估计就有可能产生偏差,导致对显著性的统计检验结果过高或者过低,从而得到错误的结论。这种情况就称为异方差性。
非共线性:两个预测变量之间不存在线性关系,也就是说,特征之间不应该存在相关性。同样地,共线性也会导致估计偏差。
存在异常值:异常值会严重影响参数估计。理想情况下,必须在使用线性回归拟合模型之前就除去异常值。
plot()函数结合线性模型,可以自动生成4张统计图,帮助我们进行假设检验。

怎么看这四张图呢?首先,左边的两张图供我们检查误差的同方差性和非线性。误差的异方差性通常会表现为U形曲线或反U形曲线,也可能会紧密聚集在图的左侧,随着拟合值的增加逐渐变宽(漏斗形)。因此,该模型明显没有违背同方差性假设。
右上角的正态Q-Q图可以帮助我们确定残差是否服从正态分布。分位数-分位数图表示一个变量的分位数对应于另一个变量的分位数画出的图,从图中可以看出有离群点(第7、 9、 10个观测),这可能违反假设。
右下角的残差杠杆图可以告诉我们哪个观测值(如果有)会对模型造成过度影响,换句话说,是否存在我们应该关注的异常值。
对于正态Q-Q图,car 包中的qqPlot()函数可以自动生成Q-Q图并提供置信区间。

02 多元线性回归
很多情况下,变量都不是一对一关系,而是存在多个变量。这次用的是alr4包里面的water数据集。
所有特征都是数值型的,那么就应该检查相关性方面的统计量,并绘出散点图矩阵。有很多方式可以做出相关性矩阵图。有些人喜欢做热点图,但是我强烈推荐使用corrplot包做图,它可以用很多方式表示相关系数之间的差异,包括椭圆、圆、正方形、数字、阴影、颜色和饼图。
相关性矩阵图很漂亮!


这很明显看到,不同的变量之间高度相关,这意味着我们会遇到多重共线性的问题。
模型构建与模型检验
一个很重要的问题是,哪些变量是对模型影响重大的。我推荐用的是leaps包的最优子集回归和逐步回归方法。
前向逐步选择从一个零特征模型开始,然后每次添加一个特征,直到所有特征添加完毕。在这个过程中,被添加的选定特征建立的模型具有最小的RSS。所以理论上,第一个选定的特征应该能最好地解释响应变量,依此类推。
后向逐步回归从一个包含所有特征的模型开始,每次删除一个起最小作用的特征。现在也有一种混合方法,这种算法先通过前向逐步回归添加特征,然后检查是否有特征不再对提高模型拟合度起作用,如果有则删除。每次建模之后,分析者都可以检查模型输出,并使用各种统计量选择能提供最佳拟合的特征。
对于特征选择,最优子集回归是逐步回归的一个可接受的替代方案。在最优子集回归中,算法使用所有可能的特征组合来拟合模型,所以,如果有3个特征,将生成7个模型。然后和逐步回归一样,分析者需要应用自己的判断和统计分析来选择最优模型,模型选择就是后面工作的关键。
使用lm()函数构建所有特征的线性模型。
模型形式为fit = lm (y~x1 + x2 +x3 + … + xn)。
一个简单的技巧是,如果你想包括所有特征,只要在波形符号后面加一个句号,而不用把它们全打出来。
我们可以看到p值是高度显著的。还可以看到, OPRC和OPSLAKE这两个参数具有显著的p值。有趣的是, OPBPC并不显著,尽管它与响应变量高度相关。
建立初始模型之后,使用最优子集法。我们使用leaps包中的regsubsets()函数建立一个sub.fit对象。
我们可以看到,有6个特征的模型具有最小的RSS。需要注意的是,增加特征必然会减少RSS!而且必然会增加R方。
有4种用于特征选择的统计方法:赤池信息量准则、 马洛斯的Cp、 贝叶斯信息量准则和修正R方。
在线性模型中, AIC和Cp成正比,所以我们只需关注Cp 。BIC与Cp相比,更倾向于选择变量较少的模型,所以要对二者进行比较。使用下面的代码比较Cp和BIC:

在左侧的图中,可以看出有3个特征的模型具有最小的Cp值。
怎么看右侧的图呢?该图显示了能给出最小Cp的特征组合。先在Y轴的最高点找到最小的Cp值,此处是1.2;然后向右在X轴上找到与之对应的色块。通过这张图,我们可以看到这个具有最小Cp值的模型中的3个特征是APSLAKE、 OPRC和OPSLAKE。通过which.min()和which.max()函数,我们可以进行Cp与BIC和修正R方的比较。
可以看出,在本例中, BIC、修正R方和Cp选择的最优模型是一致的。现在,与单变量线性回归一样,我们需要检查模型并进行假设检验。
在这个三特征模型中, F统计量和所有t检验都具有显著的p值。通过了第一个检验,即可生成诊断图看看:

从上面的4张图可以看出,残差具有固定的方差并且服从正态分布 !杠杆图和QQ图也什么异常。
我们在作相关性分析时看出来可能存在共线性的问题。为了研究共线性的问题,我们要引入方差膨胀因子(VIF)这个统计量。VIF能取得的最小值是1,表示根本不存在共线性。现在还没有一个确定的准则决定共线性的严重程度,一般认为, VIF值超过5(有些人认为是10)就说明存在严重的共线性 !
car包中的vif()函数完全可以计算出VIF值:
基于相关性分析,我们发现OPRC和OPSLAKE存在潜在的共线性问题( VIF值大于5),这也是符合预期的。
我们看一下这两个变量的相关性:

解决共线性的简单方式就是,在不影响预测能力的前提下去掉这个变量。看一下最优子集法中生成的修正R方的值就会发现, APSLAKE和OPSLAKE组成的两变量模型的值为0.90,加入OPRC之后仅有一个微不足道的提升,到了0.92。
看一下这个两变量模型及其假设检验结果 :

诊断图中也没发现什么问题,共线性问题应该得到了解决。再使用vif()函数检查一下:
共线性问题解决了!所有的事情都搞定了,看上去,最好的预测模型应该由APSLAKE和OPSLAKE两个特征组成。这个模型可以解释河川径流量的90%的方差 。
在R基础包中,使用模型拟合值与响应变量的值可以生成预测值相对于实际值的散点图。

R基础包画的图看起来不是那么好看,在R中我强烈推荐使用ggplot2进行绘图。
效果图如下:

03 总结
本期中我主要介绍了线性回归方法,它预测定量结果,虽然简单,但极其有效。通过寥寥几行代码,你就可以做出非常强大的有洞察力的预测,以支持决策。后续分享中会涉及更高级的技术,但其中很多技术只是本期所学内容的扩展。
完整代码如下:
有其它问题可在后台私信我哦~
欢迎交流,点赞和转发!