榮小輝
摘 要:當前機器學習應用漸趨成熟,如何結合算法優勢與醫學研究特點是有效應用的關鍵。統計方法一直在預測精度與可解釋性上做平衡,而醫學問題多數情況下對可解釋性具有較高的要求。Lasso回歸模型通過將某些不相關變量的回歸系數壓縮到零的方法,可以有效的篩選出與研究結果相關的變量。通過縮小變量范圍,增加模型的可解釋性,尤其有利于醫學問題的簡化和醫療工作者的人工應用。本文將簡要介紹Lasso回歸模型的原理,并應用于糖尿病進展的多元變量篩選。在取得相近預測精度的前提下,將自變量由10個簡化到4個,極大的提高了模型的簡潔性與實用度。
關鍵詞:Lasso回歸;變量選擇;數據挖掘;糖尿病
中圖分類號:O212.1 文獻標識碼:A 文章編號:1671-2064(2017)24-0026-04
1 背景
作為多變量回歸問題的經典方法,最小二乘法一直得到廣泛的應用。醫學問題往往都是涉及很多變量的復雜問題。哪個變量與研究結果緊密相關,哪個變量對研究結果其實毫無影響,了解其中含義在研究中具有關鍵的指引作用。最小二乘法可以得到哪些變量具有顯著性的數據,但對那些不具有顯著性的變量,無法判斷是否應該從模型中刪除哪個變量。由于有變量的共線性等問題,直接刪除某些不顯著變量,再建立最小二乘法多元回歸模型會有很大的風險丟失重要變量,而且預測的精度也無法得到保證。
Lasso回歸模型通過將回歸系數壓縮到零,實現了變量的有效選擇[1]。最小二乘法采用最小化RSS的方法,來求得變量回歸系數。而Lasso回歸在最小二乘法RSS的基礎上增加了一個懲罰項,是各回歸系數的絕對值之和乘以參數lambda。通過最小化RSS與懲罰項的和來求得變量回歸系數。當參數lambda為0時,Lasso回歸與最小二乘法沒有區別。當參數lambda逐漸增加,模型開始將回歸系數向0壓縮,當參數lambda足夠大時,所有變量的系數將都被壓縮到0。隨著參數lambda的變化,各變量的回歸系數也會跟著改變。所以選擇一個合適的參數lambda對Lasso回歸模型至關重要,如何選擇參數lambda又要在預測精度與可解釋性上做平衡[2]。在預測精度可接受的范圍內,選擇一個比較大的參數lambda,將會得到一個盡可能精簡的變量與模型。
醫學問題經常是復雜的多變量問題,在某些問題中往往有非常多的變量,這些變量之間的關系多樣,有很大可能存在共線性或其他相互影響關系。在醫學實踐中取得大量樣本數的機會通常會比較少,如果樣本量不能遠遠大于變量數,而且多數變量與結果沒有什么關系的情況下,最小二乘法多元回歸將不能得到較好的預測結果。當樣本量小于變量數時,甚至無法使用最小二乘法建立模型。在大數據時代,醫學問題的變量數急劇增加。例如,新的全基因組掃描等方法可以輕松產生上萬個變量,而醫學研究的樣本很難有快速的增長,這將導致樣本量小于變量數的情況。在這些情況下,Lasso回歸模型可能既提高預測的精度,又通過變量篩選來簡化模型。糖尿病的進展,可能會帶來很多的并發癥,這些并發癥對患者的健康有重大影響。如果準確的預測出患者病情進展,提前采取多種措施,從診斷開始就對患者診療進行干預,可以取得很好的效果。
2 資料與方法
本文采用www4.stat.ncsu.edu下載的糖尿病數據集,有442個樣本,11個變量,其中10個自變量,(AGE年齡BMI 身體質量指數BP收縮壓與舒張壓的均值SEX,1為女,2為男,LTG、TC、LDL、HDL、TCH、GLU是六個血生化指標)一個因變量Y。10個自變量是糖尿病確診時的數據,因變量Y是一年后醫生對患者糖尿病嚴重程度的評分,分數越高病情越嚴重。通過對該數據集建立模型,可以根據糖尿病確診時的數據,預測一年后患者的病情嚴重程度。本文使用R語言既相關的分析包glmnet,在最小二乘法回歸模型十折交叉驗證中使用了分析包dplyr[3]。數據集變量情況描述表1所示。
2.1 Lasso回歸
(1)參數lambda取最佳預測準確時的值,Lasso模型和預測精度。
使用glmnet()函數建立lasso模型,必須用一個x矩陣和一個y向量。Diabetes是該糖尿病數據集在R中的數據框名稱。
如圖1所示,各個變量系數隨參數lambda增大逐漸被壓縮到0(L1 Norm隨參數lambda減小而增大),意味著該變量被模型排除。
x <- model.matrix(Y~.,diabetes)[,-1]
y <- diabetes$Y
library(glmnet)
grid <- 10^seq(10,-2,length=100)
set.seed(1)
train <- sample(1:nrow(x), nrow(x)*9/10)
test <- (-train)
y.test <- y[test]
lasso.mod <-glmnet(x[train,],y[train],alpha=1, lambda=grid)
plot(lasso.mod)
set.seed(123)
cv.out <- cv.glmnet(x[train,],y[train],alpha=1)
plot(cv.out)
bestlam <- cv.out$lambda.min
lasso.pred <- predict(lasso.mod, s=bestlam, newx=x[test,])
a<- lasso.pred
b<- as.vector(a)
mean((b-y.test)^2)endprint
[1] 2311.945
out <- glmnet(x,y,alpha=1,lambda=grid)
lasso.coef <- predict(out, type=”coefficients”, s=bestlam)[1:11,]
lasso.coef
> lasso.coef
(Intercept) AGE SEX2 BMI BP
-270.9677843 0.0000000 -21.0338187 5.6668803 1.0703732
TC LDL HDL TCH LTG
-0.2402796 0.0000000 -0.6251458 3.0270844 47.9925758
GLU
0.2594034
> result_10bestL <- c(2311.945,2516.548,3571.695,3787.387,3269.144,2867.482,2423.028,2873.636,3007.667,3324.951)
> mean(result_10bestL)
[1] 2995.348
> bestlam
[1] 0.3956936
首先根據10折交叉驗證的方法,選出當交叉驗證的均方誤差最小時,參數lambda的取值為0.3956936,并用該參數建立lasso模型如上,AGE和LDL的系數被壓縮到了0。取9成數據訓練,1成數據測試,10次隨機測試的均方誤差的均值是2995.348。如圖2所示,均方誤差隨lambda增大而增大,會有一個lambda最佳取值使得均方誤差最小。
(2)參數lambda取10時的Lasso模型和預測精度。
set.seed(1)
train <- sample(1:nrow(x), nrow(x)*9/10)
test <- (-train)
y.test <- y[test]
lasso.mod <-glmnet(x[train,],y[train],alpha=1, lambda=grid)
plot(lasso.mod)
bestlam <- 10
lasso.pred <- predict(lasso.mod, s=bestlam, newx=x[test,])
a<- lasso.pred
b<- as.vector(a)
mean((b-y.test)^2)
out <- glmnet(x,y,alpha=1,lambda=grid)
lasso.coef <- predict(out,type = "coefficients",s=bestlam)[1:11,]
lasso.coef
> mean((b-y.test)^2)
[1] 2629.674
> lasso.coef
(Intercept) AGE SEX2 BMI BP
-191.8334615 0.0000000 0.0000000 5.1204788 0.4923885
TC LDL HDL TCH LTG
0.0000000 0.0000000 -0.2391955 0.0000000 37.5352114
GLU
0.0000000
>result_10 <-c(2629.674,2176.597,3744.255,3727.083,3555.335,3116.692,2698.318,3167.803,3043.358,3320.284)
> mean(result_10)
[1] 3117.94
取參數lambda的值為10,并用該參數建立lasso模型如上,只有4個變量的系數沒有被壓縮到0。取9成數據訓練,1成數據測試,10次隨機測試的均方誤差的均值是3117.94。
所得的回歸模型是:
Y=-191+5.12BMI+0.49BP-0.24HDL+37.54LTG
該模型比最佳的參數lambda取值時的模型簡單的多了,而且預測的結果也相差不多,在可接受范圍內。
(3)參數lambda取100時的Lasso模型和預測精度。
set.seed(1)
train <- sample(1:nrow(x), nrow(x)*9/10)
test <- (-train)
y.test <- y[test]
lasso.mod <-glmnet(x[train,],y[train],alpha=1, lambda=grid)
plot(lasso.mod)
bestlam <- 100
lasso.pred <- predict(lasso.mod, s=bestlam, newx=x[test,])
a<- lasso.pred
b<- as.vector(a)
mean((b-y.test)^2)
out <- glmnet(x,y,alpha=1,lambda=grid)
lasso.coef <- predict(out,type = "coefficients",s=bestlam)[1:11,]endprint
lasso.coef
> mean((b-y.test)^2)
[1] 4915.202
> lasso.coef
(Intercept) AGE SEX2 BMI BP
152.1335 0.0000 0.0000 0.0000 0.0000
TC LDL HDL TCH LTG
0.0000 0.0000 0.0000 0.0000 0.0000
GLU
0.0000
參數lambda的取值為100時,所有系數都被壓縮到0,這個不是好選擇。
2.2 最小二乘法回歸模型
> diabetes_lm <-lm(Y~.,data=diabetes) # 最小二乘法回歸模型
> summary(diabetes_lm)
Call:
lm(formula = Y ~ ., data = diabetes)
Residuals:
Min 1Q Median 3Q Max
-155.827 -38.536 -0.228 37.806 151.353
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -357.42679 67.05807 -5.330 1.59e-07 ***
AGE -0.03636 0.21704 -0.168 0.867031
SEX2 -22.85965 5.83582 -3.917 0.000104***
BMI 5.60296 0.71711 7.813 4.30e-14***
BP 1.11681 0.22524 4.958 1.02e-06 ***
TC -1.09000 0.57333 -1.901 0.057948 .
LDL 0.74645 0.53083 1.406 0.160390
HDL 0.37200 0.78246 0.475 0.634723
TCH 6.53383 5.95864 1.097 0.273459
LTG 68.48312 15.66972 4.370 1.56e-05***
GLU 0.28012 0.27331 1.025 0.305990
---
Signif. codes: 0 ‘*** 0.001 ‘** 0.01 ‘* 0.05 ‘. 0.1 ‘ 1
Residual standard error: 54.15 on 431 degrees of freedom
Multiple R-squared: 0.5177,Adjusted R-squared: 0.5066
F-statistic: 46.27 on 10 and 431 DF, p-value: < 2.2e-16
最小二乘法回歸模型十折交叉驗證:
library(dplyr)
data<- diabetes
k=10
set.seed(123)
data$id<- sample(1:k, nrow(data), replace=TRUE)
list<- 1:k
prediction<- data.frame()
testsetCopy<- data.frame()
progress.bar<- create_progress_bar("text")
progress.bar$init(k)
for (i in 1:k) {
trainingset<- subset(data, id %in% list[-i])
testset<- subset(data, id %in% c(i))
trainingset <- trainingset[c(-12)] # delete id
testset <- testset[c(-12)] # delete id
mymodel<- lm(Y~.,data= trainingset)
temp1 <- predict(mymodel, newdata = testset)
prediction<- rbind(prediction, as.data.frame (temp1))
testsetCopy<- rbind(testsetCopy, as.data.frame(testset[,11]))
progress.bar$step()
}
Result_lm<- mean((testsetCopy-prediction)^2)
data <- data[c(-12)] # remember to delete id after run model.
Result_lm
> Result_lm
[1] 2979.149
3 結果
3.1 Lasso回歸模型
(1)首先根據10折交叉驗證的方法,選出當交叉驗證的均方誤差最小時,參數lambda的取值為0.3956936,并用該參數建立lasso模型如上,AGE和LDL的系數被壓縮到了0。取9成數據訓練,1成數據測試,10次隨機測試的均方誤差的均值是2995.348。endprint
(2)取參數lambda的值為10,并用該參數建立lasso模型如上,只有4個變量的系數沒有被壓縮到0。取9成數據訓練,1成數據測試,10次隨機測試的均方誤差的均值是3117.94。
所得的回歸模型是:
Y=-191+5.12BMI+0.49BP-0.24HDL+37.54LTG
該模型比最佳的參數lambda取值時的模型簡單的多了,而且預測的結果也相差不多,在可接受范圍內。
(3)參數lambda的取值為100時,所有系數都被壓縮到0,這個不是好選擇。
3.2 最小二乘法回歸模型
(1)10折交叉驗證預測的均方誤差是2979.149;(2)有4個變量有顯著性,BMI、BP、LTG、SEX2,整個模型也有顯著性。
4 討論
(1)取參數lambda值為10的lasso模型,具有較好的預測結果,同時10個變量簡化到了4個變量,這對醫療工作者有很大的意義。因為在醫療過程中,很多變量不容易能都收集到,而且變量多的時候,人腦很難記住這些關系并實際應用。這種方法對模型中有更多變量的情況,作用更大。Y=-191+5.12BMI+0.49BP-0.24HDL+37.54LTG。
(2)lambda值從最佳的0.3956936,10,100的過程中,預測誤差越來越大,回歸系數壓縮成0的變量也越來越多。在lasso模型的應用中,lambda值的選擇是至關重要的。通常可以從交叉驗證的均方誤差最小的lambda值開始,逐漸取較大的lambda值,直到預測誤差不能接受或變量已經篩選到滿意的程度。
(3)最佳lambda值的lasso模型,與最小二乘法回歸模型預測誤差幾乎相同。但lasso模型的優勢在于有兩個變量的系數壓縮到0,模型更簡單。在本文中的數據集預測中,lasso模型沒有顯著的提高預測誤差。但在具有某些特征的數據集中,比如樣本數不是遠遠大于變量數等情況下,lasso模型會有更好的預測表現。
(4)取參數lambda值為10的lasso模型,所得的方程中4個變量中有3個在最小二乘法回歸模型具有顯著性,可見這兩種方法得到的結果有較強的相互支持關系。
(5)變量SEX在最小二乘法回歸模型中具有顯著性,但沒有出現在取參數lambda值為10的lasso模型中。原因可能是變量SEX為類別變量,顯著性的含義只是在這個類別中自己比較時才有,即其他條件相同時,不同變量SEX之間有顯著區別。最小二乘法回歸模型無法把類別變量與其他變量直接比較,lasso模型剔除了變量SEX,表明變量SEX并沒有顯示出比其他變量更大的作用。實際上在另一種機器學習方法—隨機森林模型中,變量SEX在提高數據分類的純潔度上重要性排在最后,沒有重要意義。
參考文獻
[1]詹姆斯(James,G.)等,著.王星等,譯.統計學習導論---基于R應用[M].北京:機械工業出版社,2015.
[2]周志華,著.機器學習[M].北京:清華大學出版社,2016.
[3]麥特洛夫(Matloff,N.)等著.陳堰平,等譯.R語言編程藝術[M].北京:機械工業出版社,2013.
Variable Selection Function of Lasso Regression Model and its Application in Prediction Model of Diabetes Development
Abstract:As machine learning is becoming more and more popular, it is very important to combine the advantage of algorithms and the specificity of medical questions. While statistic is always balance between prediction accuracy and interpretability, medical questions have higher requirement on interpretability in many cases. The Lasso regression model can effectively screen variables related to the results by compressing the regression coefficients of these unrelated variables into zero. By reducing the number of variables and increasing the interpretability, the Lasso regression model is especially helpful for the simplification of medical problems and the artificial application of medical experts. This article briefly introduces the principles of Lasso regression model and applies it to multivariate screening of diabetes progression. Under obtaining the near prediction accuracy conditions, the independent variables are reduced from 10 to 4, which greatly improves the simplicity and practicability of the model.
Key words:Lasso regression;Variable selection;Data mining;Diabetesendprint