Discussão sobre overfit no xgboost

20

Minha configuração é a seguinte:

Estou seguindo as diretrizes em "Modelagem Preditiva Aplicada". Assim, filtramos os recursos correlatos e terminamos com o seguinte:

  • 4900 pontos de dados no conjunto de treinamento e 1600 pontos de dados no conjunto de teste.
  • Eu tenho 26 recursos e o alvo é uma variável contínua.

Aplico 5 vezes a validação cruzada para treinar modelos usando o caretpacote. Quando aplico um modelo MARS, recebo um erro absoluto médio (MAE) de aproximadamente 4 no conjunto de treinamento e no conjunto de testes.

No entanto, aplicando o xgboost (o algoritmo em árvore ou o linear), recebo algo como 0,32 (!) No conjunto de treinamento e 2,4 no conjunto de testes.

Portanto, se o erro de teste for 8 vezes o erro de treinamento, eu diria: Eu super ajustei os dados de treinamento. Ainda assim, recebo um erro menor no teste de qualquer maneira.

Eu uso os seguintes parâmetros no xgboost:

  • nrounds = 1000e eta = 0.01(aumentar nrounds e diminuir eta pode ajudar, mas a memória fica insuficiente e o tempo de execução é muito longo)
  • max_depth = 16: se eu comparar outras postagens e o padrão 6, isso parecerá grande, mas o problema é bastante complexo - talvez 16 não seja muito grande nesse caso.
  • colsample_bytree = 0.7, subsample = 0.8e min_child_weight = 5: fazendo isso, tento reduzir o excesso de ajuste.

Se eu reduzir max_depth, o trem e o erro de teste se aproximam, mas ainda existe uma grande lacuna e o erro de teste é maior (um pouco acima de 3).

