【模型开发】逐步回归
1.定義
??當變量中含有對被解釋變量影響不大的解釋變量時,可能因為誤差平方和的自由度減小而使方差的估計增大,從而影響回歸預測的精度,適當的選擇一個變量建立一個最優的回歸方程十分重要。
??逐步回歸(Stepwise Regression)的基本思想是將變量逐個引入模型,每引入一個解釋變量后都要進行F檢驗,并對已經選入的解釋變量逐個進行t檢驗,當原來引入的解釋變量由于后面解釋變量的引入變得不再顯著時,則將其刪除。以確保每次引入新的變量之前回歸方程中只包含顯著性變量。這是一個反復的過程,直到既沒有顯著的解釋變量選入回歸方程,也沒有不顯著的解釋變量從回歸方程中剔除為止。以保證最后所得到的解釋變量集是最優的。
??依據上述思想,可利用逐步回歸篩選并剔除引起多重共線性的變量,其具體步驟如下:先用被解釋變量對每一個所考慮的解釋變量做簡單回歸,然后以對被解釋變量貢獻最大的解釋變量所對應的回歸方程為基礎,再逐步引入其余解釋變量。經過逐步回歸,使得最后保留在模型中的解釋變量既是重要的,又沒有嚴重多重共線性。
2.分類
??在逐步回歸中,提取哪些變量主要基于的假設是:在線性條件下,哪些變量組合能夠解釋更多的因變量變異,則將其保留。逐步回歸法選擇變量的過程包含兩個基本步驟:一是從回歸模型中剔出經檢驗不顯著的變量,二是引入新變量到回歸模型中,常用的逐步型選元法有前向法、后向法、雙向法。
Forward selection(前向逐步回歸):
??向前法的思想是變量由少到多,屬于貪心算法,每次增加一個,直至沒有可引入的變量為止。具體步驟如下。
-
步驟1:
?
對 p 個回歸自變量x1,x2,...,xp,x_{1},x_{2},...,x_{p},x1?,x2?,...,xp?, 分別同因變量YYY建立一元回歸模型
?
??????????????????Y=β0+βiXi+?,i=1,...pY = \beta _{0}+\beta _{i}X_{i}+\epsilon ,i = 1,...pY=β0?+βi?Xi?+?,i=1,...p
?
計算變量XiX_{i}Xi?,相應的回歸系數的 F 檢驗統計量的值,記為F1(1),...,Fp(1)F_{1}^{(1)},...,F_{p}^{(1)}F1(1)?,...,Fp(1)?,取其中的最大值Fi1(1)F_{i_{1}}^{(1)}Fi1?(1)?,即
?
??????????????????Fi1(1)=max{F1(1),...,Fp(1)}F_{i_{1}}^{(1)} = max\left \{ \right.F_{1}^{(1)},...,F_{p}^{(1)}\left. \right \}Fi1?(1)?=max{F1(1)?,...,Fp(1)?}
?
對給定的顯著性水平α\alphaα,記相應的臨界值為F(1)F^{(1)}F(1),Fi1(1)>F(1)F_{i_{1}}^{(1)}>F^{(1)}Fi1?(1)?>F(1),則將Xi1X_{i_{1}}Xi1??引入回歸模型,記I1I_{1}I1?為選入變量指標集合。 -
步驟2:
?
建立因變量 Y 與自變量子集{Xi1,X1},...,{Xi1,Xi1?1},{Xi1,Xi1=1},...,{Xi1,Xp}\left \{X_{i_{1}},X_{1} \right.\left. \right \},...,\left \{X_{i_{1}},X_{i_{1}-1} \right.\left. \right \},\left \{X_{i_{1}},X_{i_{1}=1} \right.\left. \right \},...,\left \{X_{i_{1}},X_{p} \right.\left. \right \}{Xi1??,X1?},...,{Xi1??,Xi1??1?},{Xi1??,Xi1?=1?},...,{Xi1??,Xp?}的二元回歸模型(即此回歸模型的回歸元為二元的),共有p?1p-1p?1個。計算變量的回歸系數 F 檢驗的統計量值,記為Fk(2)(k?I1)F_{k}^{(2)}(k\notin I_{1})Fk(2)?(k∈/?I1?),選其中最大者,記為 Fi2(2)F_{i_{2}}^{(2)}Fi2?(2)?,對應自變量腳標記為i2i_{2}i2?,即:
??????????????????Fi2(2)={Fi(2),...,Fi1?1(2),Fi1+1(2),...,Fp(2)}F_{i_{2}}^{(2)} = \left \{ F_{i}^{(2)},...,F_{i_{1}-1}^{(2)},F_{i_{1}+1}^{(2)},...,F_{p}^{(2)} \right \}Fi2?(2)?={Fi(2)?,...,Fi1??1(2)?,Fi1?+1(2)?,...,Fp(2)?}
?
對給定的顯著性水平α\alphaα,記相應的臨界值為F(2)F^{(2)}F(2),Fi2(1)>F(2)F_{i_{2}}^{(1)}>F^{(2)}Fi2?(1)?>F(2),則變量Xi2X_{i_{2}}Xi2??引入回歸模型。否則,終止變量引入過程。 -
步驟3:
?
考慮因變量對變量子集{Xi1,Xi2,Xk}\left \{ X_{i_{1}},X_{i_{2}},X_{k}\right \}{Xi1??,Xi2??,Xk?}的回歸重復步驟2。
?
依此方法重復進行,每次從未引入回歸模型的自變量中選取一個,知道經檢驗沒有變量引入為止。
Backward elimination(后向逐步回歸)
??與 Forward selection 相反,此時,所有變量均放入模型,之后嘗試將其中一個自變量從模型中剔除,看整個模型解釋因變量的變異是否有顯著變化,之后將對殘差平方和貢獻較小的變量剔除;此過程不斷迭代,直到沒有自變量符合剔除的條件。
Bidirectional elimination(雙向逐步回歸)
?? 這種方法相當于將前兩種結合起來。可以想象,如果采用第一種方法,每加入一個自變量,可能會使已存在于模型中的變量單獨對因變量的解釋度減小,當其的作用很小(不顯著)時,則可將其從模型中剔除。而第三種方法不是一味的增加變量,而是增加一個后,對整個模型中的所有變量進行檢驗,剔除作用不顯著的變量。最終盡可能得到一個最優的變量組合。
?? 可以想象,這樣得到的變量組合,基于當前數據,應該是可以最大程度的解釋因變量的變異,但其反面的作用就是會使模型有偏,即所謂的 overfitting 問題;另外,鑒于算法是基于變量解釋度來進行特征提取的,當兩個變量對因變量的影響相近時,則不免受到較大的噪聲影響,使特征提取結果不穩定。
3.實施過程
??逐步回歸分析的實施過程是每一步都要對已引入回歸方程的變量計算其偏回歸平方和(即貢獻),然后選一個偏回歸平方和最小的變量,在預先給定的水平下進行顯著性檢驗,若顯著則該變量不必從回歸方程中剔除,這時方程中其他幾個變量也都不需要剔除(因為其他幾個變量的偏回歸平方和都大于最小的一個更不需要剔除)。相反,如果不顯著,則該變量需要剔除,然后按偏回歸平方和由小到大地依次對方程中其他變量進行檢驗。將對影響不顯著的變量全部剔除,保留的都是顯著的。接著再對未引入回歸方程中的變量分別計算其偏回歸平方和,并選其中偏回歸方程和最大的一個變量,同樣在給定水平下作顯著性檢驗,如果顯著則將該變量引入回歸方程,這一過程一直持續下去,直到在回歸方程中的變量都不能剔除而又無新變量可以引入時為止,這時逐步回歸過程結束。
4.案例
R語言下的評分違約預測模型
setwd('C:\\Users\\zhengyang\\Desktop\\違約預測')getwd() list.files()raw = read.csv('default of credit card clients.csv',row.names = 1,skip = 1) View(head(raw)) table(raw$default.payment.next.month)#################################################### ################ step1:數據基本分析 ################ ########################################################################################################### ################ step2:將數據拆分成2份 ################ ####################################################################################################################### ################ step3:給train數據集做profiling ################ ############################################################################################################################### ################ step4:給train數據集做各分位值 ################ ################################################################################################################################ ################ step5:對train數據集做單變量分析 ################ ######################################################################################################################################### ################ step6:根據前3步對train數據集做recoding ################ ########################################################################################################################## ################ step6:相關性分析 ################ ######################################################################################################## ################ step7:建模--邏輯回歸 ################ ###################################################### head(train_model) #######【模型1】####### model1_glm = glm(default.payment.next.month~.,data = train_model,family = binomial(link = 'logit'))summary_model1_glm = summary(model1_glm);summary_model1_glm #導出模型 model1_glm_df = data.frame(var = row.names(summary_model1_glm$coefficients),summary_model1_glm$coefficients)View(model1_glm_df)write.csv(model1_glm_df,'model1_glm.csv',row.names = F)###################################################### ################ step8:stepwise優化 ###################### #############################################################【模型2】####### library(MASS) model_sel = stepAIC(model1_glm,direction = 'both') summary_stepwise = summary(model_sel);summary_stepwise#導出模型 model2_stepwise_df = data.frame(var = row.names(summary_stepwise$coefficients),summary_stepwise$coefficients)View(model2_stepwise_df) write.csv(model2_stepwise_df,'model2_stepwise.csv',row.names = F)#通過stepwise剔除了6個變量,接下來對剩下的17個變量再次計算相關系數,以及膨脹系數VIF值 model_vif1 = c('rec_LIMIT_BAL','rec_SEX','rec_MARRIAGE','rec_AGE','rec_PAY_0','rec_PAY_2','rec_PAY_3','rec_PAY_4','rec_PAY_5','rec_PAY_6','rec_BILL_AMT2','rec_BILL_AMT4','rec_PAY_AMT1','rec_PAY_AMT2','rec_PAY_AMT3','rec_PAY_AMT4','rec_PAY_AMT6')train_vif1 = train_model[,c("default.payment.next.month",model_vif1)] str(train_vif1)fit1 = lm(default.payment.next.month~.,data = train_vif1) summary(fit1)library(car) vif1 = data.frame(vif(fit1)) var_vif1 = data.frame(var = row.names(vif1),vif1) View(var_vif1)write.csv(var_vif1,'var_vif_Tried2.csv',row.names = F) #有7個變量的vif值都超過2 #接下來再看一下這17個變量之間的相關系數 cor_Tried2 = data.frame(cor.table(train_vif1,cor.method = 'pearson')) correlation_Tried2 = data.frame(var = row.names(cor_Tried2),cor_Tried2[,1:ncol(train_vif1)])View(correlation_Tried2) write.csv(correlation_Tried2,'correlation_Tried2.csv',row.names = F)#找出相關系數大于0.5的位置 car_df2 = data.frame() for (i in 3:ncol(correlation_Tried2)) {#print(i)car_index = which(abs(correlation_Tried2[,i])<1 & abs(correlation_Tried2[,i])>0.5)car_index_df = data.frame(car_names = rep(names(correlation_Tried2)[i],times = length(car_index)),index = car_index)car_df2 = rbind(car_df2,car_index_df) }View(car_df2)【參考】
-
百度百科 https://baike.baidu.com/item/逐步回歸/585832?fr=aladdin
-
Stepwise regression 學習筆記 SealHuang http://sealhuang.github.io/stepwise-regression
??對數據分析、機器學習、數據科學、金融風控等感興趣的小伙伴,需要數據集、代碼、行業報告等各類學習資料,可添加微信:wu805686220(記得要備注喔!),也可關注微信公眾號:風控圏子(別打錯字,是圏子,不是圈子,算了直接復制吧!)
關注公眾號后,可聯系圈子助手加入如下社群:
- 機器學習風控討論群(微信群)
- 反欺詐討論群(微信群)
- python學習交流群(微信群)
- 研習社資料(qq群:102755159)(干貨、資料、項目、代碼、報告、課件)
相互學習,共同成長。
總結
以上是生活随笔為你收集整理的【模型开发】逐步回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【特征工程】(未完成)编码
- 下一篇: 【模型开发】(未完成)联合建模