Scikit-learn: Семейство функций потерь Пуассона, гаммы и твиди

Созданный на 7 дек. 2015  ·  57Комментарии  ·  Источник: scikit-learn/scikit-learn

Я хотел бы, чтобы sklearn поддерживал функции потерь Пуассона, гаммы и других семейств Tweedie. Эти распределения потерь широко используются в промышленности для подсчета и других данных с длинным хвостом. Кроме того, они реализованы в других библиотеках, таких как R: GLM, GLMNET, GBM ext. Частью реализации этих распределений будет включение способа передачи смещений функциям потерь. Это распространенный способ обработки уязвимости при использовании функции связи журнала с этими дистрибутивами.

Будет ли сообщество sklearn открыто для добавления этих функций потерь. Если это так, я или (надеюсь, другие) захотят исследовать возможность реализации этих функций потерь и смещений в API sklearn. Спасибо

New Feature

Самый полезный комментарий

@thenomemac Вы абсолютно правы насчет изменения функции потерь из-за воздействия, я ошибался. На самом деле, я считаю, что у меня это получилось. У меня очень ранний WIP (скорее просто игра): https://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py (проверьте функцию _poisson_loss() ).

@josef-pkt Спасибо, я посмотрел на реализацию statsmodels, она на самом деле неплохая (за исключением API, который мне не нравится). На самом деле это немного более общее, когда их модель «подсчета» поддерживает другие регрессии на основе подсчета, такие как отрицательный бином. Реализация статистической модели уже учитывает экспозицию и регуляризацию (это то, что я также искал).

Учитывая, что у statsmodels есть реализация, считаете ли вы, что по-прежнему полезно иметь что-то подобное в sklearn ? Если это так, я могу попытаться приложить дополнительные усилия, чтобы привести его в пригодную для использования форму. Я просто был очень занят работой, поэтому у меня не было много времени.

Все 57 Комментарий

Я думаю, что мы должны по крайней мере добавить регрессию Пуассона, хотя я не очень знаком с ней.
У вас есть открытые примеры наборов данных?
Для каких данных используются потери гамма-излучения?

Можно по офсету подробнее?

Я думаю, что все это будут отдельные модели в linear_model . Я не уверен, обычно ли они изучаются с помощью l-bfgs или люди используют CD-решатели? Может @mblondel или @larsmans или @agramfort знают больше?

Распределение Пуассона широко используется для моделирования данных подсчета. Можно показать, что это предельное распределение для нормального приближения к биномиальному, когда количество испытаний стремится к бесконечности, а вероятность стремится к нулю, и оба происходят с такой скоростью, что np равно некоторой средней частоте для вашего процесса. Теоретически можно показать, что гамма представляет собой время до возникновения события отравления. Так, например, количество несчастных случаев в этом году теоретически может быть показано как пуассон. И ожидаемое время до вашего следующего несчастного случая или третье происшествие — это гамма-процесс. Твиди является обобщенным родителем этих распределений, который допускает дополнительный вес нуля. Думайте о твиди как о моделировании долларов убытков, и 99 процентов всех клиентов имеют нулевой вес, остальные имеют положительный убыток с длинным хвостом или гамму. На практике эти распределения широко используются для задач регрессии в страховании, моделировании опасностей, моделях бедствий, финансах, экономике и социальных науках. Не стесняйтесь ссылаться на википедию. Я бы хотел, чтобы эти функции потерь были выбраны в glmnet, GBM и random forest. Это означает, что в GBM, например, алгоритм повышения Фридмана будет использовать эту потерю вместо гауссовой или квартильной потери. Гамма и пуассон (бета-твиди) уже есть в пакетах Rs GBM и glm, а xgboost имеет некоторую поддержку. Смещения используются практиками для взвешивания своих данных по экспозиции. Обычно пуассоновская модель имеет функцию связи, например: yhat=offset x exp(вывод регрессионной модели) называется логарифмической ссылкой и является наиболее распространенной. Здесь смещение позволяет фиксировать экспозицию по-разному для разных единиц наблюдения. Процессы Пуассона являются аддитивными, но разные примеры могут быть взяты для неравного пространства или времени или количества клиентов, и, следовательно, для каждого наблюдения необходим вектор смещения. Я готов заняться этим программированием, но я не очень хорошо знаком с API, поэтому я был бы признателен за предложения, чтобы я сделал это правильно и включил его в выпуск.

