基于Sklearn库中的逐步线性回归

首先介绍一下多元线性回归思想:在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

那么当你遇到一堆的变量却不知如何选出最优的变量以达到模型最优的情况下,这是你该怎么办呢?这时有的同学就会说可以根据增加的变量观察R方的变化程度,再来抉择出最优的模型。这时候如果你觉的这个逻辑好像挺对的话,那么你就需要回去好好回顾一下R方和调整R方的区别了,以下小编就来给大家讲解一下R方与调整R方的区别:

R方:R平方为回归平方和与总离差平方和的比值,表示总离差平方和中可以由回归平方和解释的比例,这一比例越大越好,模型越精确,回归效果越显著。R平方介于0~1之间,越接近1,回归拟合效果越好,一般认为超过0.8的模型拟合优度比较高。然而在这里有的同学就会觉的R方越高,那么模型最优,那么就可以根据变量的引进或进出影响R方的增减进而来判断模型的好坏,这种想法是错的,这里小编给大家举个例子,把P个变量的模型的残差平方和即为SSE(P),当再增加一个新的字变量Xp+1时,相应的残差平方和记为SSE(P+1)。根据最小二乘估计的原理,增加字变量时残差平方和将减少,减少字变量时残差平方和将增加。因此有SSE(P+1)<=SSE(P),它们的负决定系数分别为,由于SST时因变量的离差平方和,与自变量无关,因而有,即当字变量子集在扩大时,残差平方和随之减少,而负决定系数R方随之增大。因此不论什么变量只要多取能提高R方,并且这样将由于变量的多重共线性,给变量的回归系数估计值带来不稳定性,加上变量的测量误差积累,参数数据的增加,将使估计值的误差增大。

 

调整R方:当给模型增加字变量时,复决定系数也随之逐步增大,然而复决定系数的增大代价是残差自由度的减少,因为残差自由度等于样本个数与字变量个数之差。自由度小意味着估计和预测可靠性低。设基于Sklearn库中的逐步线性回归_第1张图片为自由度调整后的复决定系数也称之为调整R方,其中,n为样本容量,p为字变量的个数。在实际问题的回归建模中,自由度调整负决定系数R方越大,所对应的回归方程越好。则所有回归子集中调整R方最大者对应的回归方程就是最优方程。

 

(详细资料来源:https://wenku.baidu.com/view/23fde9f4f90f76c661371a2a.html)

那么根据调整R方的思想,我们找到了Python对应的statsmodels库中的回归模型,接下来废话就不多说了,咱动点真格的把:

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf


data_columns=data.columns.tolist()
#此部分剔除掉不需要的变量
need_remove=['value']
for i in need_remove:
    data_columns.remove(i)

new_scores={}
best_variable=[]

#先一开始设定一个最初的变量,以此来迭代循环
best_property='OverallQual'
best_property_1='a'
   
new_data=pd.DataFrame()
best_score=0.0

while data_columns:
    if best_property_1 != best_property:
        data_columns.remove(best_property)
        best_variable.append(best_property)
        best_property_1=best_property
        new_data=pd.concat([new_data,x_train[best_property]],axis=1)
        for c in data_columns:
            new_data_1=pd.concat([new_data,x_train[c]],axis=1)
            number_property=len(new_data_1.columns.tolist())
            a=np.array(new_data_1).reshape(-1,number_property)
            b=np.array(y_train).reshape(-1,1)
            regr=smf.OLS(b,a).fit()
            scores=regr.rsquared_adj
            if scores>best_score:
                best_score=scores
                best_property=c
        print(best_variable)
        count=len(best_variable)
    else:
        print('此时得分最高的为 %s,且变量只有%s个为%s' % (best_score,count,best_variable))
        print(best_variable)
        break

今天就先操练到这里,希望下次能找到更有趣的东西与大家分享

你可能感兴趣的:(基于Sklearn库中的逐步线性回归)