Gradient boosting

O gradient boosting é uma técnica de aprendizado de máquina para problemas de regressão e classificação, que produz um modelo de previsão na forma de um ensemble de modelos de previsão fracos, geralmente árvores de decisão. Ela constrói o modelo em etapas, como outros métodos de boosting, e os generaliza, permitindo a otimização de uma função de perda diferenciável arbitrária.

A ideia de gradient boosting originou-se na observação de Leo Breiman de que o boosting pode ser interpretado como um algoritmo de otimização em uma função de custo adequada.[1] Algoritmos explícitos de gradient boosting de regressão foram desenvolvidos posteriormente por Jerome H. Friedman,[2][3] simultaneamente com a perspectiva mais geral de gradient boosting funcional de Llew Mason, Jonathan Baxter, Peter Bartlett e Marcus Frean.[4][5] Os dois últimos trabalhos introduziram a visão dos algoritmos de boosting como algoritmos iterativos de descida de gradiente funcionais, ou seja, algoritmos que otimizam uma função de custo sobre um espaço de funções, escolhendo iterativamente uma função (hipótese fraca) que aponta na direção oposta do gradiente. Essa visão dos algoritmos de boosting em termos de gradientes funcionais levou ao desenvolvimento de algoritmos de boosting em muitas áreas do aprendizado de máquina e da estatística além da regressão e classificação.

Introdução informal

(Esta seção segue a exposição de gradient boosting por Li.[6] )

Como outros métodos de boosting, o gradient boosting combina "modelos de aprendizado" fracos em um único modelo de aprendizagem forte, de maneira iterativa. Isso pode ser explicado mais facilmente no contexto da regressão por mínimos quadrados, em que o objetivo é "ensinar" um modelo F {\displaystyle F} a prever valores da forma y ^ = F ( x ) {\displaystyle {\hat {y}}=F(x)} minimizando o erro médio quadrático 1 n i ( y ^ i y i ) 2 , {\displaystyle {\tfrac {1}{n}}\sum _{i}({\hat {y}}_{i}-y_{i})^{2},} em que o índice i {\displaystyle i} percorre algum conjunto de treinamento de tamanho n {\displaystyle n} dos valores reais da variável de saída y : {\displaystyle y:}

  • y ^ i = {\displaystyle {\hat {y}}_{i}=} o valor previsto F ( x ) {\displaystyle F(x)}
  • y i = {\displaystyle y_{i}=} o valor real
  • n {\displaystyle n} o número de amostras em y {\displaystyle y}

Agora, vamos considerar um algoritmo de gradient boosting com M {\displaystyle M} etapas. Em cada etapa m {\displaystyle m} ( 1 m M {\displaystyle 1\leq m\leq M} ) de gradient boosting, considere algum modelo imperfeito F m {\displaystyle F_{m}} (para um m {\displaystyle m} baixo, tal modelo pode simplesmente retornar y ^ i = y ¯ , {\displaystyle {\hat {y}}_{i}={\bar {y}},} isto é, a média de y {\displaystyle y} ) Para melhorar F m , {\displaystyle F_{m},} o algoritmo deve adicionar algum novo estimador, h m ( x ) . {\displaystyle h_{m}(x).} Portanto,

F m + 1 ( x ) = F m ( x ) + h m ( x ) = y {\displaystyle F_{m+1}(x)=F_{m}(x)+h_{m}(x)=y}

ou, equivalentemente,

h m ( x ) = y F m ( x ) . {\displaystyle h_{m}(x)=y-F_{m}(x).}

Portanto, o gradient boosting ajustará h ao resíduo y F m ( x ) . {\displaystyle y-F_{m}(x).} Como em outras variantes de boosting, cada F m + 1 {\displaystyle F_{m+1}} tenta corrigir os erros de seu antecessor F m . {\displaystyle F_{m}.} Uma generalização dessa ideia para funções de perda que não sejam a de erro quadrático, e para problemas de classificação e ordenação segue da observação de que os resíduos y F ( x ) {\displaystyle y-F(x)} para um determinado modelo são os opostos dos gradientes (em relação a F ( x ) {\displaystyle F(x)} ) da função de perda de erros quadráticos 1 2 ( y F ( x ) ) 2 . {\displaystyle {\frac {1}{2}}(y-F(x))^{2}.} Portanto, o gradient boosting é um algoritmo de descida de gradiente e generalizá-lo implica em "conectar" uma função de perda diferente e seu gradiente.