Хорошо, я работаю над реализацией этого. Я добавляю три упомянутых выше дистрибутива и смещения. Я был бы признателен за отзывы от общей аудитории sklearn о том, как реализовать смещения. Я планирую добавить новый аргумент в вызов GradientBoostedRegression 'offset=None', где смещение будет представлять собой вектор, подобный объекту, с длиной n (количество выборок). Мой главный вопрос заключается в том, следует ли мне добавлять смещения ко всем функциям потерь (гауссовым, хуберовским, квантильным), как это делается в реализации R GBM, или мне следует просто добавить, чтобы смещения работали с семейством твиди и выдавали предупреждение, если вы попытаетесь использовать смещение с неподдерживаемой функцией потерь?

Я больше просил практические варианты использования, такие как наборы данных или публикации. Я знаю, что делают дистрибутивы ;)

Вероятно, это было бы хорошим дополнением, хотя я не могу гарантировать, что ваш вклад будет объединен. Вероятно, было бы хорошо обсудить это более широко, прежде чем вы прыгнете. Если вы просто не хотите реализовать это для себя и не заботитесь, объединим ли мы его;)

Я так понимаю, вас в основном интересует повышение градиента, а не линейные модели?

пинг @pprett @glouppe @arjoly

Я заинтересован в интеграции всего этого, но в основном ансамбли деревьев.
первый. В любом случае они будут изрядно дублировать работу в качестве случайного леса.
и GBM имеют разные ABC для каждой функции потерь. Так что я могу просто сделать
работать один раз и заставить его работать в обоих, к сожалению. Я также могу получить некоторые
наборы данных. Как выглядит процесс слияния этого процесса
я должен следовать. Я новичок в содействии, поэтому хочу убедиться, что это сделано
правильно. Но, как я уже сказал, GBM рассматривает классы убытков независимо от чего-либо еще.
в sklearn, поэтому мои изменения в GBM могли легко стоять отдельно. я только должен
отредактируйте код в сценарии .py.
10 декабря 2015 г., 16:57, «Андреас Мюллер» [email protected] написал:

Я больше просил практические варианты использования, такие как наборы данных или
публикации. Я знаю, что делают дистрибутивы ;)

Вероятно, это было бы хорошим дополнением, хотя я не могу вам этого гарантировать.
ваш вклад будет объединен. Наверное, было бы неплохо это обсудить
более широко, прежде чем прыгать. Если только вы не хотите реализовать его для
себя и не волнует, если мы объединим его;)

Я так понимаю, вас в основном интересует градиентное повышение, а не линейное
модели?

пинг @pprett https://github.com/pprett @glouppe
https://github.com/glouppe @arjoly https://github.com/arjoly


Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment -163761067
.

Было бы неплохо получить некоторый вклад от наших экспертов GBM, которых я пропинговал выше, но вы также можете написать в список рассылки и спросить, будут ли люди заинтересованы в дополнении.

Вы также планируете поддерживать решатели координат со штрафами L1/L2?
как _glmnet
?_

Есть обновления по этому вопросу? Я бы хотел, чтобы в linear_models была добавлена ​​регрессия Пуассона, чтобы мне не приходилось выходить за пределы использования sklearn . Если над этим активно никто не работает, я могу попытаться реализовать его.

никто, АФАИК.

не стесняйтесь попробовать и поделиться реализацией WIP.

