Scikit-learn: Família de funções de perda de Poisson, gama e tweedie

Criado em 7 dez. 2015  ·  57Comentários  ·  Fonte: scikit-learn/scikit-learn

Eu gostaria que o sklearn suportasse Poisson, gamma e outras funções de perda da família Tweedie. Essas distribuições de perda são amplamente utilizadas na indústria para contagem e outros dados de cauda longa. Além disso, eles são implementados em outras bibliotecas como R: GLM, GLMNET, GBM ext. Parte da implementação dessas distribuições seria incluir uma maneira de os deslocamentos serem passados ​​para as funções de perda. Essa é uma maneira comum de lidar com a exposição ao usar uma função de link de log com essas distribuições.

A comunidade sklearn estaria aberta a adicionar essas funções de perda. Nesse caso, eu ou (espero que outros) estariam dispostos a pesquisar a viabilidade de implementar essas funções de perda e compensações na API do sklearn. Obrigado

New Feature

Comentários muito úteis

@thenomemac Você está absolutamente certo sobre a alteração da função de perda devido à exposição, eu estava enganado. Na verdade, acredito que consegui. Eu tenho um WIP muito cedo (mais de apenas brincar): https://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py (confira a função _poisson_loss() ).

@josef-pkt Obrigado, eu olhei para a implementação do statsmodels, é realmente muito bom (exceto pela API, da qual não sou fã). Na verdade, é um pouco mais geral onde o modelo de "contagem" suporta outras regressões baseadas em contagem, como binomial negativa. A implementação do statsmodel já leva em consideração exposição e regularização (que é o que eu também estava procurando).

Dado que statsmodels tem uma implementação, você acha que ainda é valioso ter algo assim em sklearn ? Se assim for, posso tentar colocar um pouco mais de esforço para colocá-lo em uma forma utilizável. Estou muito ocupado com o trabalho, então não tive muito tempo.

Todos 57 comentários

Acho que devemos pelo menos adicionar uma regressão de poisson, embora eu não esteja muito familiarizado com isso.
Você tem conjuntos de dados de exemplo abertos?
Em que tipo de dados a perda de gama é usada?

Pode detalhar o offset?

Estes seriam todos modelos separados em linear_model , eu acho. Não tenho certeza se eles geralmente são aprendidos usando l-bfgs ou se as pessoas usam solucionadores de CD? Talvez @mblondel ou @larsmans ou @agramfort saibam mais?

A distribuição de poisson é amplamente utilizada para modelar dados de contagem. Pode ser mostrado como a distribuição limite para uma aproximação normal de um binômio onde o número de tentativas vai para o infinito e a probabilidade vai para zero e ambos acontecem a uma taxa tal que np é igual a alguma frequência média para o seu processo. Gamma pode ser teoricamente mostrado como o tempo até que um evento de poisson ocorra. Assim, por exemplo, o número de acidentes que você terá este ano pode ser teoricamente comprovado. E o tempo esperado até o seu próximo acidente ou terceira extensão é um processo gama. Tweedie é um pai generalizado dessas distribuições que permite peso adicional em zero. Pense no tweedie como um modelo de perda de dólares e 99 por cento de todos os clientes têm peso zero, o resto tem uma perda positiva de cauda longa ou gama. Na prática, essas distribuições são amplamente utilizadas para problemas de regressão em seguros, modelagem de riscos, modelos de desastres, finanças, economia e ciências sociais. Sinta-se à vontade para consultar a wikipedia. Eu gostaria de ter essas funções de perda como opções em glmnet, GBM e floresta aleatória. Isso significa que no GBM, por exemplo, o algoritmo de reforço de Freedman usaria essa perda em vez de perda gaussiana ou quartil. Gamma e poisson (beta tweedie) já estão nos pacotes Rs GBM e glm e o xgboost tem algum suporte. As compensações são usadas pelos profissionais para ponderar seus dados por exposição. Normalmente, um modelo poisson tem uma função de link ex: yhat=offset x exp(saída do modelo de regressão) é chamado de link de log e é o mais comum. Aqui, o deslocamento permite que a exposição seja capturada de forma diferente para diferentes unidades de observação. Os processos de Poisson são aditivos, mas diferentes exemplos podem ter sido tomados em espaço ou tempo não iguais ou contagens de clientes e, portanto, o vetor de compensação é necessário para cada observação. Estou disposto a lidar com a programação disso, mas não estou muito familiarizado com a API, então aprecio sugestões, então faço isso certo e a coloco no lançamento.

