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:
- Coletar N amostras aleatórias de x% das amostras e% de recursos
- Ajuste seu modelo (por exemplo, árvore de decisão) em cada um dos N
- Preveja com cada N
- Faça a média das previsões para obter a previsão final
Impulsionar:
- Ajuste seu modelo (por exemplo, árvore de decisão) aos seus dados
- Obter os resíduos
- Ajuste seu modelo aos resíduos
- Vá para 2 para N rodadas de reforço
- 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:
- Coletar N amostras aleatórias de x% das amostras e% de recursos
- Ajuste árvores reforçadas em cada uma das N amostras
- Preveja com cada N
- 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:
- Ajustar uma árvore de decisão aos seus dados
- 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
- 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.
Respostas:
As instâncias são subamostradas repetidamente no Bagging , mas não nos Recursos. ( RandomForests , XGBoost e CatBoost fazem os dois):
Inclua uma etapa de inicialização no seu pseudo código Boosting para se livrar da redundância:
Árvores impulsionadas em saco (como você chama) são certamente uma abordagem razoável, mas diferente do XGBoost ou CatBoost :
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:
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.
Esta linha é confusa. Onde você conseguiu isso?
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).
fonte