Я собирался работать над этим и продолжаю работать. Если я сделаю это, хотя я
нужен чистый способ добавить смещения в API. Я думал о добавлении
смещение kwarg и по умолчанию может быть None и выдать предупреждение, если потеря
не яд. В основном я использую пуассон для моделирования страховки, где
смещение - это логарифм (заработанное воздействие), я знаю из экспериментов и распространения
теория о том, что для разреженных данных подсчета вы получите значительно худшую модель
без зачетов. В настоящее время линейная модель R и GBM поддерживают алгоритм Пуассона.
со смещениями. Так что это мой текущий инструмент. Я хотел бы добавить это к
sklearn, если другие захотят его добавить.
1 мая 2016 г., 4:03, «Александр Грэмфорт» [email protected]
написал:

никто, АФАИК.

не стесняйтесь попробовать и поделиться реализацией WIP.


Вы получаете это, потому что вы создали тему.
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment -216024458

@thenomemac У вас есть реализация WIP, на которую я мог бы взглянуть?

Что касается смещений, не могли бы вы просто потребовать от пользователя разделить свои подсчеты на смещение/экспозицию, чтобы сделать значение «y» скоростью, а не подсчетом (https://en.wikipedia.org/wiki/Poisson_regression#. 22Экспозиция.22_и_смещение)? Пакет R GLM имеет отличный интерфейс для указания моделей (включая указание смещений), но не уверен, как это впишется в существующий API линейных моделей.

@bjlkeng У меня еще не завершена реализация WIP. Я начал какое-то время назад, а потом отвлекся. Я не думаю, что деление на экспозиции для получения коэффициента Пуассона является правильным выводом алгоритма GBM для потери Пуассона. Смещение = log (экспозиция) в градиенте является аддитивным фактором. Таким образом, вы фактически придаете больший вес «областям» с более высокой экспозицией. Не уверен на 100%, что вы можете вернуться к правильному градиенту на каждой итерации подбора базового обучаемого (дерева), потому что текущая схема передачи весов обучающемуся дереву является мультипликативной, а не аддитивной. Я попытаюсь напечатать более строгий математический вывод того, о чем я говорю. Могу сказать, что на практике это имеет значение. В наборах данных реального мира, которые я смоделировал, где вы ожидаете, что данные подсчета будут пуассоновскими, использование gbm R будет сходиться быстрее и к лучшему результату, потому что его обработка смещается «математически» правильным способом. И другие реализации gbm, такие как xgboost с функцией потерь Пуассона, не могут также моделировать данные, используя скорость Пуассона, как это предлагается.

(Кроме того, я нашел ссылку на эту проблему на stats.stackexchange

statmodels GLM имеет смещение и экспозицию (экспозицию только для ссылки на журнал)

В мастере теперь есть вариант эластичной сети для GLM и нескольких других моделей, реализованных через цикл apython для спуска по координатам (использует общую максимальную вероятность со смещением)

В мастере теперь также есть семейство Tweedie для GLM. Однако он не использует функцию потерь полного логарифмического правдоподобия, потому что это бесконечная сумма членов, а вычисление усеченной версии происходит медленно, а обычно используемые приближения не очень точны в некотором диапазоне пространства параметров.

Итак, если вам нужна эталонная реализация, в statsmodels есть эти части. Я никогда не слышал и не смотрел на GBM для GLM. Я также недостаточно знаю код scikit-learn, чтобы сказать, как он подойдет.
)

@thenomemac Вы абсолютно правы насчет изменения функции потерь из-за воздействия, я ошибался. На самом деле, я считаю, что у меня это получилось. У меня очень ранний WIP (скорее просто игра): https://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py (проверьте функцию _poisson_loss() ).

@josef-pkt Спасибо, я посмотрел на реализацию statsmodels, она на самом деле неплохая (за исключением API, который мне не нравится). На самом деле это немного более общее, когда их модель «подсчета» поддерживает другие регрессии на основе подсчета, такие как отрицательный бином. Реализация статистической модели уже учитывает экспозицию и регуляризацию (это то, что я также искал).

Учитывая, что у statsmodels есть реализация, считаете ли вы, что по-прежнему полезно иметь что-то подобное в sklearn ? Если это так, я могу попытаться приложить дополнительные усилия, чтобы привести его в пригодную для использования форму. Я просто был очень занят работой, поэтому у меня не было много времени.

Я думаю, что это все еще было бы ценно.

@bjlkeng Спасибо за комментарий! Вы заинтересованы в том, чтобы взяться за это и сделать запрос на слияние? Если нет, я могу попытаться заняться этим вопросом и попытаться сделать пиар... Сначала для пуассона, а затем для гаммы... @agramfort Вас это устраивает? :)

