多元迴歸分析- subsets and shrinkage

     多元迴歸分析是統計學裡舉足輕重的角色,解釋、個體與趨勢預測都是強而有力的好伙伴,但是,當我們發現變數太多,不知道挑選哪一個,或者變數間相關係數非常的高,該怎麼辦?
      本篇文章將會由Subsets Methods裡的Stepwise regression 開始介紹起,再來說明Shrinkage Methods 裡 lasso and ridge兩種不同的迴歸方法。
--------------------------------------------------------

A. 前言
回歸或許是很強而有力的伙伴,但是相對的,使用條件也相對複雜得多,回歸模型往往伴隨著許多的變異,因此很輕易的將變數丟進去model裡,勢必會有很多的問題產生,例如:

1.  Predict data放了不適當的變數造成了Overfitting導致實際上的testing data預測效果太差。

2. 解釋變數彼此的相關程度很高,型成共線性的問題,反而讓coefficient被大大影響,通常判斷共線性的標準主要為:

I.容忍度(tolerance,小於0.1有共線性問題)
II.變異數膨脹因素(Variance inflation factor, VIF,大於10有共線性問題)
III.條件指標(Condition index, CI,大於30有共線性問題)

為了解決這個方法,subsets 與 shrinkage兩種方法便孕育而生了
兩種方法代表模型如下:

subsets: Stepwise           
shringkage: lasso and ridge
其中lasso 跟Stepwise目前被頻繁用於變數挑選上。

B. 子集回歸(subsets regression)


  • Forward stepwise:
在空的迴歸模型中,逐一加入變數,直到AIC值為最小 
  • Backward stepwise:
在包含所有變數的模型中,逐一刪除變數,直到AIC值為最小 

  • Both
考量以上兩種方法,效率較慢


C. Stepwise regression in R

詳細實作可以看看這篇


D. Shrinkage Method




     近幾年常用的方法則是正規化的技巧(regularization),就是給予懲罰項(Penalization),在回歸模型中不讓模型太複雜化(其實就是避免Overfitting的效果)。
以下是相關原理的運作:
原本的線性規畫
theta= sum((y - y_hat)^2) 

加上L1(也就是Ridge): 
theta_ridge = sum((y - y_hat)^2) + sum(theta^2)


加上L2(也就是LASSO):
theta_lasso = sum((y - y_hat)^2) + sum(abs(theta))


對於兩個cost function來說,模型視覺化就像上圖一樣(Ridge為左,Lasso為右)
由圖觀察就可以發現懲罰項默默的把theta拉向0靠攏!

精華重點便是theta equation與圓形跟方行的交叉點,lasso確實此時卻時把不重要的系數轉變為0了;而Ridge則是有效的降低了不重要的係數值,因此我們會下出的結論便是:

1. Ridge 確實能把不重要的變數降低,但仍舊無法為模型真正篩選變數

2. Lasso則是確確實實篩選出不重要的變數,但仍舊要注意,有統計上的顯著並非代表彼此之間真正有關聯
本篇簡化了Ridge 和 Lasso的原理,想更深入了解原理的朋友,在此我想推薦兩篇我跪下來看的文章:

想看數學推導的朋友可以參考

1. 讀者提問:多元迴歸分析的變數選擇

想看視覺化推導的朋友則可以參考

2. Linear least squares, Lasso,ridge regression有何本質區別?

###以上兩篇清楚明白,我真的是邊哭邊跪著看完的XD###


E. R語言詳細實作

data("PimaIndiansDiabetes2", package = "mlbench")
PimaIndiansDiabetes2 <- na.omit(PimaIndiansDiabetes2)
sample_n(PimaIndiansDiabetes2, 3)
#讀取資料#資料抽三個來看看~

set.seed(123)
training.samples <- PimaIndiansDiabetes2$diabetes %>% 
  createDataPartition(p = 0.8, list = FALSE)
train.data  <- PimaIndiansDiabetes2[training.samples, ]
test.data <- PimaIndiansDiabetes2[-training.samples, ]
#設立training set
  pregnant glucose pressure triceps insulin mass pedigree age diabetes
1        2     102       86      36     120 45.5    0.127  23      pos
2        6     125       68      30     120 30.0    0.464  32      neg
3        3     115       66      39     140 38.1    0.150  28      neg

x <- model.matrix(diabetes~., train.data)[,-1]
# 將Pos設為1
y <- ifelse(train.data$diabetes == "pos", 1, 0)

ridge = glmnet(x , 
               y , 
               alpha = 0, #ridge=0
               family = "binomial") #pos {1,0}

lasso = glmnet(x , 
               y , 
               alpha = 1, #lasso=1
               family = "binomial")
par(mfcol = c(1, 2))
plot(lasso, xvar='lambda', main="Lasso")
plot(ridge, xvar='lambda', main="Ridge")


































由上圖又可以看到Lasso 跟 Ridge最大的不同,Lamda值(懲罰項),適當的Lamda可以讓Lasso的系數值突然歸於0;ridge則是慢慢接近0。


不同的 lambda 會產生不同的收縮效果,所以我們可以利用 Cross Validation 的手法,驗證在不同 lambda 值下模型的表現並找出殘差最小時的lambda值,在此使用cv.glmnet函數進行,以lasso為例
cv.lasso = cv.glmnet(x , 
                     y , 
                     alpha = 1,  # lasso
                     family = "binomial")
best.lambda = cv.lasso$lambda.min
best.lambda

> best.lambda
[1] 0.02011273

# 藍色垂直虛線就是最佳 lambda 的所在位置,
# 跟其他線相交的位置就是該變數收縮後的係數
plot(lasso, xvar='lambda', main="Lasso")
abline(v=log(best.lambda), col="blue", lty=5.5 )

coef(cv.lasso, s = "lambda.min")

>9 x 1 sparse Matrix of class "dgCMatrix"
                      1
(Intercept) -7.57530592
pregnant     0.02027797
glucose      0.03350748
pressure     .         
triceps      0.01349090
insulin      .         
mass         0.02172361
pedigree     0.57491081
age          0.03302719

我們可以了解到這次被挑選出來的有
pregnant、glucise、triceps、mass、pedigree、age等因素

但是要做後續預測,就要再用以上變數再跑一次Logistic regression了,所以,事情還多著......

今天介紹了兩種線性模型挑選變數的方法,不過其實在非線性的狀態下,還可以有很多種篩選方式,像上一篇鐵達尼介紹的random forest或者decesion tree都是可行的方法,端看使用者如何去做衡量了。

下一篇預計會來談談 PCA 維度縮減 與 本次討論的主題 regularization 回歸的差異

嘻嘻


本文參考的資料:

1. R筆記 – (18) Subsets & Shrinkage Regression (Stepwise & Lasso)

2. na.omit.data.table





留言

這個網誌中的熱門文章

Word Vector & Word embedding 初探 - with n-Gram & GLOVE Model

文字探勘之關鍵字萃取 : TF-IDF , text-rank , RAKE