Métodos de conjunto: o campeão de aprendizado de máquina Kaggle
Publicados: 2022-03-11O provérbio “Duas cabeças pensam melhor que uma” ganha um novo significado quando se trata de conjuntos de aprendizado de máquina. Os métodos de conjunto são algumas das famílias de ML mais condecoradas nas competições Kaggle, onde muitas vezes ganham concursos com seus resultados impressionantes.
Mas foi um século antes de Kaggle quando o estatístico Sir Francis Galton notou a potência da inteligência agregada. Ele se deparou com uma competição em uma feira de gado onde os participantes tinham que adivinhar o peso de um boi. Oitocentas pessoas deram palpites, mas seus níveis de habilidade variavam: fazendeiros e açougueiros adivinhavam ao lado de moradores da cidade que nunca tinham visto um boi de perto, então Galton achou que o palpite médio seria bastante errado.
Descobriu-se que a média dos palpites da multidão estava errada em menos de uma libra (< 0,1%). No entanto, mesmo as melhores previsões individuais estavam bem erradas.
Como poderia ser? O que tornou possível um resultado tão inesperado?
O que torna os conjuntos de máquinas tão eficazes
O evento que forçou Galton a questionar suas crenças também ilustra o que torna os ensembles tão poderosos: se você tiver modelos diferentes e independentes, treinados usando diferentes partes de dados para o mesmo problema, eles funcionarão melhor juntos do que individualmente. A razão? Cada modelo aprenderá uma parte diferente do conceito. Portanto, cada modelo produzirá resultados e erros válidos com base em seu “conhecimento”.
Mas o mais interessante é que cada parte verdadeira complementará as outras enquanto os erros se anulam:
Você precisa treinar modelos com alta variação (como árvores de decisão) em subconjuntos distintos de dados. Essa variação adicionada significa que cada modelo supera os dados diferentes, mas quando combinados, a variação desaparece, como por mágica. Isso cria um modelo novo e mais robusto.
Assim como no caso de Galton, quando todos os dados de todas as fontes são combinados, o resultado é “mais inteligente” do que pontos de dados isolados.
Um olhar mais atento sobre o aprendizado conjunto nas competições Kaggle
No Desafio de Classificação de Produtos do Grupo Otto, os participantes tiveram que construir um modelo preditivo capaz de distinguir as principais categorias de produtos.
Aqui você pode ver como o modelo vencedor foi construído. Era um empilhamento de três camadas: a primeira tinha 33 modelos, a segunda adicionava mais três (XGBoost, uma rede neural e AdaBoost) e a terceira era a média ponderada das saídas da camada anterior. Era um modelo muito complexo e um conjunto.
Outro sucesso da Kaggle é o modelo criado por Chenglong Chen na competição Crowdflower Search Results Relevance. O desafio era criar um preditor que pudesse ser usado para medir a relevância dos resultados da pesquisa. Você pode ler a explicação completa de seu método, mas como nosso ponto de interesse são ensembles, a parte crítica da história é que a solução vencedora usou um ensemble de 35 modelos, muitos dos quais também eram ensembles – um meta-ensemble, então falar.
Métodos de Conjunto
Existem muitas maneiras de implementar métodos de conjunto no aprendizado de máquina. Vamos explorar alguns dos métodos mais populares:
- Acondicionamento
- Floresta Aleatória
- Impulsionando
- AdaBoostGenericName
- Aumento de gradiente e XGBoost
- Métodos de Conjunto Híbrido
- Votação
- Empilhamento
- Cascata
Acondicionamento
Como mencionado, você precisa treinar muitos modelos em diferentes subconjuntos de dados. Na prática, isso não é fácil porque você precisará de muito mais dados para muitos modelos do que para um único modelo e, às vezes, não é fácil obter conjuntos de dados de alta qualidade. É quando o bagging (agregação de bootstrap) é útil, pois divide os dados por meio de bootstrapping: uma amostra aleatória com uma substituição, resultando em diferentes subconjuntos que se sobrepõem.
Depois de treinar seus modelos de conjunto, você constrói sua previsão final agregando cada previsão de modelo por meio de qualquer métrica de sua preferência: a média, mediana, moda e assim por diante. Você também pode usar as probabilidades de previsão do modelo para fazer uma métrica ponderada:
Se quisermos usar árvores de decisão como modelos, mas tivermos poucos atributos preditivos fortes em nossos dados, todas as árvores serão semelhantes. Isso ocorre porque os mesmos atributos tenderão a estar no nó raiz, produzindo resultados semelhantes em cada ramo da árvore.
Floresta Aleatória
Uma técnica para resolver esse problema é a floresta aleatória . Ele faz um conjunto de ensacamento usando árvores, mas cada nó restringe seus possíveis atributos a um subconjunto aleatório. Isso força os modelos a serem diferentes, resolvendo o problema anterior. Também torna a floresta aleatória um modelo muito bom para seleção de recursos.
A floresta aleatória é um dos modelos de ML mais populares porque oferece bom desempenho com baixa variação e tempo de treinamento.
Impulsionando
Boosting também usa bootstrapping para treinar os modelos, com a principal diferença é que adiciona pesos a cada instância com base nos erros de previsão do modelo. Enquanto o ensacamento é um processo paralelo, o boosting é sequencial, em que cada modelo tem mais probabilidades. Isso permite o acesso a algumas instâncias de previsões de modelos anteriores.
Com essa modificação, o boosting tenta aumentar o foco em instâncias mal classificadas para alcançar um melhor desempenho global:
Ele adiciona pesos aos modelos também. Preditores com melhor desempenho no tempo de treinamento terão um peso maior na fase de previsão.
Vamos dar uma olhada em alguns dos modelos de reforço mais populares:
AdaBoostGenericName
AdaBoost foi uma das primeiras implementações de boosting. Ele faz quase exatamente o que descrevemos sobre boosting em geral e usa árvores de decisão como modelos. Vamos explicar a fase de treinamento com alguma pseudocodificação:
For each instance i Assign w[i] (weight, same for all) For each iteration t Generate a subset s[t] by weighted boosting (using the w[i] weights) Train model m[t] using s[t] Store m[t] Calculate e[t] (error rate of m[t]) Assign error rate e[t] to stored m[t] model If (e[t] <= a_threshold) Exit for Update weights using m[t] errors No momento da previsão, ele pondera cada previsão com base na taxa de erro e[t] calculada para cada uma. Resultados com alta taxa de erro terão menos peso do que outros com melhor precisão.
Aumento de gradiente e XGBoost
Um dos maiores problemas ao treinar tantos modelos e fazê-los trabalhar juntos é encontrar a melhor configuração de hiperparâmetros. É difícil encontrar a melhor configuração para um único modelo; encontrar a melhor configuração para n modelos aumenta a complexidade exponencialmente. A configuração ideal para um modelo isolado provavelmente não é a mesma para um modelo que precisa funcionar com outros. Como tal, você deve pesquisar a configuração de todos os modelos ao mesmo tempo, mas como?
O aumento de gradiente traz uma solução elegante para esse problema. Ele cria uma função de perda que tem como entrada todos os valores dos hiperparâmetros de todos os modelos e, como saída, o erro de todo o ensemble. Por meio do gradiente descendente, ele encontra o valor mínimo da função (ou seja, o menor erro) e, assim, a melhor configuração de hiperparâmetros para cada modelo.