Ok, estou trabalhando para implementar isso. Estou adicionando as três distribuições mencionadas acima e deslocamentos. Gostaria de receber feedback do público geral de sklearn sobre como implementar as compensações. Estou planejando adicionar um novo argumento à chamada GradientBoostedRegression 'offset=None' onde offset seria um objeto vetorial como com comprimento n (número de amostras). Minha principal pergunta é se devo adicionar deslocamentos a todas as funções de perda (Gaussian, Huber, Quantile), como é feito na implementação do GBM do R ou se devo apenas adicionar habilitar os deslocamentos para trabalhar com a família tweedie e lançar um aviso se você tentar usar offset com uma função de perda não suportada?

Eu estava mais pedindo casos de uso práticos, como conjuntos de dados ou publicações. Eu sei o que as distribuições fazem ;)

Provavelmente seria uma boa adição, embora eu não possa garantir que sua contribuição será mesclada. Provavelmente seria bom discuti-lo mais amplamente antes de entrar. A menos que você queira apenas implementá-lo para si mesmo e não se importe se o mesclarmos;)

Então, presumo que você esteja mais interessado em aumento de gradiente, não em modelos lineares?

ping @pprett @glouppe @arjoly

Estou interessado em integrá-lo ao redor, mas principalmente conjuntos de árvores
primeiro. De qualquer forma, eles são uma quantidade razoável de trabalho duplicado como floresta aleatória
e GBM têm ABC diferente para cada função de perda. Então eu posso apenas fazer
o trabalho uma vez e fazê-lo funcionar em ambos, infelizmente. Eu também posso obter alguns
conjuntos de dados. Como é o processo para mesclar esse processo
devo seguir. Sou novo em contribuir, então quero ter certeza de que está feito
certo. Mas como eu disse, o GBM trata as classes de perda independentemente de qualquer outra coisa
em sklearn para que minhas alterações no GBM pudessem facilmente ficar sozinhas. Eu só tenho que
edite o código no script .py.
Em 10 de dezembro de 2015 16:57, "Andreas Mueller" [email protected] escreveu:

Eu estava mais pedindo casos de uso práticos, como em conjuntos de dados ou
publicações. Eu sei o que as distribuições fazem ;)

Provavelmente seria uma boa adição, embora eu não possa garantir que
sua contribuição será mesclada. Provavelmente seria bom discutir isso
mais amplamente antes de entrar. A menos que você queira apenas implementá-lo para
você mesmo e não se importe se o mesclarmos ;)

Então, acho que você está mais interessado em aumento de gradiente, não linear
modelos?

ping @pprett https://github.com/pprett @glouppe
https://github.com/glouppe @arjoly https://github.com/arjoly


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment -163761067
.

Seria bom ter alguma contribuição de nossos especialistas em GBM que eu pingei acima, mas você também pode escrever para a lista de discussão perguntando se as pessoas estariam interessadas na adição.

você também planeja apoiar solucionadores coordenados com penalidades L1/L2
como _glmnet
?_

Alguma atualização para esse problema? Eu gostaria de ver uma regressão de Poisson adicionada em linear_models para não ter que me aventurar fora de usar sklearn . Se ninguém estiver trabalhando ativamente nisso, posso tentar implementá-lo.

ninguém AFAIK.

não hesite em experimentá-lo e compartilhar uma implementação WIP.

