如果让你预测一个人的体重是多少?在没有任何额外信息的情况下,你可能会用平均值来预测 , 尽管会存在一定误差,但总比瞎猜好 。
现在,如果你知道他的身高信息,你的预测值肯定与平均值不一样 。额外信息相比平均值更能准确地预测被预测的变量的能力,就代表模型的解释力大小 。
上图中,SSA 代表由自变量 x 引起的 y 的离差平方和,即回归平方和,代表回归模型的解释力;SSE 代表由随机因素引起的 y 的离差平方和,即剩余平方和,代表回归模型未能解释的部分;SST 为总的离差平方和,即我们仅凭 y 的平均值去估计 y 时所产生的误差 。
用模型能够解释的变异除以总的变异就是模型的拟合程度:
R2=SSA/SST=1-SSE
R2(R 的平方)也被称为决定系数或判定系数 。
第二个问题 , 我们的模型是否显著预测了 y 的变化?
假设 y 与 x 的线性关系不明显,那么 SSA 相对 SSE 占有较大的比例的概率则越小 。换句话说,在 y 与 x 无线性关系的前提下,SSA 相对 SSE 的占比越高的概率是越小的,这会呈现一定的概率分布 。统计学家告诉我们它满足 F 分布,就像这样:
如果 SSA 相对 SSE 占比较大的情况出现了,比如根据 F 分布,这个值出现的概率小于 5% 。那么,我们最好是拒绝 y 与 x 线性关系不显著的原始假设,认为二者存在显著的线性关系较为合适 。
第三个问题,每个自变量是否能显著预测因变量的变化?换句话说,回归系数是否显著?
回归系数的显著性检验是围绕回归系数的抽样分布(t 分布)来进行的,推断过程类似于整个模型的检验过程,不赘言 。
实际上,对于只有一个自变量的一元线性模型 , 模型的显著性检验和回归系数的检验是一致的 , 但对于多元线性模型来说,二者就不能等价了 。
利用 statsmodels 进行最小二乘回归
#导入相应模块
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: import statsmodels.api as sm
#将数据导入 pandas 的 dataframe 对象,第一列(年份)作为行标签
In [4]: df=pd.read_csv('/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv', index_col=0)
#查看头部数据
In [5]: df.head()
Out[5]:
GNP.deflatorGNPUnemployedArmed.ForcesPopulationYear\
194783.0234.289235.6159.0107.6081947
194888.5259.426232.5145.6108.6321948
194988.2258.054368.2161.6109.7731949
195089.5284.599335.1165.0110.9291950
195196.2328.975209.9309.9112.0751951
Employed
194760.323
194861.122
194960.171
195061.187
195163.221
#设置预测变量和结果变量,用 GNP 预测 Employed
In [6]: y=df.Employed #结果变量
In [7]: X=df.GNP #预测变量
#为模型增加常数项,即回归线在 y 轴上的截距
In [8]: X=sm.add_constant(X)
#执行最小二乘回归,X 可以是 numpy array 或 pandas dataframe(行数等于数据点个数 , 列数为预测变量个数),y 可以是一维数组(numpy array)或 pandas series
In [10]: est=sm.OLS(y,X)
使用 OLS 对象的 fit() 方法来进行模型拟合
In [11]: est=est.fit()
#查看模型拟合的结果
In [12]: est.summary()
Out[12]:
#查看最终模型的参数
In [13]: est.params
Out[13]:
const51.843590
GNP0.034752
dtype: float64
#选择 100 个从最小值到最大值平均分布(equally spaced)的数据点
In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]
In [15]: X_prime=sm.add_constant(X_prime)
#计算预测值
In [16]: y_hat=est.predict(X_prime)
推荐阅读
- python输出滚动字幕,pycharm 滚轮字体大小设置
- 食品拍摄要注意什么,食品产品拍摄
- vb.net添加串口控件 如何在vb编程环境中添加串口控件
- 电商如何做品牌,新品牌电商如何做起来
- pg数据库某表记录条数,数据库表的记录
- python函数需要申明 python函数必须有参数
- 山西专业的erp系统设计方案,山西专业的erp系统设计方案怎么样
- 关于javascript与html5的信息
- 直播篮球的设备,球赛直播设备