Essa abordagem introduz um problema de dimensionamento. Entre no rei do aprendizado de máquina para dados estruturados: aumento de gradiente extremo, XGBoost para abreviar. É uma implementação incrivelmente eficiente de aumento de gradiente, graças a várias técnicas, como computação paralelizada, capacidade de validação cruzada integrada, regularização para evitar overfitting e otimização de hardware. O XGBoost oferece desempenho excepcional.
O XGBoost se tornou popular quando seu criador o usou para um desafio Kaggle e venceu por uma ampla margem. Ele publicou o resultado e criou um wrapper Python para permitir que mais pessoas o usem. Quando muitas pessoas reconheceram seu potencial, o XGBoost rapidamente se tornou um campeão de ML.
Métodos de Conjunto Híbrido
Mas a história não termina aí. Vimos muitos tipos de ensembles que usam o mesmo tipo de modelo - por que não tentar combinações de modelos diferentes? Se você fizer isso bem, poderá criar um método de ML ainda mais poderoso: um conjunto híbrido .
Votação
A votação é uma das abordagens mais simples para criar um conjunto híbrido. Ele treina muitos algoritmos de modelo diferentes e os faz “votar” na fase de previsão:
Você pode adicionar pesos a cada modelo com base em seu desempenho ou probabilidades de previsão e gerar um voto ponderado.
Empilhamento
O empilhamento avança a ideia de votação adicionando uma nova camada sobre os modelos básicos para fazer a previsão final em vez de apenas calcular a média ou a maioria. Ele adiciona o conceito de meta-aprendizagem, pois a nova camada aprende não com os dados, mas com as previsões do modelo:
Você pode empilhar todas as meta-camadas que desejar, resultando em um modelo com muitos níveis. Para modelos empilhados, recomendo usar árvores de decisão, SVMs ou perceptrons. Para modelos básicos, você pode usar qualquer método que desejar, até mesmo outro ensemble, criando um ensemble de ensembles. O empilhamento funciona ainda melhor com modelos básicos como árvores de decisão que geram não apenas uma previsão de valor, mas também a probabilidade de estar correta.
O empilhamento é menos popular do que o ensacamento ou aumento porque é mais difícil interpretar o que os modelos empilhados estão aprendendo e porque há um número muito maior de variantes: você pode brincar com muitas combinações de algoritmos de modelo, configurações de hiperparâmetros e camadas de empilhamento. No entanto, com a combinação certa de modelos, o empilhamento pode ser ainda mais forte do que o reforço e o ensacamento.
Cascata
A cascata é usada quando você deseja ter um grande grau de certeza na previsão. Ele usa uma abordagem de empilhamento, mas possui apenas um modelo em cada camada. Em cada nível, os modelos descartam instâncias que consideram não ser da classe desejada.
Com a cascata, os modelos simples avaliam os dados antes dos modelos complexos. Na etapa de previsão, o primeiro modelo recebe os dados. Se a certeza não for maior que x (o valor tem que ser alto, algo maior que 0,9), ele passa a instância para o próximo modelo. Caso contrário, a cascata retorna a saída prevista desse modelo. Se nenhuma camada puder prever a classe desejada com alto grau de certeza, o conjunto retornará a classe negativa.
Um caso de uso clássico para esse modelo é prever quando uma transação provavelmente será fraudulenta. Vamos supor que um sistema calcule milhões de transações por dia e que seja impossível controlar cada uma delas manualmente. O uso de um conjunto em cascata pode descartar transações que não são fraudulentas com uma probabilidade muito alta, deixando apenas um pequeno subconjunto de transações para verificação manual:
Esses modelos são boas opções quando você precisa de uma excelente métrica de recall.
Ao contrário de votação e empilhamento, um conjunto em cascata usa uma abordagem multiestado em vez de uma abordagem multiexpert. É importante ser cauteloso com o cascateamento muito profundo, pois pode produzir overfitting.
O valor dos métodos de conjunto
A combinação de muitos modelos nos permite criar preditores melhores e mais poderosos, como acontece quando os humanos trabalham juntos. Delineamos três famílias de conjuntos – ensacamento, reforço e híbridos – e vimos como eles treinam e preveem.
Uma árvore de decisão pode ser um modelo muito fraco e instável (com alta variância), mas uma multidão de árvores diferentes (floresta aleatória) pode ser um preditor muito preciso e estável. Uma das principais vantagens dos ensembles é que eles constroem modelos com baixa variância e baixo viés, uma das maiores compensações no aprendizado de máquina. Na maioria dos casos, eles superam outros métodos e, às vezes, são ainda melhores que o aprendizado profundo. Eles tendem a ser mais fracos do que as redes neurais profundas apenas quando operam em dados não estruturados.
Se continuarmos a comparação com redes neurais profundas, também podemos dizer que os ensembles tendem a ser mais leves e rápidos nas fases de treinamento e teste. Além disso, eles não exigem hardware caro para serem executados, como GPUs poderosas e discretas.
É verdade que os ensembles não têm a possibilidade de serem compreendidos intuitivamente pelos humanos porque ter dezenas ou centenas de modelos trabalhando ao mesmo tempo cria uma ferramenta enorme e complexa. Felizmente, algumas técnicas nos permitem entender como esses métodos tomam suas decisões. Um dos mais populares é o LIME, um método que cria explicações interpretáveis para uma instância específica sobre qualquer modelo de aprendizado de máquina.
As competições Kaggle não existem apenas para que os desenvolvedores possam se divertir, aprender novas habilidades ou ganhar prêmios. O objetivo final é criar modelos fortes e soltá-los na natureza, para deixá-los fazer sua mágica em cenários do mundo real. Esses tipos de modelos são usados por organizações que lidam com problemas críticos. Por exemplo, a detecção de fraudes é um caso de uso comum em setores como bancos e viagens, que lidam com grandes quantias de dinheiro sendo movimentadas em transações únicas.
Os conjuntos produzem melhores previsões com menor variância e viés do que outros modelos. No entanto, é difícil interpretar o que eles estão aprendendo, e isso pode ser de importância crítica em algumas aplicações sensíveis. Um exemplo disso é o setor de empréstimos pessoais: um modelo de ML pode determinar se um indivíduo é ou não elegível para um empréstimo. No entanto, se o cliente perguntar por que a instituição financeira negou o empréstimo, deve haver uma explicação detalhada, não apenas “Porque nosso modelo de ML disse isso”.
Em última análise, se você deseja criar modelos de ML poderosos para aplicativos corporativos, grandes bancos ou pequenas empresas, ou apenas participar de concursos para aumentar sua reputação profissional, os conjuntos devem ser sua ferramenta de escolha.
