GLM妙能:用glmnet預(yù)測(cè)糖尿病的Lasso之道
Lasso(Least Absolute Shrinkage and Selection Operator)算法是一種用于特征選擇和模型正則化的線性回歸方法。它通過在損失函數(shù)中引入L1正則化項(xiàng),迫使模型系數(shù)稀疏化,將一些系數(shù)壓縮為零,從而實(shí)現(xiàn)特征選擇的效果。 想要深入了解Lasso算法原理,需要我們一步一步尋找Lasso算法的來源,如下是小云的學(xué)習(xí)思考總結(jié):
1.?線性回歸模型:
我們先回顧一下簡單的線性回歸模型:y = β0 + β1x1 + β2x2 + ... + βnxn,其中y是因變量,x1, x2, ..., xn是自變量,β0, β1, β2, ..., βn是模型的系數(shù)。
2.?最小二乘法:
在普通的線性回歸中,我們使用最小二乘法來估計(jì)模型的系數(shù),即通過最小化實(shí)際觀測(cè)值和模型預(yù)測(cè)值之間的殘差平方和來求解系數(shù)。這種方法沒有對(duì)系數(shù)進(jìn)行任何約束。
3.?引入L1正則化項(xiàng):
在Lasso算法中,我們引入L1正則化項(xiàng)作為約束條件,以促使模型系數(shù)稀疏化。L1正則化項(xiàng)是模型系數(shù)的絕對(duì)值之和與一個(gè)調(diào)節(jié)參數(shù)λ的乘積,可以寫為:λ * (|β1| + |β2| + ... + |βn|)。
4.?Lasso的優(yōu)化目標(biāo):
Lasso的目標(biāo)是將最小化的損失函數(shù)與L1正則化項(xiàng)相結(jié)合,形成優(yōu)化目標(biāo)函數(shù):minimize(平方損失函數(shù) + λ * (|β1| + |β2| + ... + |βn|))。
5.?最小化目標(biāo)函數(shù):
我們使用優(yōu)化算法來最小化目標(biāo)函數(shù),一種常用的方法是坐標(biāo)下降法(coordinate descent)。在坐標(biāo)下降法中,我們逐個(gè)更新模型系數(shù),通過迭代優(yōu)化來逐步逼近最優(yōu)解。
6.?坐標(biāo)下降法的迭代過程:
①初始化模型系數(shù)β為零或一個(gè)較小的值。 ②針對(duì)每個(gè)系數(shù)βi,固定其他系數(shù)不變,通過求解最小化目標(biāo)函數(shù)的一維子問題來更新βi。 ③重復(fù)上述步驟,直到滿足收斂條件。
7.?子問題的求解:
在每個(gè)子問題中,通過求解最小化目標(biāo)函數(shù)關(guān)于βi的一階導(dǎo)數(shù)為零的方程來更新βi。這個(gè)方程可以寫為:2 * (Σ(xi * (yi - (β0 + β1x1 + β2x2 + ... + βnxn)))) + λ * sign(βi) = 0,其中sign(βi)是βi的符號(hào)函數(shù)。
8.?Lasso算法的特點(diǎn):
Lasso算法的特點(diǎn)在于它引入了L1正則化項(xiàng),促使模型系數(shù)稀疏化,實(shí)現(xiàn)特征選擇的效果。Lasso可以通過調(diào)節(jié)正則化參數(shù)λ來控制稀疏性程度,較大的λ會(huì)導(dǎo)致更多的系數(shù)被壓縮為零。 總結(jié)一下,Lasso算法通過在損失函數(shù)中引入L1正則化項(xiàng),迫使模型系數(shù)稀疏化,實(shí)現(xiàn)特征選擇和模型正則化的效果。它使用坐標(biāo)下降法迭代優(yōu)化,通過解決子問題來更新模型系數(shù)。Lasso算法在機(jī)器學(xué)習(xí)中被廣泛應(yīng)用,特別適用于高維數(shù)據(jù)和特征選擇的場(chǎng)景,尤其是在選擇特征基因用于疾病診斷時(shí)。 R包glmnet,提供了高效的Lasso和Elastic-Net正則化方法,用于擬合廣義線性模型。它支持線性回歸、邏輯回歸、多項(xiàng)式回歸、泊松回歸、Cox模型等多種模型。glmnet的算法基于循環(huán)坐標(biāo)下降,可以快速計(jì)算整個(gè)正則化路徑。此外,glmnet還支持自定義的GLM family對(duì)象和relax選項(xiàng)。通過glmnet,可以進(jìn)行特征選擇、模型正則化和預(yù)測(cè)等任務(wù)。?? 以下是一個(gè)簡單的示例,展示如何使用R包glmnet進(jìn)行糖尿病預(yù)測(cè)模型的訓(xùn)練和評(píng)估: 代碼具體包括:
Step1 導(dǎo)入數(shù)據(jù)集以及數(shù)據(jù)預(yù)處理
# 這里的"inputdata.txt"是自行準(zhǔn)備的本地文件,小云給大家附在最后。 # 1.導(dǎo)入數(shù)據(jù)集以及數(shù)據(jù)預(yù)處理 # 安裝和加載所需的庫 # install.packages("glmnet") library(glmnet) # 導(dǎo)入數(shù)據(jù)集 data <- read.table(file = "D:/wanglab/life/ziyuan/20230628/inputdata.txt",header = T)?# 替換為實(shí)際數(shù)據(jù)集文件的路徑 data[, 1:8] <- scale(data[, 1:8])# 數(shù)據(jù)標(biāo)準(zhǔn)化 data$diabetes <- as.factor(data$diabetes)# 將目標(biāo)變量轉(zhuǎn)換為因子 # 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測(cè)試集 set.seed(123)?# 設(shè)置隨機(jī)種子,保證結(jié)果可復(fù)現(xiàn) indices <- sample(1:nrow(data), nrow(data)*0.8)?# 80%的數(shù)據(jù)用于訓(xùn)練,20%的數(shù)據(jù)用于測(cè)試 train_data <- data[indices, ] test_data <- data[-indices, ] Xtrain<-as.matrix(trainingset[,1:8]) Ytrain<-as.matrix(trainingset[,9]) Xtest<-as.matrix(testingset[,1:8]) Ytest<-as.matrix(testingset[,9]) ?
Step2創(chuàng)建lasso回歸模型
# 2.創(chuàng)建深度學(xué)習(xí)模型 # 2.創(chuàng)建lasso回歸模型 lsofit<-glmnet(Xtrain,Ytrain,family="binomial",alpha=0.1) print(lsofit)##lasso回歸系數(shù) coef.apprx<-coef(lsofit, s=0.017) coef.apprx plot(lsofit,xvar="lambda",label=TRUE)# 畫Lasso篩選變量動(dòng)態(tài)過程圖
Lasso篩選變量動(dòng)態(tài)過程圖
Step3 K折交叉驗(yàn)證
# 3.K折交叉驗(yàn)證 set.seed(2022) #設(shè)置隨機(jī)種子,保證K折驗(yàn)證的可重復(fù)性 lsocv<-cv.glmnet(Xtrain,Ytrain,family="binomial",nfolds=10) lsocv ##print(lsocv) lsocv$lambda.min lsocv$lambda.1se plot(lsocv) #繪制交叉驗(yàn)證曲線
交叉驗(yàn)證曲線圖
coef(lsocv,s="lambda.min") #獲取使模型偏差最小時(shí)λ值的模型系數(shù) coef(lsocv,s="lambda.1se") #獲取使模型偏差最小時(shí)λ值+一個(gè)標(biāo)準(zhǔn)誤時(shí)的模型系數(shù) cbind2(coef(lsocv,s="lambda.min"),coef(lsocv,s="lambda.1se")) #合并顯示 select_x <- names(which(coef(lsocv,s="lambda.1se")[-1,] != 0)) select_x得到對(duì)預(yù)測(cè)結(jié)果有影響的因素 ?
Step?4.繪制AUC曲線評(píng)估模型
# 4.繪制AUC曲線評(píng)估模型 predictions <- lsocv %>% predict(as.matrix(test_data[, 1:8]))# 預(yù)測(cè)概率 # 計(jì)算AUC library(pROC) roc_obj <- roc(test_data$diabetes, predictions) auc_value <- auc(roc_obj) # 繪制AUC曲線 plot(roc_obj, main = "ROC Curve") text(0.5, 0.3, paste0("AUC = ", round(auc_value, 3)), col = "red", cex = 1.2)
AUC曲線圖
Step5.繪制列線(Nomogram)圖
# 5.繪制列線(Nomogram)圖 library(rms);library(Hmisc);library(lattice);library(survival);library(Formula);library(ggplot2);library(SparseM) NM<-datadist(trainingset) options(datadist='NM') lgrfit<-lrm(diabetes~pregnant+glucose+mass+pedigree+age,data=trainingset,x=T,y=T) Nomg<-nomogram(lgrfit,fun=plogis,fun.at=c(.001,.01,.05,0.1,seq(.2,.8,by=.2),0.9,.95,.99,.999),lp=F,funlabel="malignant Rate") plot(Nomg)
列線圖(Nomogram)圖
# 6.繪制多因素Cox回歸森林圖
# 6.繪制多因素Cox回歸森林圖 library(survival) library(survminer) library(tidyverse) library(eoffice) library(forestplot) trainingset$diabetes <- as.numeric(trainingset$diabetes) model <- coxph(Surv(diabetes)~pregnant+glucose+mass+pedigree+age, ???????????????data = trainingset[,c('pregnant','glucose','mass','pedigree','age',"diabetes")] ) ggforest(model = model,#cox回歸方程 ?????????data = trainingset[,c('pregnant','glucose','mass','pedigree','age',"diabetes")],#數(shù)據(jù)集 ?????????main = "簡單森林圖")#標(biāo)題
繪制多因素Cox回歸森林圖
注: # 請(qǐng)確保將路徑"inputdata.txt"替換為實(shí)際數(shù)據(jù)集文件的路徑,并根據(jù)需要調(diào)整模型參數(shù)和其他配置。 # 在繪制AUC曲線之前,確保您的模型輸出的是預(yù)測(cè)的概率值,而不是類別標(biāo)簽。 厲害吧,我們這么快就完成了一個(gè)用lasso算法建立模型并評(píng)估。如果特征比較多,尤其是以基因?yàn)樘卣鲿r(shí)lasso算法能從成千上萬的基因中挑選出對(duì)預(yù)測(cè)表現(xiàn)影響較大的那一部分,甚至是幾個(gè)基因。需要注意的是,如果特征值較多,可能需要大量的內(nèi)存,耗時(shí)比較長。