Eu ia trabalhar nisso e ainda vou. Se eu fizer isso embora eu
precisa de uma maneira limpa de adicionar deslocamentos à API. Eu estava pensando em adicionar um
offset kwarg e o padrão pode ser Nenhum e lançar um aviso se a perda
não é veneno. Eu uso principalmente poisson para modelagem de seguros onde o
offset é log (exposição ganha) eu sei de experimentação e distribuição
teoria de que, para dados de contagem esparsos, você obterá um modelo muito inferior
sem compensações. Atualmente, o modelo linear do R e o GBM suportam Poisson
com compensações. Então essa é a minha ferramenta atual. Eu gostaria de adicionar isso a
sklearn se outros quiserem que ele seja adicionado.
Em 1º de maio de 2016 04:03, "Alexandre Gramfort" [email protected]
escrevi:

ninguém AFAIK.

não hesite em experimentá-lo e compartilhar uma implementação WIP.


Você está recebendo isso porque foi o autor do tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment -216024458

@thenomemac Você tem uma implementação WIP que eu possa dar uma olhada?

Para deslocamentos, você não poderia simplesmente exigir que o usuário dividisse suas contagens pelo deslocamento/exposição para tornar o valor "y" uma taxa em vez de uma contagem (https://en.wikipedia.org/wiki/Poisson_regression#. 22Exposição.22_e_deslocamento)? O pacote GLM do R tem uma ótima interface para especificar modelos (incluindo especificar deslocamentos), mas não tenho certeza de como isso se encaixaria na API de modelos lineares existente.

@bjlkeng Ainda não tenho uma implementação WIP completa. Comecei um tempo atrás, então me distraí. Eu não acho que dividir por exposições para obter uma taxa de poisson seja uma derivação correta do algoritmo GBM para perda de poisson. O offset=log(exposição) no gradiente é um fator aditivo. Então, você está efetivamente dando mais peso às “áreas” com maior exposição. Não tenho 100% de certeza se você pode voltar ao gradiente correto em cada iteração de ajuste do aluno base (árvore) porque o esquema atual para passar pesos para o aluno da árvore é multiplicativo e não aditivo. Vou tentar digitar uma derivação matemática mais rigorosa do que estou me referindo. Posso dizer que na prática isso importa. Em conjuntos de dados do mundo real, modelei onde você esperaria que os dados de contagem fossem poisson, usando o gbm de R convergirá mais rápido e para um resultado melhor, porque está lidando com deslocamentos da maneira "matematicamente" correta. E outras implementações de gbm, como xgboost com uma função de perda de poisson, não podem modelar os dados também usando uma taxa de Poisson, conforme sugerido.

(à parte, encontrei o link para este problema em stats.stackexchange

statmodels GLM tem deslocamento e exposição (exposição apenas para link de log)

No mestre, agora há uma opção de rede elástica para GLM e alguns outros modelos, implementados via loop apython para descida de coordenadas (usa máxima verossimilhança genérica com deslocamento)

No master agora também há a família Tweedie para GLM. No entanto, ele não usa a função de perda de verossimilhança completa porque essa é uma soma infinita de termos e o cálculo de uma versão truncada é lento e as aproximações comumente usadas não são muito precisas em algum intervalo do espaço de parâmetros

Então, se você precisa de uma implementação de referência, statsmodels tem essas partes. Eu nunca ouvi falar ou olhei para GBM para GLM. Eu também não sei o suficiente sobre o código scikit-learn para dizer como ele se encaixaria.
)

@thenomemac Você está absolutamente certo sobre a alteração da função de perda devido à exposição, eu estava enganado. Na verdade, acredito que consegui. Eu tenho um WIP muito cedo (mais de apenas brincar): https://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py (confira a função _poisson_loss() ).

@josef-pkt Obrigado, eu olhei para a implementação do statsmodels, é realmente muito bom (exceto pela API, da qual não sou fã). Na verdade, é um pouco mais geral onde o modelo de "contagem" suporta outras regressões baseadas em contagem, como binomial negativa. A implementação do statsmodel já leva em consideração exposição e regularização (que é o que eu também estava procurando).

Dado que statsmodels tem uma implementação, você acha que ainda é valioso ter algo assim em sklearn ? Se assim for, posso tentar colocar um pouco mais de esforço para colocá-lo em uma forma utilizável. Estou muito ocupado com o trabalho, então não tive muito tempo.

Eu acho que isso ainda seria valioso.

@bjlkeng Obrigado pelo comentário! Você está interessado em aceitá-lo e fazer um Pull Request? Se não, eu posso tentar pegar esse problema e tentar fazer um PR... Primeiro para poisson e depois para gamma... @agramfort Tudo bem para você? :)