Algoritmo

Em muitos problemas de aprendizado supervisionado, há uma variável de saída y e um vetor de variáveis de entrada x descritas por meio de uma distribuição de probabilidade conjunta P ( x , y ) . {\displaystyle P(x,y).} Usando um conjunto de treinamento { ( x 1 , y 1 ) , , ( x n , y n ) } {\displaystyle \{(x_{1},y_{1}),\dots ,(x_{n},y_{n})\}} de valores conhecidos de x e valores correspondentes de y, o objetivo é encontrar uma aproximação F ^ ( x ) {\displaystyle {\hat {F}}(x)} para uma função F ( x ) {\displaystyle F(x)} que minimiza o valor esperado de alguma função de perda especificada L ( y , F ( x ) ) : {\displaystyle L(y,F(x)):}

F ^ = arg min F E x , y [ L ( y , F ( x ) ) ] . {\displaystyle {\hat {F}}={\underset {F}{\arg \min }}\,\mathbb {E} _{x,y}[L(y,F(x))].}

O método de gradient boosting assume um y com valores reais e busca uma aproximação F ^ ( x ) {\displaystyle {\hat {F}}(x)} na forma de uma soma ponderada de funções h i ( x ) {\displaystyle h_{i}(x)} de alguma classe H , {\displaystyle {\mathcal {H}},} chamada de modelos de aprendizagem básicos (ou fracos):

F ^ ( x ) = i = 1 M γ i h i ( x ) + const . {\displaystyle {\hat {F}}(x)=\sum _{i=1}^{M}\gamma _{i}h_{i}(x)+{\mbox{const}}.}

De acordo com o princípio de minimização de risco empírico, o método tenta encontrar uma aproximação F ^ ( x ) {\displaystyle {\hat {F}}(x)} que minimiza o valor médio da função de perda no conjunto de treinamento, ou seja, minimiza o risco empírico. Isso é feito começando com um modelo, consistindo de uma função constante F 0 ( x ) {\displaystyle F_{0}(x)} e expandindo-o gradualmente de maneira gananciosa:

F 0 ( x ) = arg min γ i = 1 n L ( y i , γ ) , {\displaystyle F_{0}(x)={\underset {\gamma }{\arg \min }}{\sum _{i=1}^{n}{L(y_{i},\gamma )}},} F m ( x ) = F m 1 ( x ) + a r g m i n h m H [ i = 1 n L ( y i , F m 1 ( x i ) + h m ( x i ) ) ] , {\displaystyle F_{m}(x)=F_{m-1}(x)+{\underset {h_{m}\in {\mathcal {H}}}{\operatorname {arg\,min} }}\left[{\sum _{i=1}^{n}{L(y_{i},F_{m-1}(x_{i})+h_{m}(x_{i}))}}\right],}

em que h m H {\displaystyle h_{m}\in {\mathcal {H}}} é uma função de modelo de aprendizagem básico.

Infelizmente, escolher a melhor função h em cada etapa para uma função de perda arbitrária L é, em geral, um problema de otimização computacionalmente inviável. Portanto, a abordagem se restringe a uma versão simplificada do problema.

A ideia é aplicar uma etapa de máximo declive a esse problema de minimização (descida de gradiente funcional). Se considerarmos o caso contínuo, ou seja, aquele em que H {\displaystyle {\mathcal {H}}} é o conjunto de funções diferenciáveis arbitrárias em R , {\displaystyle \mathbb {R} ,} atualizaríamos o modelo de acordo com as seguintes equações