Usando o booster linear, obtenho o mesmo erro de trem e teste nos parâmetros ideais:

  • lambda = 90 e `alpha = 0: encontrado pela validação cruzada, o lambda deve evitar o super ajuste.
  • colsample_bytree = 0.8, subsample = 0.8e min_child_weight = 5: fazendo isso, tento reduzir o excesso de ajuste.

Meu sentimento é que o xgboost ainda se superaprende - mas o erro de treinamento e até onde eu posso ver no teste em tempo real (eu usei os modelos xgboost e um conjunto deles na realidade por 4 dias) parece ok (o erro é maior que o erro de teste, mas há mais incerteza na vida real sobre a previsão de recursos e outras variáveis).

O que você acha: posso aceitar o excesso de ajuste se (se isso for possível) o desempenho na vida real for superior? O xgboost na minha configuração tende a se ajustar demais?

Ric
fonte

Respostas:

34

O ajuste excessivo é tão ruim que você não deve escolher um modelo que se ajuste demais, mesmo que o erro de teste seja menor? Não. Mas você deve ter uma justificativa para escolhê-lo.

Esse comportamento não está restrito ao XGBoost. É um fio comum entre todas as técnicas de aprendizado de máquina; encontrar o tradeoff certo entre underfitting e overfitting. A definição formal é o tradeoff de variação de polarização (Wikipedia) .

A troca de viés e variância

A seguir, é uma simplificação da compensação de desvios de polarização, para ajudar a justificar a escolha do seu modelo.

  • Dizemos que um modelo tem um viés alto se não for capaz de usar totalmente as informações nos dados. É muito dependente de informações gerais, como o caso mais frequente, a média da resposta ou alguns recursos avançados. O viés pode vir de suposições erradas, por exemplo, assumindo que as variáveis ​​são normalmente distribuídas ou que o modelo é linear.

  • Dizemos que um modelo tem alta variação se estiver usando muita informação dos dados. Ele se baseia em informações que são reveladoras apenas no conjunto de treinamento que lhe foi apresentado, o que não é generalizado o suficiente. Normalmente, o modelo mudará muito se você alterar o conjunto de treinamento, daí o nome "alta variação".

Essas definições são muito semelhantes às definições de underfitting e overfitting. No entanto, essas definições são muitas vezes simplificadas demais para serem opostas, como em

  • O modelo será insuficiente se os erros de treinamento e teste forem altos. Isso significa que o modelo é muito simples.
  • O modelo será sobrescrito se o erro de teste for maior que o erro de treinamento. Isso significa que o modelo é muito complexo.

Naturalmente, essas simplificações são úteis, pois ajudam a escolher a complexidade certa do modelo. Mas eles ignoram um ponto importante, o fato de que (quase) todo modelo tem um componente de viés e de variância. A descrição de underfitting / overfitting diz que você tem muito viés / muita variação, mas você (quase) sempre tem os dois .

Se você deseja obter mais informações sobre a troca de desvio e desvio, elas oferecem muitas visualizações úteis e bons recursos disponíveis no google. Todo livro didático de aprendizado de máquina terá uma seção sobre a troca de polarização e desvio, aqui estão algumas

  • Uma introdução ao aprendizado estatístico e Elementos do aprendizado estatístico (disponíveis aqui) .
  • Reconhecimento de Padrões e Aprendizado de Máquina, de Christopher Bishop.
  • Aprendizado de máquina: uma perspectiva probabilística, de Kevin Murphy.

Além disso, um bom post no blog que me ajudou a entender é o entendimento de Scott Fortmann-Roe sobre o tradeoff de variação .

Aplicação ao seu problema

Então você tem dois modelos,

Trem MAETeste MAEMARS4.04.0Baixa variação, maior viés,XGBoost0,32.4Maior variação, menor viés,

e você precisa escolher um. Para fazer isso, você precisa definir o que é um modelo melhor. Os parâmetros que devem ser incluídos em suas decisões são a complexidade e o desempenho do modelo.

  • Quantas "unidades" de complexidade você deseja trocar por uma "unidade" de desempenho?
    • Mais complexidade está associada a maior variação. Se você deseja que seu modelo generalize bem em um conjunto de dados um pouco diferente daquele em que você treinou, você deve procurar menos complexidade.
    • Se você deseja um modelo que possa entender facilmente, pode fazê-lo com o custo de desempenho, reduzindo a complexidade do modelo.
    • Se você está buscando o melhor desempenho em um conjunto de dados que você sabe que vem do mesmo processo generativo que seu conjunto de treinamento, pode manipular a complexidade para otimizar seu erro de teste e usá-lo como uma métrica. Isso acontece quando o seu conjunto de treinamento é amostrado aleatoriamente em um conjunto maior e seu modelo será aplicado nesse conjunto. É o caso da maioria das competições do Kaggle, por exemplo.

O objetivo aqui não é encontrar um modelo que "não se ajuste demais". É encontrar o modelo que tem a melhor troca de desvio e desvio. Nesse caso, eu argumentaria que a redução no viés realizada pelo modelo XGBoost é boa o suficiente para justificar o aumento da variação.

O que você pode fazer

No entanto, você provavelmente pode fazer melhor ajustando os hiperparâmetros.

  • Aumentar o número de rodadas e reduzir a taxa de aprendizado é uma possibilidade. Algo "estranho" sobre o aumento de gradiente é que executá-lo bem além do ponto em que o erro de treinamento atingiu zero parece ainda melhorar o erro de teste (conforme discutido aqui: É mais profundo melhor quando superficial é bom? ). Você pode tentar treinar seu modelo um pouco mais no conjunto de dados depois de definir os outros parâmetros,

  • 1/214. Pode ser um jargão, mas se seus recursos tiverem um grau de interação de 3 (aproximadamente: uma combinação de 4 recursos não é mais poderosa do que uma combinação de 3 desses recursos + o quarto), então o crescimento de árvores de tamanho maior que 3 é prejudicial. Duas árvores de profundidade três terão mais poder de generalização do que uma árvore de profundidade quatro. Esse é um conceito bastante complicado e não vou abordá-lo agora, mas você pode verificar esta coleção de papéis para começar. Além disso, observe que as árvores profundas levam a uma alta variação!

  • O uso de subamostragem, conhecido como ensacamento , é ótimo para reduzir a variação. Se suas árvores individuais tiverem uma alta variação, o empacotamento fará a média das árvores e a média terá menos variação do que as árvores individuais. Se, depois de ajustar a profundidade de suas árvores, você ainda encontrar alta variação, tente aumentar a subamostragem (ou seja, reduza a fração dos dados usados). A subamostragem do espaço de recurso também atinge esse objetivo.

Winks
fonte
1
Não se deve comentar dizendo "obrigado", mas por esta resposta longa e interessante eu gostaria de dizer "obrigado". Eu já tinha algum conhecimento sobre algumas das coisas que você escreve, mas isso foi realmente bem organizado. Vou examinar algumas de suas referências e cultivar novas árvores e talvez voltar com um comentário. Por enquanto: obrigado! Ótimo!
Ric
O link para a página de interações stat.columbia.edu/~jakulin/Int é realmente ótimo!
Ric
Segui o seu conselho e limitei a profundidade das árvores a 3, mas tomei entre 1200 e os resultados são ótimos: cálculos muito rápidos, diferença entre trem e teste reduzida e ainda em um bom nível. O resto da história é aqui: stats.stackexchange.com/questions/205858/...
Ric