Я использую glmnet для расчета оценок регрессии гребня. Я получил некоторые результаты, которые сделали меня подозрительным в том, что glmnet действительно делает то, что я думаю, что делает. Чтобы проверить это, я написал простой R-скрипт, в котором я сравниваю результат регрессии гребня, выполненного execute, и результат в glmnet, разница значительна:
n <- 1000
p. <- 100
X. <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)
beta1 <- solve(t(X)%*%X+5*diag(p),t(X)%*%Y)
beta2 <- glmnet(X,Y, alpha=0, lambda=10, intercept=FALSE, standardize=FALSE,
family="gaussian")$beta@x
beta1-beta2
Норма разницы обычно составляет около 20, что не может быть связано с численно различными алгоритмами, я должен делать что-то не так. Какие настройки мне нужно установить glmnet
, чтобы получить тот же результат, что и для ridge?
r
ridge-regression
glmnet
Джон
источник
источник
Ответы:
Разница, которую вы наблюдаете, связана с дополнительным делением на количество наблюдений N, которое GLMNET использует в своей целевой функции, и неявной стандартизацией Y по стандартному отклонению выборки, как показано ниже.
где мы используем вместо 1 / ( n - 1 ) для s y , s y = ∑ i ( y i - ˉ y ) 21 / n 1 / ( n - 1 ) sY
Дифференцируя по отношению к бете, устанавливая уравнение на ноль,
И, решив для беты, мы получаем оценку,
Чтобы восстановить оценки (и соответствующие штрафы) по исходной метрике Y, GLMNET умножает как оценки, так и лямбды на и возвращает эти результаты пользователю,sY
Лупытд. =syλ
Сравните это решение со стандартным выводом регрессии гребня.
Обратите внимание, что масштабируется на дополнительный коэффициент N. Кроме того, когда мы используем функцию или , штраф будет неявно масштабироваться на 1 / s y . То есть, когда мы используем эти функции для получения оценок коэффициентов для некоторого λ ∗ , мы эффективно получаем оценки для λ = λ ∗ /λ 1 / сY λ* .λ = λ*/ сY
predict()
coef()
На основании этих наблюдений, наказание используется в GLMNET должна быть расширена на коэффициент .sY/ N
Результаты обобщаются на включение перехвата и стандартизированных переменных X. Мы модифицируем стандартизированную X-матрицу, включив в нее столбец единиц и диагональную матрицу, чтобы иметь дополнительный нулевой элемент в позиции [1,1] (т.е. не штрафовать за перехват). Затем вы можете отстранить оценки от оценки их соответствующих стандартных отклонений (снова убедитесь, что вы используете 1 / n при вычислении стандартного отклонения).
Добавлен код для отображения стандартизированного X без перехвата:
источник
gaussian
glmnet()
glmnet(x, y, alpha=1)
glmnet_2.0-13
glmnet(x, y, alpha=0)
Для лассо (α = 1 ), масштабирование η вернуться, чтобы сообщить о казни как ηsY имеет смысл. Тогда для всехα , ηsY должен быть указан как штраф, чтобы сохранить непрерывность результатов по всему α , Это, вероятно, является причиной проблемы выше. Отчасти это связано с использованием (2) для решения (1). Только тогда, когдаα = 0 или α = 1 существует некоторая эквивалентность между задачами (1) и (2) (т. е. соответствие между λ в (1) и η в (2)). Для любого другогоα ∈ ( 0 , 1 ) задачи (1) и (2) - это две разные проблемы оптимизации, и нет однозначного соответствия между λ в (1) и η в (2).
источник