LASSO thích ứng được sử dụng để lựa chọn biến nhất quán. Các vấn đề chúng tôi gặp phải khi sử dụng LASSO cho lựa chọn biến là:
- Tham số co rút phải lớn hơn để lựa chọn so với dự đoán
- Các tham số khác không lớn sẽ quá nhỏ để độ lệch quá lớn
- Các thông số khác không nhỏ có thể được phát hiện một cách nhất quán
- Tương quan cao giữa các yếu tố dự đoán dẫn đến hiệu suất lựa chọn kém
Do đó, LASSO chỉ nhất quán cho lựa chọn biến trong một số điều kiện về tham số co rút, tham số (điều kiện beta-min) và tương quan (điều kiện không thể so sánh được). Xem trang 101-106 của luận án thạc sĩ của tôi để được giải thích chi tiết.
LASSO thường bao gồm quá nhiều biến khi chọn tham số điều chỉnh để dự đoán nhưng mô hình thực sự rất có thể là tập hợp con của các biến này. Điều này cho thấy sử dụng giai đoạn ước tính thứ cấp như LASSO thích nghi, điều khiển độ lệch của ước tính LASSO bằng cách sử dụng tham số điều chỉnh tối ưu dự đoán. Điều này dẫn đến lựa chọn phù hợp (hoặc tài sản orory) mà không có các điều kiện được đề cập ở trên.
Bạn có thể sử dụng glmnet cho LASSO thích ứng. Trước tiên, bạn cần một ước tính ban đầu, ít nhất là bình phương, sườn núi hoặc thậm chí là ước tính LASSO, để tính trọng số. Sau đó, bạn có thể triển khai LASSO thích ứng bằng cách nhân rộng ma trận X. Dưới đây là một ví dụ sử dụng ước tính ban đầu bình phương tối thiểu trên dữ liệu đào tạo:
# get data
y <- train[, 11]
x <- train[, -11]
x <- as.matrix(x)
n <- nrow(x)
# standardize data
ymean <- mean(y)
y <- y-mean(y)
xmean <- colMeans(x)
xnorm <- sqrt(n-1)*apply(x,2,sd)
x <- scale(x, center = xmean, scale = xnorm)
# fit ols
lm.fit <- lm(y ~ x)
beta.init <- coef(lm.fit)[-1] # exclude 0 intercept
# calculate weights
w <- abs(beta.init)
x2 <- scale(x, center=FALSE, scale=1/w)
# fit adaptive lasso
require(glmnet)
lasso.fit <- cv.glmnet(x2, y, family = "gaussian", alpha = 1, standardize = FALSE, nfolds = 10)
beta <- predict(lasso.fit, x2, type="coefficients", s="lambda.min")[-1]
# calculate estimates
beta <- beta * w / xnorm # back to original scale
beta <- matrix(beta, nrow=1)
xmean <- matrix(xmean, nrow=10)
b0 <- apply(beta, 1, function(a) ymean - a %*% xmean) # intercept
coef <- cbind(b0, beta)