【模型开发】逐步回归
1.定義
??當(dāng)變量中含有對(duì)被解釋變量影響不大的解釋變量時(shí),可能因?yàn)檎`差平方和的自由度減小而使方差的估計(jì)增大,從而影響回歸預(yù)測(cè)的精度,適當(dāng)?shù)倪x擇一個(gè)變量建立一個(gè)最優(yōu)的回歸方程十分重要。
??逐步回歸(Stepwise Regression)的基本思想是將變量逐個(gè)引入模型,每引入一個(gè)解釋變量后都要進(jìn)行F檢驗(yàn),并對(duì)已經(jīng)選入的解釋變量逐個(gè)進(jìn)行t檢驗(yàn),當(dāng)原來(lái)引入的解釋變量由于后面解釋變量的引入變得不再顯著時(shí),則將其刪除。以確保每次引入新的變量之前回歸方程中只包含顯著性變量。這是一個(gè)反復(fù)的過(guò)程,直到既沒(méi)有顯著的解釋變量選入回歸方程,也沒(méi)有不顯著的解釋變量從回歸方程中剔除為止。以保證最后所得到的解釋變量集是最優(yōu)的。
??依據(jù)上述思想,可利用逐步回歸篩選并剔除引起多重共線性的變量,其具體步驟如下:先用被解釋變量對(duì)每一個(gè)所考慮的解釋變量做簡(jiǎn)單回歸,然后以對(duì)被解釋變量貢獻(xiàn)最大的解釋變量所對(duì)應(yīng)的回歸方程為基礎(chǔ),再逐步引入其余解釋變量。經(jīng)過(guò)逐步回歸,使得最后保留在模型中的解釋變量既是重要的,又沒(méi)有嚴(yán)重多重共線性。
2.分類
??在逐步回歸中,提取哪些變量主要基于的假設(shè)是:在線性條件下,哪些變量組合能夠解釋更多的因變量變異,則將其保留。逐步回歸法選擇變量的過(guò)程包含兩個(gè)基本步驟:一是從回歸模型中剔出經(jīng)檢驗(yàn)不顯著的變量,二是引入新變量到回歸模型中,常用的逐步型選元法有前向法、后向法、雙向法。
Forward selection(前向逐步回歸):
??向前法的思想是變量由少到多,屬于貪心算法,每次增加一個(gè),直至沒(méi)有可引入的變量為止。具體步驟如下。
-
步驟1:
?
對(duì) p 個(gè)回歸自變量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
?
計(jì)算變量XiX_{i}Xi?,相應(yīng)的回歸系數(shù)的 F 檢驗(yàn)統(tǒng)計(jì)量的值,記為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)?}
?
對(duì)給定的顯著性水平α\alphaα,記相應(yīng)的臨界值為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?為選入變量指標(biāo)集合。 -
步驟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個(gè)。計(jì)算變量的回歸系數(shù) F 檢驗(yàn)的統(tǒng)計(jì)量值,記為Fk(2)(k?I1)F_{k}^{(2)}(k\notin I_{1})Fk(2)?(k∈/?I1?),選其中最大者,記為 Fi2(2)F_{i_{2}}^{(2)}Fi2?(2)?,對(duì)應(yīng)自變量腳標(biāo)記為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)?}
?
對(duì)給定的顯著性水平α\alphaα,記相應(yīng)的臨界值為F(2)F^{(2)}F(2),Fi2(1)>F(2)F_{i_{2}}^{(1)}>F^{(2)}Fi2?(1)?>F(2),則變量Xi2X_{i_{2}}Xi2??引入回歸模型。否則,終止變量引入過(guò)程。 -
步驟3:
?
考慮因變量對(duì)變量子集{Xi1,Xi2,Xk}\left \{ X_{i_{1}},X_{i_{2}},X_{k}\right \}{Xi1??,Xi2??,Xk?}的回歸重復(fù)步驟2。
?
依此方法重復(fù)進(jìn)行,每次從未引入回歸模型的自變量中選取一個(gè),知道經(jīng)檢驗(yàn)沒(méi)有變量引入為止。
Backward elimination(后向逐步回歸)
??與 Forward selection 相反,此時(shí),所有變量均放入模型,之后嘗試將其中一個(gè)自變量從模型中剔除,看整個(gè)模型解釋因變量的變異是否有顯著變化,之后將對(duì)殘差平方和貢獻(xiàn)較小的變量剔除;此過(guò)程不斷迭代,直到?jīng)]有自變量符合剔除的條件。
Bidirectional elimination(雙向逐步回歸)
?? 這種方法相當(dāng)于將前兩種結(jié)合起來(lái)??梢韵胂?#xff0c;如果采用第一種方法,每加入一個(gè)自變量,可能會(huì)使已存在于模型中的變量單獨(dú)對(duì)因變量的解釋度減小,當(dāng)其的作用很小(不顯著)時(shí),則可將其從模型中剔除。而第三種方法不是一味的增加變量,而是增加一個(gè)后,對(duì)整個(gè)模型中的所有變量進(jìn)行檢驗(yàn),剔除作用不顯著的變量。最終盡可能得到一個(gè)最優(yōu)的變量組合。
?? 可以想象,這樣得到的變量組合,基于當(dāng)前數(shù)據(jù),應(yīng)該是可以最大程度的解釋因變量的變異,但其反面的作用就是會(huì)使模型有偏,即所謂的 overfitting 問(wèn)題;另外,鑒于算法是基于變量解釋度來(lái)進(jìn)行特征提取的,當(dāng)兩個(gè)變量對(duì)因變量的影響相近時(shí),則不免受到較大的噪聲影響,使特征提取結(jié)果不穩(wěn)定。
3.實(shí)施過(guò)程
??逐步回歸分析的實(shí)施過(guò)程是每一步都要對(duì)已引入回歸方程的變量計(jì)算其偏回歸平方和(即貢獻(xiàn)),然后選一個(gè)偏回歸平方和最小的變量,在預(yù)先給定的水平下進(jìn)行顯著性檢驗(yàn),若顯著則該變量不必從回歸方程中剔除,這時(shí)方程中其他幾個(gè)變量也都不需要剔除(因?yàn)槠渌麕讉€(gè)變量的偏回歸平方和都大于最小的一個(gè)更不需要剔除)。相反,如果不顯著,則該變量需要剔除,然后按偏回歸平方和由小到大地依次對(duì)方程中其他變量進(jìn)行檢驗(yàn)。將對(duì)影響不顯著的變量全部剔除,保留的都是顯著的。接著再對(duì)未引入回歸方程中的變量分別計(jì)算其偏回歸平方和,并選其中偏回歸方程和最大的一個(gè)變量,同樣在給定水平下作顯著性檢驗(yàn),如果顯著則將該變量引入回歸方程,這一過(guò)程一直持續(xù)下去,直到在回歸方程中的變量都不能剔除而又無(wú)新變量可以引入時(shí)為止,這時(shí)逐步回歸過(guò)程結(jié)束。
4.案例
R語(yǔ)言下的評(píng)分違約預(yù)測(cè)模型
setwd('C:\\Users\\zhengyang\\Desktop\\違約預(yù)測(cè)')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:數(shù)據(jù)基本分析 ################ ########################################################################################################### ################ step2:將數(shù)據(jù)拆分成2份 ################ ####################################################################################################################### ################ step3:給train數(shù)據(jù)集做profiling ################ ############################################################################################################################### ################ step4:給train數(shù)據(jù)集做各分位值 ################ ################################################################################################################################ ################ step5:對(duì)train數(shù)據(jù)集做單變量分析 ################ ######################################################################################################################################### ################ step6:根據(jù)前3步對(duì)train數(shù)據(jù)集做recoding ################ ########################################################################################################################## ################ step6:相關(guān)性分析 ################ ######################################################################################################## ################ 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 #導(dǎo)出模型 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優(yōu)化 ###################### #############################################################【模型2】####### library(MASS) model_sel = stepAIC(model1_glm,direction = 'both') summary_stepwise = summary(model_sel);summary_stepwise#導(dǎo)出模型 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)#通過(guò)stepwise剔除了6個(gè)變量,接下來(lái)對(duì)剩下的17個(gè)變量再次計(jì)算相關(guān)系數(shù),以及膨脹系數(shù)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個(gè)變量的vif值都超過(guò)2 #接下來(lái)再看一下這17個(gè)變量之間的相關(guān)系數(shù) 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)#找出相關(guān)系數(shù)大于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 學(xué)習(xí)筆記 SealHuang http://sealhuang.github.io/stepwise-regression
??對(duì)數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、數(shù)據(jù)科學(xué)、金融風(fēng)控等感興趣的小伙伴,需要數(shù)據(jù)集、代碼、行業(yè)報(bào)告等各類學(xué)習(xí)資料,可添加微信:wu805686220(記得要備注喔!),也可關(guān)注微信公眾號(hào):風(fēng)控圏子(別打錯(cuò)字,是圏子,不是圈子,算了直接復(fù)制吧!)
關(guān)注公眾號(hào)后,可聯(lián)系圈子助手加入如下社群:
- 機(jī)器學(xué)習(xí)風(fēng)控討論群(微信群)
- 反欺詐討論群(微信群)
- python學(xué)習(xí)交流群(微信群)
- 研習(xí)社資料(qq群:102755159)(干貨、資料、項(xiàng)目、代碼、報(bào)告、課件)
相互學(xué)習(xí),共同成長(zhǎng)。
總結(jié)
以上是生活随笔為你收集整理的【模型开发】逐步回归的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【特征工程】(未完成)编码
- 下一篇: 【模型开发】(未完成)联合建模