Ei @raghavrv , desculpe a demora na resposta. O trabalho ficou muito ocupado e também percebi que levaria mais tempo do que eu tinha tempo. Portanto, sinta-se à vontade para continuar. Eu daria uma olhada na implementação do statsmodel porque eles têm a maioria das funcionalidades que eu acho que você gostaria aqui.

@raghavrv Você começou a trabalhar nisso? Também posso contribuir para que tenhamos pelo menos regressão de Poisson no sklearn.

@btabibian @raghavrv Qual é o status disso? Eu preciso de uma implementação de regressão de Poisson para um projeto e estaria disposto a contribuir.

Por favor, vá em frente :) Eu não tive tempo para isso desculpe ...

Mesmo eu não tive tempo. Também tenho lutado com a API e como
integrar compensações. Eu poderia mostrar a matemática ou um exemplo de código em statsmodels.
Mas TLDR você precisa de deslocamentos se quiser usar a regressão de poisson com
exposições desiguais (área ou tempo), então você precisa de compensações. O modelo não
dê a ponderação correta se você apenas dividir suas contagens por exposições.

Em 1º de abril de 2017, 14h49, "(Venkat) Raghav (Rajagopalan)" <
[email protected]> escreveu:

Por favor, vá em frente :) Eu não tive tempo para isso desculpe ...


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-290939521 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AOeuWjVGf3-VmeasNHMLQAB1dnd4zuUQks5rrpw4gaJpZM4Gwd6-
.

Vou começar a pesquisar então. @thenomemac obrigado pela dica! Vou verificar a implementação do statsmodels para ver como eles lidam com a exposição.

Olá, há alguma atualização? Também seria possível adicionar uma probabilidade binomial negativa? Isso não deve fazer muita diferença para Poisson. Caso contrário, eu poderia olhar para isso..

Melhor,
Simão

Oi @dirmeier , infelizmente não. Mudei para um modelo Bayesiano hierárquico e nunca consegui implementar a regressão de Poisson.

@dirmeier , @jakobworldpeace há algum trabalho em andamento que você possa nos indicar? Eu também posso pular em dar uma olhada nisso?

Olá @NickHoernle ,
Atualmente estou usando R para regressão NB, porque não tenho tempo. Eu ficaria feliz se você quiser implementar isso :)

@NickHoernle Não há WIP, mas a implementação da regressão de Poisson do statsmodels deve ajudá-lo a começar.

Excelente. Vou começar a dar uma olhada nisso e ver onde chegamos.

Eu tenho trabalhado em GLMs aqui: https://github.com/madrury/py-glm.

Não pretendo que isso seja incorporado ao sklearn, é realmente para meus alunos usarem em sala de aula, mas gostaria de destacar o trabalho caso seja útil para quem trabalha com esse problema.

seu solver em um método newton que terá dificuldade em dimensionar em alta
dimensão. Também não suporta penalidades do tipo L1. Verifique também sua API
consistência com sklearn. O ajuste deve levar apenas X, y e sample_weights

para corrigir os problemas de escalabilidade, a primeira coisa a fazer é usar l-bfgs. Ver
nosso código de regressão logística

HTH