F m ( x ) = F m 1 ( x ) γ m i = 1 n F m 1 L ( y i , F m 1 ( x i ) ) , {\displaystyle F_{m}(x)=F_{m-1}(x)-\gamma _{m}\sum _{i=1}^{n}{\nabla _{F_{m-1}}L(y_{i},F_{m-1}(x_{i}))},}

em que as derivadas são obtidas com relação às funções F i {\displaystyle F_{i}} para i { 1 , . . , m } {\displaystyle i\in \{1,..,m\}} e γ m {\displaystyle \gamma _{m}} é o comprimento do passo. No entanto, no caso discreto, ou seja, quando o H {\displaystyle {\mathcal {H}}} é finito, escolhemos a função candidata h mais próxima do gradiente de L para a qual o coeficiente γ pode então ser calculado com o auxílio da pesquisa linear nas equações acima. Observe que essa abordagem é uma heurística e, portanto, não produz uma solução exata para o problema em questão, e sim uma aproximação. Em pseudocódigo, o método genérico de gradient boosting é: [2][7]

Entrada: conjunto de treino { ( x i , y i ) } i = 1 n , {\displaystyle \{(x_{i},y_{i})\}_{i=1}^{n},} uma função de perda diferenciável L ( y , F ( x ) ) , {\displaystyle L(y,F(x)),} número de iteraçõesM.

Algoritmo:

  1. Inicialize o modelo com um valor constante:
    F 0 ( x ) = arg min γ i = 1 n L ( y i , γ ) . {\displaystyle F_{0}(x)={\underset {\gamma }{\arg \min }}\sum _{i=1}^{n}L(y_{i},\gamma ).}
  2. Para m = 1 até M:
    1. Calcule os chamados pseudo-resíduos:
      r i m = [ L ( y i , F ( x i ) ) F ( x i ) ] F ( x ) = F m 1 ( x ) for  i = 1 , , n . {\displaystyle r_{im}=-\left[{\frac {\partial L(y_{i},F(x_{i}))}{\partial F(x_{i})}}\right]_{F(x)=F_{m-1}(x)}\quad {\mbox{for }}i=1,\ldots ,n.}
    2. Ajuste um modelo de aprendizagem básico (ou fraco, tal como uma árvore) fechado sob escala h m ( x ) {\displaystyle h_{m}(x)} aos pseudo-resíduos, isto é, treine-o utilizando o conjunto de treino { ( x i , r i m ) } i = 1 n . {\displaystyle \{(x_{i},r_{im})\}_{i=1}^{n}.}
    3. Calcule o multiplicador γ m {\displaystyle \gamma _{m}} através da resolução de um problema de otimização unidimensional:
      γ m = a r g m i n γ i = 1 n L ( y i , F m 1 ( x i ) + γ h m ( x i ) ) . {\displaystyle \gamma _{m}={\underset {\gamma }{\operatorname {arg\,min} }}\sum _{i=1}^{n}L\left(y_{i},F_{m-1}(x_{i})+\gamma h_{m}(x_{i})\right).}
    4. Atualize o modelo:
      F m ( x ) = F m 1 ( x ) + γ m h m ( x ) . {\displaystyle F_{m}(x)=F_{m-1}(x)+\gamma _{m}h_{m}(x).}
  3. Saída F M ( x ) . {\displaystyle F_{M}(x).}

Gradient boosting em árvore

O gradient boosting normalmente é utilizado com árvores de decisão (especialmente árvores CART ) de um tamanho fixo como modelos de aprendizagem básicos. Para este caso especial, Friedman propõe uma modificação no método de gradient boosting que melhora a qualidade do ajuste de cada modelo básico.

O gradient boosting genérico na m- ésima etapa ajustaria uma uma árvore de decisão h m ( x ) {\displaystyle h_{m}(x)} a pseudo-resíduos. Seja J m {\displaystyle J_{m}} a sua quantidade de folhas. A árvore divide o espaço de entrada em J m {\displaystyle J_{m}} regiões disjuntas R 1 m , , R J m m {\displaystyle R_{1m},\ldots ,R_{J_{m}m}} e prevê um valor constante em cada região. Usando a notação do indicador, a saída de h m ( x ) {\displaystyle h_{m}(x)} para a entrada x pode ser escrita como a soma:

