如何解釋將所有係數縮小到 0 的套索?
我有一個包含 338 個預測變量和 570 個實例(遺憾的是無法上傳)的數據集,我正在使用 Lasso 執行特徵選擇。特別是,我使用如下
cv.glmnet
函數glmnet
,其中mydata_matrix
是 570 x 339 二進制矩陣,輸出也是二進制:library(glmnet) x_dat <- mydata_matrix[, -ncol(mydata_matrix)] y <- mydata_matrix[, ncol(mydata_matrix)] cvfit <- cv.glmnet(x_dat, y, family='binomial')
該圖顯示,當所有變量都已從模型中移除時,偏差最小。這真的是說僅使用截距比使用單個預測器更能預測結果,還是我犯了錯誤,可能在數據或函數調用中?
這與上一個問題類似,但沒有得到任何回應。
plot(cvfit)
我不認為你在代碼中犯了錯誤。這是解釋輸出的問題。
Lasso 沒有指出哪些個體回歸變量比其他回歸變量“更具預測性”。它只是具有將係數估計為零的內在趨勢。懲罰係數越大就是,這種傾向越大。
您的交叉驗證圖顯示,隨著越來越多的係數被強制為零,該模型在預測已從數據集中隨機刪除的值子集方面做得越來越好。當所有係數都為零時達到最佳交叉驗證預測誤差(此處測量為“二項式偏差”)時,您應該懷疑回歸變量的任何子集的線性組合都可能對預測結果有用。
您可以通過生成獨立於所有回歸變量的隨機響應並將您的擬合程序應用於它們來驗證這一點。這是模擬數據集的快速方法:
n <- 570 k <- 338 set.seed(17) X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n, dimnames=list(1:n, c("y", paste0("x", 1:k)))))
數據框
X
有一個名為“y”的隨機二進制列和 338 個其他二進制列(其名稱無關緊要)。我使用你的方法對這些變量進行回歸“y”,但是——只是要小心——我確保響應向量y
和模型矩陣x
匹配(如果數據中有任何缺失值,他們可能不會這樣做) :f <- y ~ . - 1 # cv.glmnet will include its own intercept M <- model.frame(f, X) x <- model.matrix(f, M) y <- model.extract(M, "response") fit <- cv.glmnet(x, y, family="binomial")
結果與您的結果非常相似:
plot(fit)
實際上,對於這些完全隨機的數據,Lasso 仍然返回九個非零係數估計值(儘管我們通過構造知道正確的值全為零)。但我們不應該期望完美。此外,由於擬合是基於隨機刪除數據子集以進行交叉驗證,因此您通常不會從一次運行到下一次得到相同的輸出。在此示例中,第二次調用
cv.glmnet
生成只有一個非零係數的擬合。因此,如果您有時間,最好多次重新運行擬合過程並跟踪哪些係數估計值始終非零。對於這些包含數百個回歸變量的數據,這將需要幾分鐘才能再重複九次。sim <- cbind(as.numeric(coef(fit)), replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial"))))) plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025), xlab="Coefficient Index", ylab="Frequency not zero (jittered)", main="Results of Repeated Cross-Validated Lasso Fits")
這些回歸變量中有八個在大約一半的擬合中具有非零估計值;其餘的從來沒有非零估計。這表明即使係數本身確實為零,Lasso 仍將在多大程度上包括非零係數估計。