目录:
线性回归筛选变量
逐步回归筛选变量
Python中逐步回归的实现
在回归分析中,影响因变量y的因素很多,而有些自变量的对目标变量y的影响程度不同,为了建立一个相对最优的回归方程,我们需要筛选掉对目标变量y影响不大的变量,这就涉及到了变量选择问题。
一.线性回归筛选变量
一个很容易想到的想法是,通过我们之前讲到的线性回归,来求出每个特征变量的系数,进而观察特征变量与结果变量的关系,这里我们以波士顿房价数据进行实验。
首先先通过sklearn导入boston房价的数据并用线性回归进行拟合:
通过coef_方法得出每个特征向量的系数,如下:
我们可以看到系数为正则正相关,系数越大则正相关程度越高,系数为负则负相关,系数越小则负相关程度越高。通过argsort方法来得到系数的排序结果,默认的排序从小到大排列:
接着通过feature_names方法获得特征的名称,将排序结果作为其索引,得到特征的排序如下:
从排序可以看出,最前面的变量表示负相关最强,最后面的表示正相关,那这样的结果是否具有可解释性呢?
通过数据的DESCR方法来查看数据的特征描述如下:
对照特征向量的描述,对于正相关特征RM,其表示的含义为房子的房间数目,房间数目越多,则房价越高;对于正相关特征CHAS,其表示临河与否,临河表示1,不临河表示;对于负相关特征NOX,其表示房子周边一氧化氮的浓度;负相关特征DIS表示距离雇佣中心的距离。
显然在boston房价中,由线性回归来查看数据特征和结果变量的关系时,得出的结果具有较强的可解释性。
二.逐步回归筛选变量
逐步回归是通过假设检验的方法来筛选强特征,但如果直接用特征变量和结果变量做回归,看系数的正负和大小来判断变量的相关性,其实也是合理的,但是为了考虑变量间的相互作用在回归模型中对结果的影响,通常还是应用逐步回归的方法。
在逐步回归中,提取哪些变量主要基于的假设是:在线性条件下,哪些变量组合能够更显著的影响因变量,则将其保留。
保留的具体操作方法有三种:
1.Forwardselection:从前向后,首先模型中只有一个对因变量影响最显著的自变量,之后尝试将加入另一自变量,观察加入自变量后的整个模型对因变量的影响是否显著增加(这里需要进行检验,如F,t,r方),通过这一过程反复迭代,直到没有自变量再符合加入模型的条件;
2.Backwardelimination:从后向前,此时,所有变量均放入模型,之后尝试将其中一个自变量从模型中剔除,看整个模型对因变量的影响是否有显著变化,之后将使影响减少的最小的变量剔除出队列,此过程不断迭代,直到没有自变量符合剔除的条件。
3.向前向后逐步回归:即前两种的结合,不是一味的增加变量,而是增加一个后,对整个模型的所有变量进行检验,剔除作用不显著的变量,最终得到一个相对最优的变量组合。
三.Python中逐步回归的实现
或许是逐步回归效果不显著的原因,在python的scikit中并未找到其直接实现的库,根据一些Stack博客上的指导,通过py中statsmodels库中OLS最小二乘得出的p-value值进行模型的判断,进而进行特征筛选,最终实现逐步向前向后回归,依旧以boston房价数据集为例进行代码实现。
Stack博客上的指导建议如下:
在对逐步回归进行实现时,当pvalue值小于.1时则表示模型显著性强,大于.5时表示模型显著性差,下面我们开始逐步完成代码:
在实现向前向后逐步回归时,首先需要先从后向前进行迭代回归,那么传入的列表为整个列表,对整个列表进行modelfit,得出其pvalue值,之后选出从pvalue值列表中选出pvalue值最小的,也就是最显著的,将其与.1进行判断,如果小于.1,则将此值纳入到要添加的变量中,并进行输出,实现部分如下:
接下来再从前向后进行迭代递归,从上面传出的included列表中,取出所有的值当作进行model.fit,将其得到的pvalue值取出最大值,与.5进行比较,如果大于.5,则说明不显著,将对应特征记录,并将其移除列表,实现部分如下:
最后将从后向前逐步回归和从前向后逐步回归整理合并,得到向前向后回归模型,最终的效果如下:
经特征名对应,结果仍然具有较强的可解释性
逐步回归代码回复"逐步回归"获取
领取专属 10元无门槛券
私享最新 技术干货