h m ( x ) = j = 1 J m b j m 1 R j m ( x ) , {\displaystyle h_{m}(x)=\sum _{j=1}^{J_{m}}b_{jm}\mathbf {1} _{R_{jm}}(x),}

onde b j m {\displaystyle b_{jm}} é o valor previsto na região R j m . {\displaystyle R_{jm}.} [8]

Então os coeficientes b j m {\displaystyle b_{jm}} são multiplicados por algum valor γ m , {\displaystyle \gamma _{m},} escolhido usando a pesquisa linear para minimizar a função de perda e o modelo é atualizado da seguinte forma:

F m ( x ) = F m 1 ( x ) + γ m h m ( x ) , γ m = a r g m i n γ i = 1 n L ( y i , F m 1 ( x i ) + γ h m ( x i ) ) . {\displaystyle F_{m}(x)=F_{m-1}(x)+\gamma _{m}h_{m}(x),\quad \gamma _{m}={\underset {\gamma }{\operatorname {arg\,min} }}\sum _{i=1}^{n}L(y_{i},F_{m-1}(x_{i})+\gamma h_{m}(x_{i})).}

Friedman propõe modificar esse algoritmo para escolher um valores ótimos γ j m {\displaystyle \gamma _{jm}} separados para cada uma das regiões da árvore, em vez de um único γ m {\displaystyle \gamma _{m}} para a árvore inteira. Ele chama o algoritmo modificado de "TreeBoost". Os coeficientes b j m {\displaystyle b_{jm}} do procedimento de ajuste de árvore podem então ser simplesmente descartados e a regra de atualização do modelo se torna:

F m ( x ) = F m 1 ( x ) + j = 1 J m γ j m 1 R j m ( x ) , γ j m = a r g m i n γ x i R j m L ( y i , F m 1 ( x i ) + γ ) . {\displaystyle F_{m}(x)=F_{m-1}(x)+\sum _{j=1}^{J_{m}}\gamma _{jm}\mathbf {1} _{R_{jm}}(x),\quad \gamma _{jm}={\underset {\gamma }{\operatorname {arg\,min} }}\sum _{x_{i}\in R_{jm}}L(y_{i},F_{m-1}(x_{i})+\gamma ).}

Tamanho das árvores

O valor de J , {\displaystyle J,} que é o número de nós terminais nas árvores, é o parâmetro do método que pode ser ajustado para um conjunto de dados disponível. Ele controla o nível máximo permitido de interação entre variáveis no modelo. Com J = 2 {\displaystyle J=2} (stumps de decisão), nenhuma interação entre variáveis é permitida. Com J = 3 {\displaystyle J=3} o modelo pode incluir efeitos da interação entre até duas variáveis e assim por diante.

Hastie et al.[7] comenta que normalmente 4 J 8 {\displaystyle 4\leq J\leq 8} funciona bem para o boosting e os resultados são bastante insensíveis à escolha de J {\displaystyle J} nesta faixa, J = 2 {\displaystyle J=2} é insuficiente para muitas aplicações e é improvável a necessidade de J > 10. {\displaystyle J>10.}

Regularização

Um ajuste excessivo ao conjunto de treinamento pode levar à degradação da capacidade de generalização do modelo. Várias técnicas de regularização reduzem esse efeito de sobreajuste restringindo o procedimento de ajuste.

Um parâmetro de regularização natural é o número M de iterações de gradient boosting (ou seja, o número de árvores no modelo quando o modelo de aprendizagem básico é uma árvore de decisão). Aumentar M reduz o erro no conjunto de treinamento, mas configurá-lo alto demais pode levar ao sobreajuste. Um valor ideal de M frequentemente é selecionado pelo monitoramento do erro de previsão em um conjunto de dados de validação separado. Além deste controle do valor de M, são utilizadas várias outras técnicas de regularização.