Привет, @raghavrv , извини за поздний ответ. Работа была довольно загружена, и я также понял, что это займет больше времени, чем у меня было время. Поэтому, пожалуйста, не стесняйтесь продолжать. Я бы взглянул на реализацию statsmodel, потому что у них есть большая часть функций, которые, я думаю, вам здесь понадобятся.

@raghavrv Вы начали работать над этим? Я также могу внести свой вклад, чтобы у нас была хотя бы регрессия Пуассона в sklearn.

@btabibian @raghavrv Каков этот статус? Мне нужна реализация регрессии Пуассона для проекта, и я хотел бы внести свой вклад.

Пожалуйста, продолжайте :) У меня не было на это времени, извините...

То же, что я не успел. Также я боролся с API и тем, как
интегрировать смещения. Я мог бы показать математику или пример кода в statsmodels.
Но TLDR вам нужны смещения, если вы хотите использовать регрессию Пуассона с
неравные экспозиции (площадь или время), то вам нужны смещения. Модель не
дайте правильное взвешивание, если вы просто разделите свои подсчеты на воздействия.

1 апреля 2017 г., 14:49, "(Венкат) Рагхав (Раджагопалан)" <
уведомления@github.com> написал:

Пожалуйста, продолжайте :) У меня не было на это времени, извините...


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-290939521 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AOeuWjVGf3-VmeasNHMLQAB1dnd4zuUQks5rrpw4gaJpZM4Gwd6-
.

Я начну изучать это тогда. @thenomemac спасибо за совет! Я проверю реализацию statsmodels, чтобы увидеть, как они справляются с экспозицией.

Привет, есть обновления? Можно ли также добавить отрицательную биномиальную вероятность? Это не должно иметь большого значения для Пуассона. В противном случае я мог бы изучить это ..

Лучший,
Саймон

Привет @dirmeier , к сожалению, нет. Я переключился на иерархическую байесовскую модель и так и не реализовал регрессию Пуассона.

@dirmeier , @jakobworldpeace , вы можете указать нам на какую-то работу? Я также могу прыгнуть, взглянув на это?

Привет @NickHoernle ,
В настоящее время я использую R для NB-регрессии, потому что у меня нет времени. Буду рад, если вы это реализуете :)

@NickHoernle Нет WIP, но реализация регрессии Пуассона statsmodels должна помочь вам начать работу.

Превосходно. Я начну смотреть на это и видеть, где мы получаем.

Я работаю над GLM здесь: https://github.com/madrury/py-glm.

Я не собираюсь объединять это в sklearn, это действительно для того, чтобы мои ученики могли использовать его в классе, но хотел бы указать на работу на случай, если она будет полезна всем, кто работает над этой проблемой.

ваш решатель в методе Ньютона, который будет трудно масштабировать в высоких
измерение. Он также не поддерживает штрафы типа L1. Также проверьте свой API
согласованность со sklearn. Fit должен принимать только X, y и sample_weights

Чтобы исправить проблемы с масштабируемостью, первое, что нужно сделать, это использовать l-bfgs. Видеть
наш код логистической регрессии

