多元迴歸分析- subsets and shrinkage
多元迴歸分析是統計學裡舉足輕重的角色,解釋、個體與趨勢預測都是強而有力的好伙伴,但是,當我們發現變數太多,不知道挑選哪一個,或者變數間相關係數非常的高,該怎麼辦?
由上圖又可以看到Lasso 跟 Ridge最大的不同,Lamda值(懲罰項),適當的Lamda可以讓Lasso的系數值突然歸於0;ridge則是慢慢接近0。
不同的 lambda 會產生不同的收縮效果,所以我們可以利用 Cross Validation 的手法,驗證在不同 lambda 值下模型的表現並找出殘差最小時的lambda值,在此使用cv.glmnet函數進行,以lasso為例
1. R筆記 – (18) Subsets & Shrinkage Regression (Stepwise & Lasso)
2. na.omit.data.table
本篇文章將會由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
考量以上兩種方法,效率較慢
近幾年常用的方法則是正規化的技巧(regularization),就是給予懲罰項(Penalization),在回歸模型中不讓模型太複雜化(其實就是避免Overfitting的效果)。
以下是相關原理的運作:
原本的線性規畫
theta= sum((y - y_hat)^2)
精華重點便是theta equation與圓形跟方行的交叉點,lasso確實此時卻時把不重要的系數轉變為0了;而Ridge則是有效的降低了不重要的係數值,因此我們會下出的結論便是:
以下是相關原理的運作:
原本的線性規畫
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_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靠攏!
1. Ridge 確實能把不重要的變數降低,但仍舊無法為模型真正篩選變數
2. Lasso則是確確實實篩選出不重要的變數,但仍舊要注意,有統計上的顯著並非代表彼此之間真正有關聯
本篇簡化了Ridge 和 Lasso的原理,想更深入了解原理的朋友,在此我想推薦兩篇我跪下來看的文章:
想看數學推導的朋友可以參考
1. 讀者提問:多元迴歸分析的變數選擇
想看視覺化推導的朋友則可以參考
2. Linear least squares, Lasso,ridge regression有何本質區別?
###以上兩篇清楚明白,我真的是邊哭邊跪著看完的XD###
E. R語言詳細實作
想看數學推導的朋友可以參考
1. 讀者提問:多元迴歸分析的變數選擇
想看視覺化推導的朋友則可以參考
2. Linear least squares, Lasso,ridge regression有何本質區別?
###以上兩篇清楚明白,
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
留言
張貼留言