Árvores de aprimoramento e ensacamento (XGBoost, LightGBM)

17

Existem muitas postagens de blog, vídeos do YouTube etc. sobre as idéias de empacotar ou aumentar árvores. Meu entendimento geral é que o pseudo-código para cada um é:

Ensacamento:

  1. Coletar N amostras aleatórias de x% das amostras e% de recursos
  2. Ajuste seu modelo (por exemplo, árvore de decisão) em cada um dos N
  3. Preveja com cada N
  4. Faça a média das previsões para obter a previsão final

Impulsionar:

  1. Ajuste seu modelo (por exemplo, árvore de decisão) aos seus dados
  2. Obter os resíduos
  3. Ajuste seu modelo aos resíduos
  4. Vá para 2 para N rodadas de reforço
  5. A previsão final é uma soma ponderada dos preditores sequenciais.

Levarei esclarecimentos ao meu entendimento acima, mas minha pergunta pretendida é a seguinte:

O XGBoost e o LightGBM possuem parâmetros que permitem o empacotamento. O aplicativo não é Bagging OR Boosting (que é o que cada post de blog fala), mas Bagging AND Boosting. Qual é o pseudo-código para onde e quando ocorre a ensacadeira e o reforço combinados?

Eu esperava que fosse "Árvores Impulsionadas em Saco", mas parece que é "Árvores Ensacadas em Impacto". A diferença parece substancial.

Árvores impulsionadas em saco:

  1. Coletar N amostras aleatórias de x% das amostras e% de recursos
  2. Ajuste árvores reforçadas em cada uma das N amostras
  3. Preveja com cada N
  4. Faça a média das previsões para obter a previsão final

Esta parece ser a melhor maneira de fazê-lo. Afinal, o risco de aumentar é o ajuste excessivo e o principal benefício do ensacamento é reduzir o ajuste excessivo; Ensacar vários modelos aprimorados parece uma ótima idéia.

No entanto, ao examinar, por exemplo, o scikit-learn gradient_boosting.py (que mostra a seleção de pacotes, mas não a seleção aleatória de recursos) e juntar algumas pequenas pepitas nas postagens sobre LightGBM e XGBoost, parece que XGBoost e LightGBM funcionam da seguinte maneira:

Árvores ensacadas reforçadas:

  1. Ajustar uma árvore de decisão aos seus dados
  2. Para i em N rodadas de reforço:
    • Obter os resíduos
    • se eu modificar bag_frequency == 0 (ou seja, bag a cada 5 rodadas):
      • Colete uma única amostra aleatória de x% das amostras e% de recursos; use esta amostra aleatória daqui para frente
    • ajuste a árvore aos resíduos
  3. A previsão final é uma soma ponderada dos preditores sequenciais.

Corrija meu entendimento aqui e preencha os detalhes. A árvore ensacada reforçada (com apenas uma árvore aleatória por bag_frequency) não parece tão poderosa quanto a árvore impulsionada ensacada.

Jonathan
fonte
2
+1 para uma pergunta interessante e muito bem formulada. E bem-vindo ao site.
mkt - Restabelece Monica
você precisa de um "cálculo do erro" para impulsionar. Feito errado que desmorona. Os pesos são críticos para o adaboost. Não é um resíduo bruto. ... Não estamos falando do gradiente estocástico necessário para aumentar, embora acelere as coisas.
EngrStudent - Restabelece Monica
Aqui está o ensacado. Em vez de uma nova árvore para cada etapa da série, você obtém uma nova floresta com produção média. Eugene Tuv e Kari Torkkola. jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
EngrStudent - Reinstate Monica
o ensacado impulsionado fará uma floresta de conjuntos de séries e levará a produção média. Pode envolver o ajuste excessivo que um conjunto em série (otimizado) pode produzir e fornecer uma saída mais robusta, mas o ganho não será enorme.
EngrStudent - Restabelece Monica

Respostas:

13

Ensacamento: pegue N amostras aleatórias de x% das amostras e% de recursos

As instâncias são subamostradas repetidamente no Bagging , mas não nos Recursos. ( RandomForests , XGBoost e CatBoost fazem os dois):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Inclua uma etapa de inicialização no seu pseudo código Boosting para se livrar da redundância:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Árvores impulsionadas em saco (como você chama) são certamente uma abordagem razoável, mas diferente do XGBoost ou CatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

O XGBoost e o CatBoost são baseados no Boosting e usam todos os dados de treinamento. Eles também implementam ensacamento por subamostragem uma vez em cada Iteração de reforço:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Se você deseja manter o modelo ajustado aos resíduos, isso seria equivalente a "ajustar o modelo aos resíduos de dados na amostra de inicialização ".


Observações adicionais :

Não há " melhor maneira de fazê-lo ", como você sugere (não há teorema do almoço grátis). "Árvores impulsionadas em saco" pode superar o XGBoost em determinados conjuntos de dados.

Coletar uma única amostra aleatória de x% das amostras

Esta linha é confusa. Onde você conseguiu isso?

se eu modificar bag_frequency == 0 (ou seja, bag a cada 5 rodadas):

Isso não deve ser mencionado no seu pseudo-código. Especialmente quando existem outros parâmetros mais importantes deixados de fora (como a taxa de aprendizado no aumento).

Laksan Nathan
fonte
(+1) Boa resposta! Para esclarecer: o OP está incorreto ao declarar " O XGBoost e o LightGBM possuem parâmetros que permitem o empacotamento "?
mkt - Restabelece Monica
Ambos permitem ensacamento: bagging_fraction no LightGBM e subamostra no XGBoost . Não tenho certeza, por que me referi ao CatBoost o tempo todo. Mas todos eles funcionam da mesma maneira em relação à questão.
Laksan Nathan
Meu erro, eu perdi a linha na sua resposta que menciona isso. Você poderia explicar a " subamostragem uma vez a cada Iteração otimizada "? Você quer dizer que em cada iteração otimizada, muitas subamostras são obtidas, as árvores são ajustadas a cada subamostra e, em seguida, a taxa de classificação incorreta é calculada com base nas árvores ensacadas e, finalmente, os pesos são atualizados? Em caso afirmativo, você poderia esclarecer isso em seu pseudocódigo?
mkt - Restabelece Monica
Poucas subamostras são desenhadas, apenas uma: em vez de ajustar o modelo a todas as instâncias ponderadas, o modelo é treinado em uma amostra de autoinicialização.
Laksan Nathan
Em relação a "Coletar uma única amostra aleatória de x% das amostras"; melhor seria "pegar uma única amostra de x% das linhas". Eu peguei isso daqui .
Jonathan