ХТН

Как я уже сказал, моя цель не в полной согласованности со sklearn, а в том, чтобы иметь простую реализацию, которая следует за MuCullagh и Nelder и предоставляет некоторые из инструментов вывода (которые, как я полагаю, выходят за рамки sklearn). Он предназначен для использования в классе на наборах данных среднего размера. Я просто хотел связать код здесь на случай, если какие-либо идеи будут полезны тем, кто работает над этой функцией для sklearn (и получить немного информации никогда не помешает).

Я не думаю о штрафах L1 как об объеме, для этого я бы просто использовал glmnet . L2 достаточно прост, чтобы его можно было включить в классическую структуру GLM, которую я добавил.

По поводу метода fit рискну здесь небольшой комментарий, надеюсь не лишний. Недостаток offset , предусмотренных для соответствия, был большой частью того, почему sklearn не прижился на моей последней работе. Это действительно необходимо для правильного моделирования страхования. Регулирующие органы ожидают, что модели Пуассона и Твиди будут соответствовать этому, и могут быть довольно жесткими в своих ожиданиях.

спасибо за разъяснение видения.

Что касается смещения, это относится к моделям Poisson и Tweedie?
если это конкретное значение образца, то это может быть sample_prop в подгонке
параметры.
Это просто max_iter или tol, которые не зависят от данных, которые должны быть в
инициализация

Есть ли по сравнению с # 9405?

@agramfort Вы правы насчет max_iter и tol, я перенесу их в __init__.

У вас есть ссылка на то, что вы подразумеваете под sample_prop ?

см. https://github.com/scikit-learn/enhancement_proposals/pull/6

До сих пор обсуждается, как это лучше сделать...

Короткое примечание о смещениях: насколько мне известно, выборочных весов достаточно, чтобы иметь дело с экспозицией, т.е. подгонка y=values/exposure с sample_weight=exposure должна работать и хорошо обобщается на другие распределения и ссылки, кроме Пуассона, с лог-связью.

@madrury Спасибо, что поделились. Я посмотрю на вашу реализацию и сравним с моей.

Люди все еще заинтересованы в этом? Мне было бы интересно внести свой вклад.

Я все еще заинтересован в этой функции, если кто-то добавит ее sklearn.

В четверг, 21 декабря 2017 г., в 18:04, Джаред Самет, [email protected]
написал:

Люди все еще заинтересованы в этом? Мне было бы интересно внести свой вклад.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-353479618 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AOeuWtvi4Um_o_ERuVe1ob86201G-ASdks5tCuP4gaJpZM4Gwd6-
.

@oracleofnj @thenomemac

У меня есть проверенная общая реализация glm в моей библиотеке py-glm, но я не планирую пытаться объединить ее со sklearn (я принял некоторые дизайнерские решения, которые делают ее несовместимой со sklearn). Он настроен таким образом, чтобы было очень легко добавлять другие экспоненциальные семейства.

У меня также есть полная, чистая реализация glmnet на python, которая поддерживает те же экспоненциальные семейства в той же библиотеке, но я застрял на ошибке, и я положил ее. Я бы хотел, чтобы вам помогли разобраться с ошибкой, просто нужна мотивация, чтобы восстановить ее.

@madrury Рад попытаться помочь вам с этой ошибкой.

Привет, что-нибудь построено для этих дистрибутивов? Интересны любые обновления. Спасибо.

Лично я был бы согласен закрыть эту проблему, чтобы помочь участникам
фокус. Причины:

  • Ландшафт питона изменился

  • statsmodels теперь намного более зрелый и включает в себя эти дистрибутивы с
    правильное взвешивание экспозиции

  • реализации на основе jit через pytorch или tensorflow упрощают
    реализовать любую эзотарическую потерю без штрафа за производительность или пакета
    перекомпиляция