Como eu disse, meu objetivo não é consistência total com o sklearn, é apenas ter uma implementação simples que siga MuCullagh e Nelder e forneça algumas das ferramentas inferenciais (o que acredito que o coloca fora do escopo do sklearn). Ele deve ser usado em um ambiente de sala de aula em conjuntos de dados de tamanho médio. Eu só queria vincular o código aqui caso alguma ideia seja útil para quem trabalha nesse recurso para sklearn (e para obter um pouco de exposição, nunca é demais).

Não estou pensando em penalidades de L1 como escopo, para isso eu usaria apenas glmnet . L2 é simples o suficiente para incorporar no framework GLM clássico que eu fui em frente e adicionei.

Quanto ao método fit , vou arriscar um pequeno comentário aqui, espero que não esteja fora do lugar. A falta de offset como previsto para caber foi uma grande parte do motivo pelo qual o sklearn não pegou no meu último trabalho. Você realmente precisa disso para fazer uma modelagem de seguro adequada. Os reguladores esperam que os modelos Poisson e Tweedie se encaixem dessa maneira e podem ser bastante rígidos em suas expectativas.

obrigado por esclarecer a visão.

em relação ao offset é específico para os modelos Poisson e Tweedie?
se for um valor específico de amostra, pode ser um sample_prop no ajuste
parâmetros.
É apenas o max_iter ou tol que não depende de dados que deve estar em
a inicialização.

Tem que em comparação com # 9405?

@agramfort Você está certo sobre max_iter e tol, vou movê-los para o __init__.

Você tem uma referência para o que você quer dizer com sample_prop ?

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

ainda está sendo discutido qual é a melhor maneira de fazê-lo ...

Uma pequena nota sobre compensações: AFAIK, os pesos das amostras são suficientes para lidar com a exposição, ou seja, ajustar y=valores/exposição com amostra_peso=exposição deve fazer o trabalho e generalizar bem para outras distribuições e links além de Poisson com log-link.

@madrury Obrigado por compartilhar. Vou dar uma olhada na sua implementação e comparar com a minha.

As pessoas ainda estão interessadas nisso? Eu estaria interessado em contribuir.

Ainda estou interessado no recurso, caso alguém o adicione sklearn.

Na quinta-feira, 21 de dezembro de 2017 às 18h04, Jared Samet [email protected]
escrevi:

As pessoas ainda estão interessadas nisso? Eu estaria interessado em contribuir.


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-353479618 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AOeuWtvi4Um_o_ERuVe1ob86201G-ASdks5tCuP4gaJpZM4Gwd6-
.

@oracleofnj @thenomemac

Eu tenho uma implementação glm geral validada na minha biblioteca py-glm, mas não tenho planos de tentar mesclá-la no sklearn (tomei algumas decisões de design que a tornam incompatível com a do sklearn). Está configurado para que seja muito fácil adicionar outras famílias exponenciais.

Eu também tenho uma implementação completa e pura do glmnet python que suporta as mesmas famílias exponenciais na mesma biblioteca, mas fiquei preso em um bug e o coloquei de lado. Eu adoraria alguma ajuda para raciocinar sobre o bug, só preciso de alguma motivação para recuperá-lo.

@madrury Feliz por tentar ajudá-lo com esse bug.

Olá, alguma coisa construída para essas distribuições? Curioso sobre qualquer atualização. Obrigado.

Eu pessoalmente ficaria bem em fechar este problema para ajudar os contribuidores
foco. Razões:

  • A paisagem python mudou

  • statsmodels agora está muito mais maduro e inclui essas distribuições com
    ponderação de exposição adequada

  • implementações baseadas em jit via pytorch ou tensorflow facilitam
    implementar qualquer perda esotérica sem penalidade de desempenho ou pacote
    recompilação

Pensamentos?

estamos alocando recursos para ajudar com
https://github.com/scikit-learn/scikit-learn/pull/9405
e faça (pelo menos algumas partes) pousar no master. Deve ser abordado mais
os próximos meses.

Otimo trabalho !

