Точне визначення міри відхилення в пакеті glmnet, з перехресним перевіркою?


12

Для мого поточного пошуку я використовую метод Лассо через пакет glmnet в R на біноміальній залежній змінній.

У glmnet оптимальна лямбда знайдена за допомогою перехресної перевірки, і отримані моделі можна порівняти з різними заходами, наприклад, помилкою неправильної класифікації або відхиленням.

Моє запитання: Як саме визначається відхилення в glmnet? Як він обчислюється?

(У відповідному документі "Шляхи регуляризації узагальнених лінійних моделей через координатний спуск" Фрідмана та ін. Я зауважую лише цей коментар щодо відхилення, яке використовується у cv.glmnet: "середнє відхилення (мінус удвічі більший за ймовірність журналу ліворуч" дані) "(стор. 17)).


Це те саме, що використовується відхилення glm(або, принаймні, воно повинно бути - є лише одне визначення відхилення, яке я знаю).
Гонг-Ой

Так, але я думаю, вони поширюють це якимось чином, як зазначено цитатою в моєму першому дописі. Як я розумію, Deviance може порівнювати ефективність двох моделей, але як автори включають тоді залишені дані перехресної перевірки? Як має сенс "мінус удвічі більший за ймовірність журналу на залишених даних"?
Jo Wmann

1
Добре, спасибі, зараз я думаю, що я це зрозумів: відхилення визначається як -2 * лого-ймовірність, а точніше (2 * log-імовірність) / (log-ймовірність нульової моделі). Це також пояснює, чому міра їх відхилення для різних значень лямбда не перевищує інтервал 0,2. Модель оцінюється на складках k-1 перехресної перевірки і застосовується до частини, що залишилася. Для додатка, що залишився, обчислюється оцінка вірогідності журналу. Це повторюється k разів, і повертається середнє значення k результатів для кожної лямбда вищевказаної міри відхилення.
Jo Wmann

1
Так, це завжди усереднюється за всі складки для кожної лямбда. Я думаю, ви можете використовувати або відхилення безпосередньо, або співвідношення wrt до нульової моделі, яка, мабуть, є лише перехоплюючою моделлю. Є дві підводні камені: а) складки можуть не мати точно однакової кількості точок даних; б) кожна складка містить різні дані (природно). для виправлення (a) ви можете просто розділити відхилення на кількість точок даних у вибраній складці. щоб одночасно виправити (a) і (b) використовувати підхід відношення. Модель відхилення передбачає, що набір даних однаковий у кожній моделі (однакова ідея в оцінці MAP, де вони ігнорують знаменник).
Cagdas Ozgenc

1
Однак, коли складки потрапляють у малюнок, знаменник не однаковий у складках. Тож співвідношення переймається цим, скасовуючи знаменники. Але я не знаю, наскільки великою є ця проблема, коли ти в середньому перевищує складки.
Cagdas Ozgenc

Відповіді:


9

У Фрідмана, Хасті та Тібшірані (2010) відхилення біноміальної моделі з метою перехресної перевірки обчислюється як

мінус удвічі більший за ймовірність журналу на залишених даних (стор. 17)

Зважаючи на те, що це папір, про яку йдеться в документаціїglmnet (на стор. 2 та 5), це, мабуть, формула, яка використовується в пакеті.

І дійсно, у вихідному коді для функції cvlognetзалишки відхилення для відповіді обчислюються як

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

де predmatпросто

predict(glmnet.object,x,lambda=lambda)

і передається з функції кодування cv.glmnet. Я використовував вихідний код, доступний на сторінці JStatSoft для паперу , і не знаю, наскільки оновлений цей код. Код цього пакету напрочуд простий і читабельний; ви завжди можете перевірити себе, ввівши glmnet:::cv.glmnet.


1

На додаток до відповіді @shadowtalker, коли я використовував пакет glmnet, я відчуваю, що відхилення в перехресній валідації якимось чином нормалізується.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Посилання: документ відхилення R

тому що якщо я виконую поділ,

head(deviance(fit$glmnet.fit)) / length(y))

результат є

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

що дуже близько до придатного $ cvm.

Про це може сказати коментар @Hong Ooi з цього питання:

/programming/43468665/poisson-deviance-glmnet

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.