如何用python作空间自回归模型基本形式
线性模型(linear model)就是试图通过属性python常用回归函数的线性组合来进行预测的函数,基本形式如下:
f(x)=wTx b
许多非线性模型可在线性模型的基础上通过引入层结构或者高维映射(比如核方法)来解决 。线性模型有很好的解释性 。
线性回归
线性回归要求均方误差最小:
(w?,b?)=argmin∑i=1m(f(xi)?yi)2
均方误差有很好的几何意义 , 它对应python常用回归函数了常用的欧式距离(Euclidean distance) 。基于均方误差最小化来进行模型求解称为最小二乘法(least square method),线性回归中,最小二乘发就是试图找到一条直线,使得所有样本到直线的欧式距离之和最小 。
python常用回归函数我们把上式写成矩阵的形式:
w?=argmin(y?Xw)T(y?Xw)
这里我们把b融合到w中,X中最后再加一列1 。为了求最小值,我们对w求导并令其为0:
2XT(Xw?y)=0
当XTX为满秩矩阵(full-rank matrix)时是可逆的 。此时:
w=(XTX)?1XTy
令xi=(xi,1),可以得到线性回归模型:
f(xi)=xTi(XTX)?1XTy
如何用python实现含有虚拟自变量的回归利用python进行线性回归
理解什么是线性回归
线性回归也被称为最小二乘法回归(Linear Regression, also called Ordinary Least-Squares (OLS) Regression) 。它的数学模型是这样的:
y = ab* x+e
其中,a 被称为常数项或截距;b 被称为模型的回归系数或斜率;e 为误差项 。a 和 b 是模型的参数 。
当然,模型的参数只能从样本数据中估计出来:
y'= a'b'* x
我们的目标是选择合适的参数,让这一线性模型最好地拟合观测值 。拟合程度越高,模型越好 。
那么 , 接下来的问题就是,我们如何判断拟合的质量呢?
这一线性模型可以用二维平面上的一条直线来表示 , 被称为回归线 。
模型的拟合程度越高,也即意味着样本点围绕回归线越紧密 。
如何计算样本点与回归线之间的紧密程度呢?
高斯和勒让德找到的方法是:被选择的参数,应该使算出来的回归线与观测值之差的平房和最小 。用函数表示为:
这被称为最小二乘法 。最小二乘法的原理是这样的:当预测值和实际值距离的平方和最小时,就选定模型中的两个参数(a 和 b) 。这一模型并不一定反映解释变量和反应变量真实的关系 。但它的计算成本低;相比复杂模型更容易解释 。
模型估计出来后 , 我们要回答的问题是:
我们的模型拟合程度如何?或者说 , 这个模型对因变量的解释力如何?(R2)
整个模型是否能显著预测因变量的变化?(F 检验)
每个自变量是否能显著预测因变量的变化?(t 检验)
首先回答第一个问题 。为了评估模型的拟合程度如何,我们必须有一个可以比较的基线模型 。
如果让你预测一个人的体重是多少?在没有任何额外信息的情况下,你可能会用平均值来预测 , 尽管会存在一定误差,但总比瞎猜好 。
现在 , 如果你知道他的身高信息 , 你的预测值肯定与平均值不一样 。额外信息相比平均值更能准确地预测被预测的变量的能力,就代表模型的解释力大小 。
上图中,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)
In [17]: plt.scatter(X.GNP, y, alpha=0.3) #画出原始数据
#分别给 x 轴和 y 轴命名
In [18]: plt.xlabel("Gross National Product")
In [19]: plt.ylabel("Total Employment")
In [20]: plt.plot(X_prime[:,1], y_hat, 'r', alpha=0.9) #添加回归线 , 红色
多元线性回归(预测变量不止一个)
我们用一条直线来描述一元线性模型中预测变量和结果变量的关系,而在多元回归中,我们将用一个多维(p)空间来拟合多个预测变量 。下面表现了两个预测变量的三维图形:商品的销量以及在电视和广播两种不同媒介的广告预算 。
数学模型是:
Sales = beta_0beta_1*TVbeta_2*Radio
图中 , 白色的数据点是平面上的点,黑色的数据点事平面下的点 。平面的颜色是由对应的商品销量的高低决定的,高是红色,低是蓝色 。
利用 statsmodels 进行多元线性回归
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: df_adv=pd.read_csv('g.csv',index_col=0)
In [6]: X=df_adv[['TV','Radio']]
In [7]: y=df_adv['Sales']
In [8]: df_adv.head()
Out[8]:
TVRadioNewspaperSales
1230.137.869.222.1
244.539.345.110.4
317.245.969.39.3
4151.541.358.518.5
5180.810.858.412.9
In [9]: X=sm.add_constant(X)
In [10]: est=sm.OLS(y,X).fit()
In [11]: est.summary()
Out[11]:
你也可以使用 statsmodels 的 formula 模块来建立多元回归模型
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Sales ~ TVRadio',data=https://www.04ip.com/post/df_adv).fit()
处理分类变量
性别或地域都属于分类变量 。
In [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)
In [16]: X=df.copy()
利用 dataframe 的 pop 方法将 chd 列单独提取出来
In [17]: y=X.pop('chd')
In [18]: df.head()
Out[18]:
sbptobaccoldladiposityfamhisttypeaobesityalcohol\
row.names
116012.005.7323.11Present4925.3097.20
21440.014.4128.61Absent5528.872.06
31180.083.4832.28Present5229.143.81
41707.506.4138.03Present5131.9924.26
513413.603.5027.78Present6025.9957.34
agechd
row.names
1521
2631
3460
4581
5491
In [19]: y.groupby(X.famhist).mean()
Out[19]:
famhist
Absent0.237037
Present0.500000
Name: chd, dtype: float64
In [20]: import statsmodels.formula.api as smf
In [21]: df['famhist_ord']=pd.Categorical(df.famhist).labels
In [22]: est=smf.ols(formula="chd ~ famhist_ord", data=https://www.04ip.com/post/df).fit()
分类变量的编码方式有许多,其中一种编码方式是虚拟变量编码(dummy-encoding),就是把一个 k 个水平的分类变量编码成 k-1 个二分变量 。在 statsmodels 中使用 C 函数实现 。
In [24]: est=smf.ols(formula="chd ~ C(famhist)", data=https://www.04ip.com/post/df).fit()
In [26]: est.summary()
Out[26]:
处理交互作用
随着教育年限(education)的增长,薪酬 (wage) 会增加吗?这种影响对男性和女性而言是一样的吗?
这里的问题就涉及性别与教育年限的交互作用 。
换言之,教育年限对薪酬的影响是男女有别的 。
#导入相关模块
In [1]: import pandas as pd
In [2]: import numpy as np
In [4]: import statsmodels.api as sm
#导入数据 , 存入 dataframe 对象
In [5]: df=pd.read_csv('/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv')
In [6]: df[['Wage','Education','Sex']].tail()
Out[6]:
WageEducationSex
52911.36180
5306.10121
53123.25171
53219.88120
53315.38160
由于性别是一个二分变量,我们可以绘制两条回归线,一条是 sex=0(男性) , 一条是 sex=1(女性)
#绘制散点图
In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [9]: plt.xlabel('education')
In [10]: plt.ylabel('wage')
#linspace 的作用是生成从最小到最大的均匀分布的 n 个数
In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Wage ~ EducationSex', data=https://www.04ip.com/post/df).fit()
In [18]: plt.plot(education_linspace, est.params[0] est.params[1]education_linspace est.params[2]0, 'r')
In [19]: plt.plot(education_linspace, est.params[0] est.params[1]education_linspace est.params[2]1, 'g')
以上两条线是平行的 。这是因为分类变量只影响回归线的截距,不影响斜率 。
接下来我们可以为回归模型增加交互项来探索交互效应 。也就是说,对于两个类别,回归线的斜率是不一样的 。
In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [33]: plt.xlabel('education')
In [34]: plt.ylabel('wage')
#使用*代表我们的回归模型中除了交互效应,也包括两个变量的主效应;如果只想看交互效应,可以用:代替,但通常不会只看交互效应
In [35]: est=smf.ols(formula='Wage ~ Sex*Education', data=https://www.04ip.com/post/df).fit()
In [36]: plt.plot(education_linspace, est.params[0] est.params[1]0 est.params[2]education_linspace est.params[3]0education_linspace, 'r')
In [37]: plt.plot(education_linspace, est.params[0] est.params[1]1 est.params[2]education_linspace est.params[3]1education_linspace, 'g')
【python常用回归函数 python 做回归】参考资料:
DataRobot | Ordinary Least Squares in Python
DataRoboe | Multiple Regression using Statsmodels
AnalyticsVidhya | 7 Types of Regression Techniques you should know!
python里面多元非线性回归有哪些方法SciPy 里面的子函数库optimize, 一般情况下可用curve_fit函数直接拟合或者leastsq做最小二乘
python常用回归函数的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于python 做回归、python常用回归函数的信息别忘了在本站进行查找喔 。
推荐阅读
- windows链接阿里服务器地址,本地连接阿里云服务器
- 手机外接电视的屏幕怎么装,手机接电视屏幕怎么解方法
- 鸿蒙系统构造图,鸿蒙操作系统结构
- 用手机可以开通头条直播吗,用手机可以开通头条直播吗抖音
- java代码清空一张表 java清空表数据
- c语言并集指针未到数组尾部,求并集c语言
- 区域销售如何营销,区域性销售公司营销模式启发
- 主播直播二区视频录像,直播主播多少钱一个月
- go语言导入的是目录名 go语言import