No sábado, 13 de abril de 2019, 3h27 Alexandre Gramfort [email protected]
escrevi:

estamos alocando recursos para ajudar com
https://github.com/scikit-learn/scikit-learn/pull/9405
e faça (pelo menos algumas partes) pousar no master. Deve ser abordado mais
os próximos meses.


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-482784732 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AOeuWj8PD0nfltM7Acg12Pfhl4sG5n7Fks5vgYbogaJpZM4Gwd6-
.

Seria ótimo ter GLM no sciki-learn. Isso reduzirá a necessidade de ir para outros idiomas. Ansioso para isso.

Acordado. Vindo do mundo R, fiquei surpreso que o sklearn ainda não tivesse a funcionalidade GLM. Espero que em breve.

Vou adicionar outro voto para incluir GLM In sklearn. É uma classe central de modelos que é ensinada em programas de estatística de graduação. Além disso, o fato de haver uma seção "Modelos Lineares Generalizados" no manual do usuário que não inclui nenhuma discussão sobre funções de link ou distribuições de erros é surpreendente para mim.

@patrickspry Statsmodels tem uma boa implementação da maioria dos GLMs que um estudante de graduação aprenderia.

@patrickspry Há um PR bastante completo em https://github.com/scikit-learn/scikit-learn/pull/9405 e o trabalho está em andamento para mesclar essa funcionalidade.

Ah, fantástico! Obrigado pela atenção!

Algum cronograma estimado para mesclar o PR? Obrigado.

@Jiang-Li Veja aqui

Para modelos lineares, existe #14300. Então há a edição aberta #15123. Pessoalmente, gostaria muito de ver modelos baseados em árvores com funções de perda de tweedie.

Para modelos lineares #14300 agora é mesclado, embora recursos adicionais ainda possam ser adicionados https://github.com/scikit-learn/scikit-learn/pull/9405#issuecomment -594553953

Pessoalmente, gostaria muito de ver modelos baseados em árvores com funções de perda de tweedie.

Esse poderia realmente ser o próximo passo (por exemplo, https://github.com/scikit-learn/scikit-learn/issues/15123#issuecomment-542090766)

É impressionante ver o ótimo trabalho no sklearn 0.23, que inclui o Poisson, gamma e tweedie. Espero ver mais melhorias no futuro.
Lendo o Guia do Usuário, a regressão logística está fora da regressão linear generalizada. Talvez devesse haver pelo menos algumas palavras afirmando na seção de regressão linear generalizada que a regressão logística é um tipo de GLM e pode ser resolvida usando a mesma função de perda de desvio.

Parece que podemos fechar o problema agora que o #14300 foi mesclado?

Lendo o Guia do Usuário, a regressão logística está fora da regressão linear generalizada. Talvez devesse haver pelo menos algumas palavras afirmando na seção de regressão linear generalizada que a regressão logística é um tipo de GLM e pode ser resolvida usando a mesma função de perda de desvio.

Obrigado pelo feedback @magicmathmandarin ! Sim absolutamente. O PR original https://github.com/scikit-learn/scikit-learn/pull/9405 na verdade incluía o desvio de BinomialDistribution para regressão logística binária. A razão pela qual não incluímos isso no primeiro PR mesclado é que mesmo eles são de fato parte da mesma estrutura teórica, a implementação especializada de LogisticRegression no momento ainda é recomendada (melhor testada pelos usuários, lida com mais opções, por exemplo, multiclasse), e não queríamos confundir os usuários. Agora que está mesclado, concordo que essa parte pode ser melhor formulada.

Parece que podemos fechar o problema agora que o #14300 foi mesclado?

Certo. Há algumas discussões de acompanhamento em https://github.com/scikit-learn/scikit-learn/issues/16668 , https://github.com/scikit-learn/scikit-learn/pull/16692 e https: //github.com/scikit-learn/scikit-learn/issues/15123.

Esta página foi útil?
0 / 5 - 0 avaliações