Мысли?

в настоящее время мы выделяем ресурсы, чтобы помочь с
https://github.com/scikit-learn/scikit-learn/pull/9405
и заставить его (по крайней мере, некоторые части) приземлиться в master. Ее следует решать более
следующие месяцы.

Потрясающая работа!

В субботу, 13 апреля 2019 г., 3:27 Alexandre [email protected]
написал:

в настоящее время мы выделяем ресурсы, чтобы помочь с
https://github.com/scikit-learn/scikit-learn/pull/9405
и заставить его (по крайней мере, некоторые части) приземлиться в master. Ее следует решать более
следующие месяцы.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-482784732 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AOeuWj8PD0nfltM7Acg12Pfhl4sG5n7Fks5vgYbogaJpZM4Gwd6-
.

Было бы здорово иметь GLM в sciki-learn. Это уменьшит необходимость переходить на другие языки. С нетерпением жду этого.

Согласованный. Приходя из мира R, я был удивлен, что в sklearn еще не было функций GLM. Я надеюсь, что это будет скоро.

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

@patrickspry Statsmodels имеет хорошую реализацию большинства GLM, которые мог бы изучить старшекурсник.

@patrickspry На https://github.com/scikit-learn/scikit-learn/pull/9405 есть довольно полный PR, и ведется работа по объединению этой функциональности.

О, фантастика! Спасибо за внимание!

Есть ли предполагаемые сроки объединения PR? Спасибо.

@Jiang-Li Смотрите здесь

Для линейных моделей есть #14300. А вот и открытый вопрос №15123. Я лично очень хотел бы видеть модели на основе дерева с функциями потерь твиди.

Для линейных моделей № 14300 теперь объединен, хотя дополнительные функции все еще могут быть добавлены https://github.com/scikit-learn/scikit-learn/pull/9405#issuecomment -594553953

Я лично очень хотел бы видеть модели на основе дерева с функциями потерь твиди.

Это действительно может быть следующим шагом (например, https://github.com/scikit-learn/scikit-learn/issues/15123#issuecomment-542090766).

Впечатляет большая работа в sklearn 0.23, которая включает в себя Пуассон, гамму и твиди. Надеюсь увидеть больше улучшений в будущем.
Читая руководство пользователя, логистическая регрессия выходит за рамки обобщенной линейной регрессии. Возможно, в разделе «Обобщенная линейная регрессия» должно быть хотя бы несколько слов о том, что логистическая регрессия является типом GLM и может быть решена с использованием той же функции потерь отклонения.

Похоже, мы можем закрыть вопрос, когда #14300 объединен?

Читая руководство пользователя, логистическая регрессия выходит за рамки обобщенной линейной регрессии. Возможно, в разделе «Обобщенная линейная регрессия» должно быть хотя бы несколько слов о том, что логистическая регрессия является типом GLM и может быть решена с использованием той же функции потерь отклонения.

Спасибо за отзыв @magicmathmandarin ! Да, конечно. Первоначальный PR https://github.com/scikit-learn/scikit-learn/pull/9405 фактически включал отклонение от BinomialDistribution для бинарной логистической регрессии. Причина, по которой мы не включили это в первый объединенный PR, заключается в том, что даже они действительно являются частью одной и той же теоретической структуры, в настоящее время по-прежнему рекомендуется специализированная реализация LogisticRegression (лучше протестирована пользователями, обрабатывает больше параметров, например мультикласс), и мы не хотели запутать пользователей. Теперь, когда он объединен, я согласен, что эту часть можно сформулировать лучше.

Похоже, мы можем закрыть вопрос, когда #14300 объединен?

Конечно. Есть несколько дополнительных обсуждений на https://github.com/scikit-learn/scikit-learn/issues/16668 , https://github.com/scikit-learn/scikit-learn/pull/16692 и https: //github.com/scikit-learn/scikit-learn/issues/15123.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги