Stepwise Regression
逐步回歸算法可以用來篩選以及擬合特征,來實現(xiàn)特征的降維姑食,主要是再Y對應(yīng)多個x_i的情況(即一個因變量對應(yīng)多個自變量的情況拆座,也可稱為多元回歸)
- 其實可以理解為:
在線性條件下,哪些變量組合能夠解釋更多的因變量變異您市,則將其保留。
$ Y=W_1 X_1+W_2X_2+......W_iX_i
逐步回歸算法的主要方法
具體操作方法有三種:
- Forward selection: 首先模型中只有一個單獨解釋因變量變異最大的自變量役衡,之后嘗試將加入另一自變量茵休,看加入后整個模型所能解釋的因變量變異是否顯著增加(這里需要進行檢疫,可以用 F-test手蝎, t-test 等等)榕莺;這一過程反復(fù)迭代,直到?jīng)]有自變量再符合加入模型的條件棵介。
- Backward elimination: 與 Forward selection 相反钉鸯,此時,所有變量均放入模型邮辽,之后嘗試將其中一個自變量從模型中剔除唠雕,看整個模型解釋因變量的變異是否有顯著變化,之后將使解釋量減少最少的變量剔除吨述;此過程不斷迭代岩睁,直到?jīng)]有自變量符合剔除的條件。
- Bidirectional elimination: 這種方法相當(dāng)于將前兩種結(jié)合起來锐极◇狭牛可以想象,如果采用第一種方法灵再,每加入一個自變量肋层,可能會使已存在于模型中的變量單獨對因變量的解釋度減小,當(dāng)其的作用很恤崆ā(不顯著)時栋猖,則可將其從模型中剔除。而第三種方法就做了這么一件事汪榔,不是一味的增加變量蒲拉,而是增加一個后,對整個模型中的所有變量進行檢驗痴腌,剔除作用不顯著的變量雌团。最終盡可能得到一個最優(yōu)的變量組合。
主要操作方法如上面所示士聪,那么如何去評價那個變量是真的有價值的呢锦援,這個時候再公式上可以去看一個指標(biāo),那就是觀察R方的變化剥悟,那么到底什么是R方呢灵寺,一句話描述下它的功能就是
來表示回歸直線對觀測值的擬合程度,其主要的公式如下
R^2=SSR/SST=1-SSE/SST
(其中SSR是組間變異,SST是總變異)
進一步的詳細描述下如下:
R^2=1-\frac{\sum{(y-\hat{y})^2}}{\sum{(y-\bar{y})^2}}=cov(y,y_i)^2
看這個式子式用1減去y對回歸方程的方差(未解釋離差)與y的總方差的比值区岗,y減去 \hat{y}也就是殘差略板,是擬合方程中不能解釋的部分,用1減去不能解釋的部分慈缔,那么剩下的就是解釋的部分叮称,也就是說自變量解釋了因變量變動的百分比的多少,那么r方的值肯定是越大越好藐鹤,意味著該模型把y的變動解釋得好颅拦,R方的范圍顯然是0到1,在預(yù)測實踐中教藻,人們往往采納R方最高的模型,其中cov(y,y_i)是協(xié)方差函數(shù).同時跟R_square相似的指標(biāo)距帅,相關(guān)系數(shù)R
R=\frac{\sum_{i=1}^{n}(x-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^{n}(x-\bar{x})^2 \sum_{i=1}^{n}(y_i-\bar{y})^2}}
還有一個定義就是調(diào)整R方(R_adjusted):當(dāng)給模型增加自變量時,復(fù)決定系數(shù)也隨之逐步增大括堤,然而復(fù)決定系數(shù)的增大代價是殘差自由度的減少碌秸,因為殘差自由度等于樣本個數(shù)與字變量個數(shù)之差。自由度小意味著估計和預(yù)測可靠性低
R^{2}_{adjusted}=1-\frac{(1-R^2)(n-1)}{n-p-1}
其中,n為樣本容量悄窃,p為自變量的個數(shù)讥电。在實際問題的回歸建模中,自由度調(diào)整負(fù)決定系數(shù)R方越大轧抗,所對應(yīng)的回歸方程越好恩敌。則所有回歸子集中調(diào)整R方最大者對應(yīng)的回歸方程就是最優(yōu)方程。
Python Achievement
下面是基于statsnidels中的回歸函數(shù)實現(xiàn)的代碼
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=[]
#先一開始設(shè)定一個最初的變量横媚,以此來迭代循環(huán)
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
R code
R中的實現(xiàn)相對比較簡單月趟,主要是step函數(shù),主要是先設(shè)置擬合式子恢口,然后用函數(shù)進行逐步回歸孝宗,最終會返回各個變量的貢獻比以及系數(shù)
lmo3.1<-lm(y~1,data=data3.1)
lm3.1.for<-step(lmo3.1,scope=list(upper=~x1+x2+x3+x4+x5+x6+x7+x8+x9,lower=~1),direction="forward")
summary(lm3.1.for)//direction參數(shù)來設(shè)置是前進法還是后退法,summary函數(shù)來返回各個系數(shù)的值