Точное определение меры Deviance в пакете glmnet с перекрестной проверкой?


12

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

В glmnet оптимальная лямбда определяется путем перекрестной проверки, и полученные модели можно сравнивать с различными показателями, например, ошибочной классификацией или отклонением.

Мой вопрос: как именно определяется девиация в glmnet? Как рассчитывается?

(В соответствующей статье «Пути регуляризации для обобщенных линейных моделей с помощью координатного спуска» Фридмана и др. Я нахожу только этот комментарий об отклонении, использованном в cv.glmnet: «среднее отклонение (минус двойное логарифмическое правдоподобие слева»). данные) "(стр. 17)).


Это то же самое, что и девиация, используемая в glm(или, по крайней мере, так и должно быть - есть только одно определение девиации, о котором я знаю).
Hong Ooi

Да, но я думаю, что они расширяют это каким-то образом, как указано в цитате в моем первом посте. Отклонение, как я понимаю, может сравнивать производительность двух моделей, но как же тогда авторы включают оставленные данные перекрестной проверки? Какое значение имеет «минус удвоенная логарифмическая вероятность для пропущенных данных»?
Джо Уманн

1
Хорошо, спасибо, теперь я думаю, что понял: отклонение определяется как -2 * логарифмическая вероятность или, скорее, (2 * логарифмическая вероятность) / (логарифмическая вероятность нулевой модели). Это также объясняет, почему их показатель отклонения для разных значений лямбда не превышает интервал 0,2. Модель оценивается по k-1 сгибам перекрестной проверки и применяется к оставшейся сгибу. Для заявки на оставшийся сгиб вычисляется логарифмическая оценка правдоподобия. Это повторяется k раз, и возвращается среднее значение k результатов для каждой лямбды вышеуказанной меры отклонения.
Джо Уманн

1
Да, оно всегда усредняется по всем сгибам для каждой лямбды. Я думаю, что вы можете использовать либо отклонение напрямую, либо отношение по отношению к нулевой модели, которая, вероятно, является моделью только перехвата. Есть две ловушки: а) сгибы могут не иметь одинакового количества точек данных б) каждый сгиб содержит разные данные (естественно). чтобы исправить (а), вы можете просто разделить отклонение на количество точек данных в выбранном сгибе. чтобы исправить (а) и (б) одновременно использовать коэффициентный подход. Модель отклонения предполагает, что набор данных одинаков в каждой модели (та же идея в оценке MAP, где они игнорируют знаменатель).
Кагдас Озгенц

1
Однако, как только складки попадают в картину, знаменатель не совпадает по всем складкам. Таким образом, отношение заботится об этом, удаляя знаменатели. Но я не знаю, насколько это большая проблема, когда вы усредняетесь по фолдам.
Кагдас Озгенц

Ответы:


9

В работе Friedman, Hastie и Tibshirani (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.