当前位置: 首页 > 后端技术 > Python

原理+代码-Python实战多元线性回归模型

时间:2023-03-26 01:46:46 Python

文章来源:EarlyPython作者:Carrot前言“多元线性回归模型”很常见,是大多数人入门机器学习的第一个案例。即便如此,还是有一些Lot要学习和注意的。其中,多重共线性问题会贯穿所有机器学习模型,因此本文将“将原理知识穿插在代码段”,力求从不同的角度来描述和解释“如何更好地构建和优化多元线性回归模型”观点。”。主要分为两部分:详细原理Python实战Python实战Python实战多元线性回归模型的实战案例很多,虽然这里用的是经典的房价预测,但是昂贵的过程简单完整,以及其中使用的精度优化方法是有效的,可以提供很好的参考价值数据探索本文数据集为美国某区域清洗后的房价数据集`importpandasaspdimportnumpyasnpiportseabornassnsimportmatplotlib.pyplotaspltdf=pd.read_csv('house_prices.csv')df.info();df.head()`参数说明:neighborhood/area:邻里和区域bedrooms/bathrooms:卧室和浴室style:housestyleMultiplelinearregressionmodeling现在我们直接建立一个多元线性回归模型`fromstatsmodels.formula.apiimportols#小写的ols函数会有自己的截取项,但是OLS会not#固定格式:因变量~自变量(+符号连接)lm=ols('价格~面积+卧室+卫生间',data=df).fit()lm.summary()`红框是我们关心的结果值,截距项Intercept的P值无意义,可以忽略。模型优化从上图可以看出,模型的准确率较低,因为还有一些分类变量neighborhood和style没有被充分利用。这里我们先看分类变量的类别分布:`#类别变量,也称为名义变量,名义变量nominal_vars=['neighborhood','style']foreachinnominal_vars:print(each,':')print(df[each].agg(['value_counts']).T)#熊猫风骚操作#直接.value_counts().T不能达到下面的效果##必须要有agg,而且里面的方括号[]一定不能少print('='*35)`dummyvariable的设置是因为分类变量不能直接放入模型,需要在这里进行转换,是分类变量转换最常用的方法之一在多元线性回归模型中就是将其转化为虚拟变量。原理其实很简单。将不能直接用于建模的名义变量转化为可放入模型的虚拟变量,其核心就在于八个字:“打散拆散,非此即彼”。下面用一个只有4行的小数据集进行说明。从上表不难发现:名义变量有n个类别,可以拆分出n个虚拟变量,巧妙地用0和1实现“用虚拟变量列替换原名义变量的类别””。下一步是将生成的虚拟变量放入多元线性回归模型中,但需要注意“需要丢弃其中一个转换后的虚拟变量”,得到满秩矩阵。关于线性代数的具体原因和解释请参考作者打包的论文。我们可以这样理解,当名义变量可以分为n类时,只需要n-1个虚拟变量就足以知道所有的信息。丢弃哪一个可以根据实际情况决定。因此,在原始数据集中将虚拟变量添加到名义变量的步骤如下:提取要转换的名义变量(一个或多个),pandas的get_dummies函数以及与原始数据集的水平拼接注即虚拟变量设置成功后,需要与原始数据集拼接,才能将它们一起放入模型中。再次建模后,发现模型的准确率大大提高,但潜在的多重共线性问题也随之显现。在解释模型中虚拟变量的系数之前,我们先排除模型中多重共线性的影响,因为排除共线性后,模型中各个自变量的系数又会发生变化,最终多元线性回归模型的方程又会不一样。多元线性回归模型的主要假设之一是我们的预测变量(自变量)彼此不相关。我们希望预测变量(自变量)与响应变量(因变量)相关,而不是彼此相关。方差膨胀因子(VarianceInflationFactor,以下简称VIF),是指解释变量之间存在多重共线性时的方差与不存在多重共线性时的方差之比。上式可以看出方差膨胀因子。检测时:每个自变量都会有一个扩展因子值,最后根据值的大小选择是否删除“既然表示相关,谁与谁相关?”是自变量中的一个变量,除以它以外的其余自变量进行多元线性回归,回归结果即模型准确率作为该变量与其余自变量的相关性。听起来可能有点乱,这里举个例子(用“面积、卧室数和卫生间数”作为自变量预测房价,在检验自变量的方差膨胀因子时,面积、卧室数和卫生间数卫生间的数量依次分别做因变量,其余两个变量作为自变量,看看三个自变量中哪个对其余两个变量的解释力高)越大,如果已经达到0.9,分母很小,该值等于10,说明这个自变量同时解释了一个或多个其他自变量,存在多重共线性,部分自变量可以考虑删除。越大,共线性越严重。经验判断方法表明:“当时,不存在多重共线性;当时,存在较强的多重共线性;当时,存在严重的多重共线性”。方差膨胀因子的检测我们来写一个方差膨胀因子的检测函数`defvif(df,col_i):"""df:整个数据col_i:待检测的列名"""cols=list(df.columns)cols.remove(col_i)cols_noti=colsformula=col_i+'~'+'+'.join(cols_noti)r2=ols(formula,df).fit().rsquared返回1./(1.-r2)`Nowtest`test_data=results[['area','bedrooms','bathrooms','A','B']]foriintest_data.columns:print(i,'\t',vif(df=test_data,col_i=i))`发现卧室和卫生间之间有很强的相关性。有可能这两个变量解释的是同一个问题,方差膨胀因子较大的自变量通常成对出现。果然,卧室和浴室这两个变量的方差膨胀因子比较高。这里删除自变量卧室,重新建模`lm=ols(formula='price~area+bathrooms+A+B',data=results).fit()lm.summary()`模型的准确率是略有降低,但消除多重共线性后可以提高模型的泛化能力。再次进行多重共线性检测`test_data=results[['area','bedrooms','A','B']]foriintest_data.columns:print(i,'\t',vif(df=test_data,col_i=i))`那么多元共线性“只能通过方差膨胀因子看出?”其实不一定,也可以通过散点图或者相关的稀疏矩阵与模型中自变量的系数结合起来看Clue。下图显示了没有多重共线性的自变量系数。可以明显看出,卫生间的参数很可能是有问题的。怎么可能卫生间的数据量每增加一次,房子的总价就减少1.373*10美元的4次方?简单画个散点图和热力图也应该知道,房子的总价应该和卫生间的数量成正比。模型解释多元线性回归模型的可解释性比较强,可以通过打印模型参数得到因变量和自变量之间的关系。因此,最终建模结果如下,模型精度为0.916。另外,在方程结果中,拦截项Intercept和area、bedrooms等变量的系数很容易理解;A和B这两个虚拟变量可能比较难。其实根据原理部分的表格,如果房子在C区,方程中A和B两个字母的值为0,所以这就引出了一个很重要的点:多元线性回归使用虚拟变量在模型结果中,将模型中存在的虚拟变量与删除的虚拟变量进行比较。所以这个结果意味着,在其他条件相同的情况下(即虚拟变量除外),A区的房子比C区便宜8707.18美元,B区的房子比C区贵449896.73.7美元。当然,我们可以同样画出箱线图查看测试,发现结果显示和模型中A、B的系数一样。总结基于多元线性回归和前提,本文建立了基于因变量房价和多个自变量的实际观测值的多元线性回归模型;分析检验了各预测变量对因变量的综合线性影响的显着性,试图消除多重共线性的影响,筛选出对因变量线性影响显着的自变量,优化基准模型,并评估每个变量的相对重要性,从而提高回归模型的预测精度。