Outro parâmetro de regularização é a profundidade das árvores. Quanto maior é esse valor, maior é a probabilidade de o modelo superestimar os dados de treinamento.

Encolhimento

Uma parte importante do método de gradient boosting é a regularização por encolhimento, que consiste em modificar a regra de atualização da seguinte maneira:

F m ( x ) = F m 1 ( x ) + ν γ m h m ( x ) , 0 < ν 1 , {\displaystyle F_{m}(x)=F_{m-1}(x)+\nu \cdot \gamma _{m}h_{m}(x),\quad 0<\nu \leq 1,}

em que o parâmetro ν {\displaystyle \nu } é chamado de "taxa de aprendizado".

Empiricamente, verificou-se que o uso de taxas de aprendizado pequenas (tais como ν < 0.1 {\displaystyle \nu <0.1} ) produz melhorias drásticas na capacidade de generalização dos modelos em relação ao gradient boosting sem encolhimento ( ν = 1 {\displaystyle \nu =1} ) [7] No entanto, isso tem como preço o aumento do tempo computacional durante o treinamento e as consultas: uma taxa de aprendizado mais baixa exige mais iterações.

Gradient boosting estocástico

Pouco depois da introdução do gradient boosting, Friedman propôs uma pequena modificação no algoritmo, motivada pelo método de agregação de bootstrap ("bagging") de Breiman.[3] Especificamente, ele propôs que, a cada iteração do algoritmo, um modelo de aprendizagem básico deveria ser ajustado a uma subamostra do conjunto de treinamento extraída aleatoriamente sem substituição.[9] Friedman observou uma melhoria substancial na precisão do gradient boosting com esta modificação.

O tamanho da subamostra é uma fração constante f {\displaystyle f} do tamanho do conjunto de treinamento. Quando f = 1 , {\displaystyle f=1,} o algoritmo é determinístico e idêntico ao descrito acima. Valores menores de f {\displaystyle f} introduzem aleatoriedade no algoritmo e ajudam a evitar o sobreajuste, agindo como um tipo de regularização. O algoritmo também se torna mais rápido, porque as árvores de regressão precisam ser ajustadas a conjuntos de dados menores a cada iteração. Friedman[3] obteve que 0.5 f 0.8 {\displaystyle 0.5\leq f\leq 0.8} leva a bons resultados para conjuntos de treinamento de tamanho pequeno e moderado. Portanto, f {\displaystyle f} normalmente é definido como 0,5, o que significa que metade do conjunto de treinamento é usada para criar cada modelo de aprendizado básico.

Além disso, como na bagging, a subamostragem permite que seja definida um erro fora da bolsa da melhoria do desempenho das previsões, avaliando as previsões nas observações que não foram usadas na construção do próximo modelo de aprendizado básico. As estimativas fora da bolsa ajudam a evitar a necessidade de um conjunto de dados de validação independente, mas geralmente subestimam a melhoria real do desempenho e o número ideal de iterações.[10][11]

Número de observações em folhas

As implementações de gradient boosting de árvore geralmente também usam regularização limitando o número mínimo de observações nos nós terminais das árvores (esse parâmetro é chamado n.minobsinnode no pacote R gbm [10] ). Isso é usado no processo de construção da árvore ignorando quaisquer divisões que levem a nós que contêm menos que esse número de instâncias do conjunto de treinamento.

A imposição desse limite ajuda a reduzir a variância nas previsões nas folhas.

Penalização da complexidade da árvore

Outra técnica de regularização útil para gradient boosting de árvores é penalizar a complexidade do modelo aprendido.[12] A complexidade do modelo pode ser definida como o número proporcional de folhas nas árvores aprendidas. A otimização conjunta da perda e da complexidade do modelo corresponde a um algoritmo pós-poda para remover ramificações que falham em reduzir a perda por um limite. Outros tipos de regularização, como uma penalidade 2 {\displaystyle \ell _{2}} nos valores das folhas, também podem ser adicionadas para evitar sobreajustes.

