Xgboost: Ambiguidade de abordagem (documentação)

Criado em 25 nov. 2015  ·  3Comentários  ·  Fonte: dmlc/xgboost

Olá, estou tentando entender a abordagem xgboost para treinamento de modelos. Com isso quero dizer o seguinte. Posso usar Booster e invocar xgb.train ou posso usar APIs sklearn para usar Classifier / Regressor. O problema é que na abordagem anterior (de acordo com a documentação do xgboost) eu preciso especificar o número de iterações de aumento e não especificar qualquer número de árvores, enquanto na posterior eu especifico o número de árvores aumentadas para caber, mas não tenho nenhuma opção para especificar o número de iterações otimizadas. O número de iterações de reforço é o número de estimadores? Alguém pode esclarecer isso?

Se eu ler o código corretamente, as APIs sklearn usam reforço interno, então posso atribuir clf._Booster ao meu xgb.train, onde n_estimators é igual ao número de rodadas reforçadas. E, eu não preciso chamar clf.fit se tal atribuição foi feita. Estou certo? Nesse caso, a documentação pode ser ajustada para dizer explicitamente que n_estimators é o que num_rounds usado para xgb.train.

Seria bom ter uma documentação que explicasse exatamente a relação entre a abordagem de reforço de baixo nível e APIs sklearn, eu entendo que mais tarde chamaremos a anterior, mas seria bom entender como isso é feito e esclarecer isso na documentação para evitar confusão no final -Comercial.

Comentários muito úteis

Oi vladimir,

Boosting, em geral, é um meta-algoritmo que iterativamente (ou em "rodadas") treina uma sequência de aprendizes simples / fracos (ou estimadores) de forma que toda a combinação tenha um desempenho melhor. Pode haver vários tipos de alunos fracos, não apenas árvores. Por exemplo, xgboost tem árvores e opções de modelo linear (generalizado). Curiosamente, esses alunos fracos no xgboost são chamados de "boosters" e todo o modelo de combinação é chamado de "aluno". Isso me deixou um pouco perplexo quando eu estava inicialmente lendo os documentos e o código do xgboost, já que era uma espécie de reverso para minha própria impressão mental da terminologia.

Embora seja bom ter uma nomenclatura consistente entre diferentes projetos relacionados ao mesmo assunto e ter uma documentação de cross-link consistente de alta qualidade, nem sempre é viável ou fácil de manter, especialmente em projetos de código aberto. Usuários novatos tendem a usar principalmente uma única interface. Os usuários que estão bem familiarizados com o assunto seriam facilmente capazes de mapear as semelhanças. E quem quer que se importe com os detalhes de baixo nível, geralmente se preocupa o suficiente para ler o código.

Quanto à sua pergunta específica, você está lendo certo que o parâmetro n_estimators no código do wrapper sklearn [1] mapeia para num_boost_round em train [2]. No entanto, por que, como um usuário final, você deseja hackear um objeto de invólucro sklearn dessa forma? Para fazer isso de maneira controlável, você teria que conhecer bem o código do wrapper.

[1] https://github.com/dmlc/xgboost/blob/2859c190cd0d168df25e2a7ea2b1fd5211ce94f0/python-package/xgboost/sklearn.py#L185
[2] https://github.com/dmlc/xgboost/blob/83e61bf99ec7d01607867b4e281da283230883b1/python-package/xgboost/training.py#L12

Todos 3 comentários

Oi vladimir,

Boosting, em geral, é um meta-algoritmo que iterativamente (ou em "rodadas") treina uma sequência de aprendizes simples / fracos (ou estimadores) de forma que toda a combinação tenha um desempenho melhor. Pode haver vários tipos de alunos fracos, não apenas árvores. Por exemplo, xgboost tem árvores e opções de modelo linear (generalizado). Curiosamente, esses alunos fracos no xgboost são chamados de "boosters" e todo o modelo de combinação é chamado de "aluno". Isso me deixou um pouco perplexo quando eu estava inicialmente lendo os documentos e o código do xgboost, já que era uma espécie de reverso para minha própria impressão mental da terminologia.

Embora seja bom ter uma nomenclatura consistente entre diferentes projetos relacionados ao mesmo assunto e ter uma documentação de cross-link consistente de alta qualidade, nem sempre é viável ou fácil de manter, especialmente em projetos de código aberto. Usuários novatos tendem a usar principalmente uma única interface. Os usuários que estão bem familiarizados com o assunto seriam facilmente capazes de mapear as semelhanças. E quem quer que se importe com os detalhes de baixo nível, geralmente se preocupa o suficiente para ler o código.

Quanto à sua pergunta específica, você está lendo certo que o parâmetro n_estimators no código do wrapper sklearn [1] mapeia para num_boost_round em train [2]. No entanto, por que, como um usuário final, você deseja hackear um objeto de invólucro sklearn dessa forma? Para fazer isso de maneira controlável, você teria que conhecer bem o código do wrapper.

[1] https://github.com/dmlc/xgboost/blob/2859c190cd0d168df25e2a7ea2b1fd5211ce94f0/python-package/xgboost/sklearn.py#L185
[2] https://github.com/dmlc/xgboost/blob/83e61bf99ec7d01607867b4e281da283230883b1/python-package/xgboost/training.py#L12

existem os mesmos problemas para R?

Na quinta-feira, 26 de novembro de 2015 às 11h39, Vadim Khotilovich <
notificaçõ[email protected]> escreveu:

Oi vladimir,

Boosting, em geral, é um meta-algoritmo que iterativamente (ou em
"rodadas") treina uma sequência de aprendizes simples / fracos (ou estimadores) em tais
uma forma de melhorar o desempenho de toda a combinação. Pode haver vários
tipos de alunos fracos, não apenas árvores. Por exemplo, xgboost tem árvores e
opções de modelo linear (generalizado). Curiosamente, esses alunos fracos em
xgboost são referidos como "boosters", e todo o modelo de combinação é
referido como um "aluno". Isso me deixou um pouco perplexo quando estava inicialmente
lendo os documentos e o código do xgboost, pois era uma espécie de reverso do meu próprio pensamento
impressão da terminologia.

Embora fosse bom ter uma nomenclatura consistente entre diferentes
projetos relacionados ao mesmo assunto e ter alta consistência
documentação de cross-link de qualidade, nem sempre é viável ou fácil
sustentável, especialmente em projetos de código aberto. Usuários novatos tendem a
geralmente usam uma única interface. Usuários que estão bem familiarizados com o assunto
a matéria seria facilmente capaz de mapear as semelhanças. E quem se importa
sobre detalhes de baixo nível, eles geralmente se preocupam o suficiente para ler o código.

Quanto à sua pergunta específica, você está lendo certo que os n_estimators
parâmetro no código do wrapper sklearn [1] mapeia para num_boost_round dentro de
trem [2]. No entanto, por que, como um usuário final, você deseja hackear um sklearn
objeto de invólucro dessa forma? Para fazer isso de uma maneira controlável, você teria
para conhecer bem o código do wrapper.

[1]
https://github.com/dmlc/xgboost/blob/2859c190cd0d168df25e2a7ea2b1fd5211ce94f0/python-package/xgboost/sklearn.py#L185
[2]
https://github.com/dmlc/xgboost/blob/83e61bf99ec7d01607867b4e281da283230883b1/python-package/xgboost/training.py#L12

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/dmlc/xgboost/issues/651#issuecomment -159956213.

@khotilov , obrigado pela explicação. É suficiente para minhas necessidades e fecharei o ticket.

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