深入浅出线性回归(二):机器学习笔记
但其实还有很多问题需要我们解决:这个模型的效果如何?如何评判这个效果?开始线性模型的假设成立吗?如何验证这些假设?还会有其它问题会影响模型效果吗?带着这些问题我们开始本篇的内容。
-
线性回归拟合优度
-
线性回归假设检验
-
线性回归诊断
▌线性回归拟合优度
1. 判定系数
回归直线与各观测点的接近程度成为回归直线对数据的拟合优度。而评判直线拟合优度需要一些指标,其中一个就是判定系数。
我们知道,因变量y值有来自两个方面的影响:
(1)来自x值的影响,也就是我们预测的主要依据
(2)来自无法预测的干扰项ϵ的影响
如果一个回归直线预测非常准确,那么它就需要让来自x的影响尽可能的大,而让来自无法预测干扰项的影响尽可能的小,也就是说x影响占比越高,预测效果就越好。下面我们看一下如何定义这些影响,并形成指标。
-
SST(总平方和):变差总平方和
-
SSR(回归平方和):由x与y之间的线性关系引起的y变化
-
SSE(残差平方和):除x影响之外的其它因素引起的y变化
它们之间的关系是:
还是用上篇的数据为例,利用R2来测试一下拟合的效果是怎么样的。
def R2square(yArr,y_hat): n = len(yArr) yArr = np.array(yArr).reshape(n,1) y_hat = np.array(y_hat).reshape(n,1) # ssr diff_yhat = y_predict - np.mean(yArr) ssr = np.sum(np.power(diff_yhat,2)) # sst diff_y = yArr - np.mean(yArr) sst = np.sum(np.power(diff_y,2)) return round(ssr/sst,2) R2square(yArr,y_predict) >>0.97
可以看到最后的得分是0.97,说明拟合程度还是很不错的。
2. 估计标准误差
判定系数R2的意义是由x引起的影响占总影响的比例来判断拟合程度的。当然,我们也可以从误差的角度去评估,也就是用残差SSE进行判断。估计标准误差是均方残差的平方根,可以度量各实际观测点在直线周围散布的情况。
估计标准误差与判定系数相反,se反映了预测值与真实值之间误差的大小,se越小说明拟合度越高,相反,se越大说明拟合度越低。仍然用之前的数据集进行测试:
def MSEsqrt(yArr,y_hat): n = len(yArr) yArr = np.array(yArr).reshape(n,1) y_hat = np.array(y_hat).reshape(n,1) diff = yArr - y_predict # sse sse = np.sum(np.power(diff,2)) return round(np.sqrt(sse/(n-2)),2) MSEsqrt(yArr,y_predict) >>0.08
可以看到,平均的标准误差只有0.08,非常低,说明了拟合效果很不错,同时也证实了R2结果的正确性。
▌线性回归的显著性检验
要想知道我们根据样本拟合的模型是否可以有效地预测或估计,我们需要对拟合的模型进行显著性检验。回归分析中的显著性检验主要包括两方面内容:线性关系检验;回归系数检验。
1. 线性关系检验
线性关系检验是指多个自变量x和因变量y之间的线性关系是否显著,它们之间是否可以用一个线性模型表示。检验统计量使用F分布,其定义如下:
SSR的*度为:自变量的个数k
SSE的*度为:n-k-1
利用F统计量,线性关系检验的一般步骤为:
(1)提出原假设和备择假设
(2)计算检验的统计量F
(2)作出统计决策
与假设检验相同,如果给定显著性水平α,则根据两个*度k和n-k-1进行F分布的查表。若
通过上面步骤的假设,我们也看到了:在多元线性回归中,只要有一个自变量系数不为零(即至少一个自变量系数与因变量有线性关系),我们就说这个线性关系是显著的。如果不显著,说明所有自变量系数均为零。
2. 回归系数检验
回归系数的显著性检验与线性检验不同,它要求对每一个自变量系数进行检验,然后通过检验结果可判断出自变量是否显著。因此,我们可以通过这种检验来判断一个特征(自变量)的重要性,并对特征进行筛选。检验统计量使用t分布,步骤如下:
(1)提出原假设和备择假设
对于任意参数
有:
(2)计算检验统计量t
(3)作出统计决策
如前面一样,我们需要根据*度n-k-1查t分布表,并通过α或者p值判断显著性。
3. Python代码实现
下面通过一段代码来说明上面两种显著性检验,为了方便我们直接通过statsmodels模型引入ols模型进行回归拟合,然后查看总结表,其中包括F和t统计量结果。
import statsmodels.formula.api as smf import statsmodels.api as sm # 创建线性回归最小二乘法模型 model = sm.OLS(yArr,xArr) results = model.fit() results.summary()
通过上面结果我们清楚看到:
-
F统计量的p值非常小,拒绝原假设,说明线性关系显著
-
两个回归系数的t统计量p值均为0,拒绝原假设,说明回归系数也都显著
▌线性回归的诊断
线性回归的诊断包括很多内容,比较重要的几个有:
(1)残差分析
(2)线性相关性检验
(3)多重共线性分析
(4)强影响点分析
下面我们开始分别介绍这几个需要诊断的内容。
残差分析
还记得我们的模型是怎么来的吗?没错,线性回归模型是基于一些假设条件的:除了自变量和因变量有线性相关关系外,其它假设基本都是关于残差的,主要就是残差ϵ独立同分布,服从
总结一下关于残差有三点假设:(1)正态性检验;(2)独立性检验;(3)方差齐性检验。下面我们将对这些假设逐一诊断,只有假设被验证,模型才是成立的。
1. 正态性检验
干扰项(即残差),服从正态分布的本质是要求因变量服从变量分布。因此,验证残差是否服从正态分布就等于验证因变量的正态分布特性。关于正态分布的检验通常有以下几种方法。
(1)直方图法:
直方图法就是根据数据分布的直方图与标准正态分布对比进行检验,主要是通过目测。比如本例中我们的直方图可以这样显示出来:
residual = results.resid sns.distplot(residual, bins = 10, kde = False, color = 'blue', fit = stats.norm) plt.show()
通过目测,我们发现残差的数据分布并不是很好的服从正态分布,因此这里是不满足假设条件的。
(2)PP图和QQ图:
PP图是对比正态分布的累积概率值和实际分布的累积概率值。statsmodels中直接提供了该检测方法:
# pp图法 pq = sm.ProbPlot(residual) pq.ppplot(line='45')
QQ图是通过把测试样本数据的分位数与已知分布相比较,从而来检验数据的分布情况。对应于正态分布的QQ图,就是由标准正态分布的分位数为横坐标,样本值为纵坐标的散点图。同样的,我们通过一段代码来观察一下:
# qq图法 pq = sm.ProbPlot(residual) pq.qqplot(line='q')