Uso

Gradient boosting pode ser usado no campo da aprendizagem da classificação. Os mecanismos comerciais de busca na web Yahoo[13] e Yandex[14] usam variantes de gradient boosting em seus mecanismos de classificação aprendidos por máquina.

Nomes

O método é conhecido por vários nomes. Friedman introduziu sua técnica de regressão como uma "Gradient Boosting Machine" (GBM).[2] Mason, Baxter et al. descreveram a classe abstrata generalizada de algoritmos como "gradient boosting funcional".[4][5] Friedman et al. descreveram um avanço de modelos de gradient boosting como árvores de regressão aditiva múltipla (MART);[15] Elith et al. descrevem essa abordagem como "Boosted Regression Trees" (BRT).[16]

Uma implementação popular de código aberto para R chama o método de de "Generalized Boosting Model",[10] no entanto os pacotes que expandem esse trabalho usam o BRT.[17] As implementações comerciais da Salford Systems usam os nomes "Multiple Additive Regression Trees" (MART) e TreeNet, ambos com marca registrada.[carece de fontes?]

Ver também

  • AdaBoost
  • Floresta aleatória
  • XGBoost
  • LightGBM
  • CatBoost
  • Aprendizado em árvore de decisão

Referências

  1. «Arcing The Edge» (PDF). Technical Report 486 
  2. a b c «Greedy Function Approximation: A Gradient Boosting Machine» (PDF) 
  3. a b c «Stochastic Gradient Boosting» (PDF) 
  4. a b S.A. Solla and T.K. Leen and K. Müller, ed. (1999). Boosting Algorithms as Gradient Descent (PDF). pp. 512–518 
  5. a b «Boosting Algorithms as Gradient Descent in Function Space» (PDF) 
  6. Cheng Li. «A Gentle Introduction to Gradient Boosting» (PDF) 
  7. a b c Hastie, T.; Tibshirani, R.; Friedman, J. H. (2009). «10. Boosting and Additive Trees». The Elements of Statistical Learning. Springer 2nd ed. New York: [s.n.] pp. 337–384. ISBN 978-0-387-84857-0 
  8. No caso de árvores CART usuais, as árvores são ajustadas utilizando a função de perda de mínimos quadrados, e então o coeficiente b j m {\displaystyle b_{jm}} para a região R j m {\displaystyle R_{jm}} é igual a apenas o valor da variável de saída, ponderada sobre otas as instâncias de treino em R j m . {\displaystyle R_{jm}.}
  9. Note que isso é diferente de bagging, que faz uma amostragem com substituição por utilizar amostras do mesmo tamanho do conjunto de traino.
  10. a b c Ridgeway, Greg (2007). Generalized Boosted Models: A guide to the gbm package.
  11. Learn Gradient Boosting Algorithm for better predictions (with codes in R)
  12. Tianqi Chen. Introduction to Boosted Trees
  13. Cossock, David and Zhang, Tong (2008). Statistical Analysis of Bayes Optimal Subset Ranking Arquivado em 2010-08-07 no Wayback Machine, page 14.
  14. Yandex corporate blog entry about new ranking model "Snezhinsk" (in Russian)
  15. «Multiple Additive Regression Trees with Application in Epidemiology». Statistics in Medicine. 22: 1365–1381. 2003. PMID 12704603. doi:10.1002/sim.1501 
  16. «A working guide to boosted regression trees». Journal of Animal Ecology. 77: 802–813. 2008. PMID 18397250. doi:10.1111/j.1365-2656.2008.01390.x 
  17. «Boosted Regression Trees for ecological modeling» (PDF). CRAN 

Leitura complementar

  • Boehmke, Bradley; Greenwell, Brandon (2019). «Gradient Boosting». Hands-On Machine Learning with R. Chapman & Hall. [S.l.: s.n.] pp. 221–245. ISBN 978-1-138-49568-5 

Ligações externas

  • Como explicar o gradient boosting
  • Árvores de regressão com gradient boosting
  • Portal das tecnologias de informação