답변:
질문에 대한 간단한 답변 :
glmnet
R의 "glmnet"패키지의 기능 은에 대해 올가미 (적응 올가미 아님)를 수행합니다 alpha=1
.참고 문헌 :
LASSO 솔루션은 최소화하는 솔루션입니다
적응 형 올가미는 단순히 가중치를 추가하여 바이어스되는 LASSO 추정의 알려진 문제에 대응합니다.
적응 형 LASSO는 일관된 변수 선택에 사용됩니다. 변수 선택에 LASSO를 사용할 때 발생하는 문제는 다음과 같습니다.
따라서 LASSO는 수축 매개 변수, 매개 변수 (베타-최소 조건) 및 상관 관계 (표시 할 수없는 조건)의 일부 조건에서 변수 선택에 대해서만 일관성이 있습니다. 자세한 설명은 석사 논문 논문 101-106 페이지를 참조하십시오 .
LASSO는 종종 예측을위한 튜닝 파라미터를 선택할 때 너무 많은 변수를 포함하지만 실제 모델은 이러한 변수의 일부일 가능성이 높습니다. 이는 예측-최적 튜닝 파라미터를 사용하여 LASSO 추정의 바이어스를 제어하는 적응 적 LASSO와 같은 2 차 추정 단계를 사용하는 것을 제안한다. 이로 인해 위에서 언급 한 조건없이 일관된 선택 (또는 오라클 속성)이 발생합니다.
적응 형 LASSO에 glmnet을 사용할 수 있습니다. 먼저 가중치를 계산하려면 초기 추정치 (최소 제곱, 능선 또는 LASSO 추정치)가 필요합니다. 그런 다음 X 행렬을 스케일링하여 적응 형 LASSO를 구현할 수 있습니다. 훈련 데이터에 대한 최소 제곱 초기 추정치를 사용하는 예는 다음과 같습니다.
# 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)