Sobre o algoritmo Xgboost

João Cláudio Nunes Carvalho
12 min readSep 11, 2024

--

XGBoost é um algoritmo de aprendizado de máquina amplamente utilizado para resolver problemas de previsão em dados organizados em tabelas. Ele se destaca por sua capacidade de unir velocidade e precisão nas previsões, o que o torna uma opção popular tanto em competições de ciência de dados como em projetos práticos da indústria.

No campo das tecnologias de machine learning, o XGBoost (eXtreme Gradient Boosting) rapidamente se consolidou como um dos algoritmos mais populares e eficazes para modelagem preditiva. Desde sua criação, ele tem sido amplamente adotado por cientistas de dados e engenheiros de machine learning, graças à sua capacidade de gerar resultados precisos de forma eficiente, tornando-se uma escolha favorita em competições e aplicações práticas.

Anteriormente, os modelos estatísticos, como a regressão linear e logística, dominavam a análise preditiva. Apesar de existirem diversas alternativas de algoritmos, a regressão costumava ser suficiente na maioria dos casos.

O que é o XGBoost?

O XGBoost é um algoritmo de machine learning baseado em árvores de decisão que utiliza a técnica de gradient boosting. Em essência, ele é uma implementação otimizada do gradient boosting, um método que combina vários modelos simples, como árvores de decisão, para formar um preditor mais forte. A ideia central é usar modelos fracos sequencialmente, corrigindo os erros dos anteriores, o que refina as previsões.

Gradient Boosting

Gradient Boosting é uma técnica de aprendizado de máquina amplamente utilizada para resolver problemas de regressão e classificação. Ela funciona construindo um modelo preditivo forte a partir da combinação de vários modelos mais fracos, geralmente árvores de decisão.

Como funciona:

  1. Modelos Fracos: O processo começa com a criação de um modelo inicial simples, como uma árvore de decisão com pouca profundidade. Este modelo inicial pode não ser muito preciso.
  2. Cálculo dos Resíduos: O modelo inicial é usado para fazer previsões nos dados de treinamento. A diferença entre as previsões e os valores reais é chamada de resíduo ou erro.
  3. Novo Modelo nos Resíduos: Um novo modelo fraco é treinado para prever os resíduos do modelo anterior. A ideia é que este novo modelo se concentre em corrigir os erros do modelo anterior.
  4. Combinação dos Modelos: O novo modelo é adicionado ao modelo anterior, com um peso que controla sua contribuição. Este processo é repetido várias vezes, criando uma sequência de modelos que se complementam.
  5. Modelo Final: O modelo final é a combinação ponderada de todos os modelos fracos. Ele tende a ser muito mais preciso do que qualquer um dos modelos individuais.

Vantagens:

  • Alta Precisão: Gradient Boosting é conhecido por sua alta capacidade preditiva, frequentemente superando outros algoritmos em competições de machine learning.
  • Flexibilidade: Pode ser usado para uma variedade de problemas, incluindo regressão, classificação e até mesmo ranking.
  • Lidar com Diferentes Tipos de Dados: Funciona bem com dados numéricos, categóricos e mistos.
  • Robustez a Outliers: Menos sensível a outliers em comparação com algumas outras técnicas.

Desvantagens:

  • Complexidade: Pode ser mais complexo de entender e ajustar do que alguns outros algoritmos.
  • Overfitting: Se não for cuidadosamente ajustado, pode levar ao overfitting, onde o modelo se ajusta muito bem aos dados de treinamento, mas não generaliza bem para novos dados.
  • Custo Computacional: O treinamento pode ser computacionalmente intensivo, especialmente com grandes conjuntos de dados.

Aplicações:

Gradient Boosting é usado em uma ampla gama de aplicações, incluindo:

  • Previsão de vendas
  • Detecção de fraudes
  • Classificação de imagens
  • Recomendação de produtos
  • Análise de risco de crédito
  • E muito mais!

Bibliotecas Populares:

  • Scikit-learn: Implementação popular em Python.
  • XGBoost: Biblioteca otimizada para velocidade e desempenho.
  • LightGBM: Outra biblioteca rápida e eficiente.
  • CatBoost: Biblioteca com recursos avançados para lidar com dados categóricos.

Lembre-se: É importante ajustar cuidadosamente os hiperparâmetros e tomar medidas para evitar o overfitting para obter o melhor desempenho do Gradient Boosting.

Em problemas de previsão com dados não estruturados, como imagens e textos, redes neurais geralmente têm melhor desempenho. Contudo, para dados estruturados ou tabulares, algoritmos baseados em árvores de decisão, como o XGBoost, continuam sendo os mais eficientes. No entanto, a escolha do algoritmo depende de fatores como custo computacional, tempo de implementação e precisão desejada.

O XGBoost foi desenvolvido como um projeto de pesquisa na Universidade de Washington por Tianqi Chen e Carlos Guestrin, e desde sua introdução, tem sido amplamente utilizado em competições e aplicações da indústria, acumulando uma comunidade ativa com milhares de contribuições no GitHub. Entre suas vantagens estão:

  1. Versatilidade: Resolve problemas de regressão, classificação e ranqueamento.
  2. Portabilidade: Funciona em Windows, Linux e OS X.
  3. Multilinguagem: Suporta diversas linguagens de programação, como Python, R, C++, Java, entre outras.
  4. Integração com Nuvem: Compatível com AWS, Azure, e diversos ecossistemas como Spark e Flink.

Como funciona o XGBoost?

As árvores de decisão são intuitivamente simples e visualizáveis. Entretanto, ao longo dos anos, os algoritmos baseados em árvores evoluíram de maneiras significativas. Abaixo, uma analogia para entender essa evolução:

  • Árvore de Decisão: Imagine um gerente de contratações entrevistando candidatos com base em critérios como experiência e formação.
  • Bagging: Agora, imagine um painel de entrevistadores, onde todos têm um voto na decisão final, formando uma “democracia” de modelos.
  • Random Forest: Cada entrevistador avalia apenas certos aspectos selecionados aleatoriamente, como uma entrevista técnica para uma área específica.
  • Boosting: Cada entrevistador ajusta seus critérios com base no feedback dos outros, aumentando a eficiência do processo.
  • Gradient Boosting: Usa gradient descent para minimizar erros de forma mais eficiente.
  • XGBoost: É o gradient boosting otimizado, utilizando técnicas de software e hardware para obter resultados rápidos e precisos.

Recursos do XGBoost

O XGBoost possui várias características que o destacam:

  • Paralelização: Permite o uso de múltiplos núcleos durante o treinamento, acelerando o processo.
  • Regularização: Usa regularização L1 e L2 para evitar overfitting.
  • Validação Cruzada Interna: Facilita a avaliação contínua do modelo.
  • Manejo de Valores Ausentes: Trata valores faltantes de forma eficiente, selecionando o melhor caminho para os dados.
  • Importância das Características: Gera métricas para identificar as variáveis mais relevantes.

Aplicações Práticas do XGBoost

O XGBoost tem amplas aplicações no mundo real, como:

  • Análise de Crédito: Previsão de inadimplência para instituições financeiras.
  • Diagnóstico Médico: Identificação precoce de doenças a partir de sinais vitais.
  • Marketing Segmentado: Previsão de comportamento de clientes em campanhas.
  • Previsão de Demanda: Ajuste de estoques no varejo.

Devemos usar XGBoost o tempo todo?

Não há uma resposta única para essa pergunta. O XGBoost é extremamente eficaz, mas cientistas de dados devem sempre experimentar diferentes algoritmos e configurações para encontrar a melhor solução para cada problema. A escolha do modelo envolve equilibrar fatores como complexidade, precisão e custo computacional.

Exemplos de uso do XGBoost

Conjunto de dados Iris:

Aqui está um exemplo simples de como usar o XGBoost em Python para resolver um problema de classificação com o conjunto de dados Iris:

1. Instalar a biblioteca XGBoost

pip install xgboost

2. Exemplo de código para usar o XGBoost

# Importando as bibliotecas necessárias
import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Carregar o conjunto de dados Iris
iris = load_iris()
X = iris.data # Features (atributos)
y = iris.target # Labels (classes)
# Dividir os dados em conjunto de treinamento e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Criar o modelo XGBoost
model = xgb.XGBClassifier(objective='multi:softmax', num_class=3)
# Treinar o modelo
model.fit(X_train, y_train)
# Fazer previsões
y_pred = model.predict(X_test)
# Avaliar o desempenho do modelo
accuracy = accuracy_score(y_test, y_pred)
print(f'Acurácia do modelo XGBoost: {accuracy:.2f}')

Explicação do Código:

  1. Carregamento do Conjunto de Dados: Utiliza o dataset Iris, que contém informações sobre flores e três classes distintas.
  2. Divisão dos Dados: O conjunto de dados é dividido em treino (70%) e teste (30%) usando train_test_split.
  3. Treinamento do Modelo: O modelo XGBoost é criado e treinado com os dados de treino.
  4. Predição e Avaliação: O modelo faz previsões sobre os dados de teste, e a acurácia é calculada utilizando a função accuracy_score.

Configurações Adicionais:

Você pode ajustar hiperparâmetros como learning_rate, max_depth, e n_estimators para melhorar o desempenho do modelo. Por exemplo:

model = xgb.XGBClassifier(objective='multi:softmax', num_class=3, learning_rate=0.1, max_depth=4, n_estimators=100)

Essa é uma abordagem simples para começar com o XGBoost em tarefas de classificação!

Conjunto de dados Boston Housing

Aqui está outro exemplo de uso do XGBoost, desta vez para um problema de regressão, usando o conjunto de dados Boston Housing. Este conjunto de dados contém informações sobre casas em Boston e a tarefa é prever o preço das casas com base em várias características.

1. Exemplo de código para usar o XGBoost em um problema de regressão:

# Importando as bibliotecas necessárias
import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# Carregar o conjunto de dados de habitação da Califórnia
data = fetch_california_housing()
X = data.data # Features (atributos)
y = data.target # Target (preço das casas)
# Dividir os dados em conjunto de treinamento e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Criar o modelo XGBoost para regressão
model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.1, max_depth=5)
# Treinar o modelo
model.fit(X_train, y_train)
# Fazer previsões
y_pred = model.predict(X_test)
# Avaliar o desempenho do modelo
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f'Erro quadrático médio (MSE): {mse:.2f}')
print(f'Raiz do erro quadrático médio (RMSE): {rmse:.2f}')

Explicação do Código:

  1. Carregamento do Conjunto de Dados: O conjunto de dados California Housing é carregado, e as características das casas são armazenadas em X, enquanto o preço das casas (variável alvo) é armazenado em y.
  2. Divisão dos Dados: Os dados são divididos em conjuntos de treino (70%) e teste (30%) para treinar o modelo e depois avaliar sua performance.
  3. Modelo de Regressão XGBoost: Aqui, usamos o XGBRegressor, que é projetado para tarefas de regressão. O hiperparâmetro objective='reg:squarederror' especifica que estamos resolvendo um problema de regressão com erro quadrático médio (MSE).
  4. Treinamento e Previsão: O modelo é treinado nos dados de treino e faz previsões com os dados de teste.
  5. Avaliação: A performance do modelo é avaliada usando a métrica de erro quadrático médio (MSE) e sua raiz (RMSE), que mede o quão próximas as previsões estão dos valores reais.

Configurações Adicionais:

Você pode ajustar parâmetros como:

  • n_estimators: O número de árvores a serem construídas (mais árvores podem melhorar a performance, mas podem aumentar o tempo de treinamento).
  • learning_rate: A taxa de aprendizado (controla o impacto de cada árvore).
  • max_depth: A profundidade máxima das árvores (um valor maior pode aumentar a capacidade do modelo de capturar padrões complexos, mas pode causar overfitting).

Aqui está uma explicação detalhada de cada parte do código fornecido para o uso do XGBoost em um problema de regressão, utilizando o conjunto de dados California Housing:

1. Importação das Bibliotecas

import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
  • xgboost: Esta biblioteca implementa o algoritmo XGBoost, que é otimizado para problemas de aprendizado supervisionado, tanto de regressão quanto de classificação.
  • fetch_california_housing: Função do scikit-learn que carrega o conjunto de dados de preços de casas na Califórnia, com múltiplas variáveis preditoras.
  • train_test_split: Função para dividir os dados em conjunto de treino e conjunto de teste, permitindo que o modelo seja avaliado em dados que ele ainda não viu.
  • mean_squared_error: Função para calcular o erro quadrático médio (MSE), uma métrica usada para avaliar o desempenho em problemas de regressão.
  • numpy (np): Biblioteca usada para manipulações numéricas, aqui usada para calcular a raiz quadrada do MSE, ou seja, o RMSE.

2. Carregamento do Conjunto de Dados

data = fetch_california_housing()
X = data.data # Features (atributos)
y = data.target # Target (preço das casas)
  • fetch_california_housing(): Esta função carrega um conjunto de dados de preços de casas na Califórnia. O conjunto de dados contém várias variáveis (características) que influenciam o preço das casas.
  • X: As características (ou features) que serão usadas para prever o preço das casas, como localização, número de quartos, etc.
  • y: O preço das casas (variável alvo), que estamos tentando prever.

3. Divisão dos Dados em Conjuntos de Treinamento e Teste

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • train_test_split(X, y, test_size=0.3, random_state=42): Esta função divide os dados em conjuntos de treinamento e teste:
  • X_train: Subconjunto de características para treinar o modelo.
  • X_test: Subconjunto de características para testar o modelo.
  • y_train: Valores alvo (preços) correspondentes ao conjunto de treinamento.
  • y_test: Valores alvo (preços) correspondentes ao conjunto de teste.
  • test_size=0.3: Define que 30% dos dados serão usados para teste e 70% para treinamento.
  • random_state=42: Garante que a divisão dos dados será a mesma a cada execução, facilitando a reprodução dos resultados.

4. Criação do Modelo XGBoost para Regressão

model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.1, max_depth=5)
  • xgb.XGBRegressor(): Cria um modelo de regressão utilizando o XGBoost, ajustado para prever valores numéricos (neste caso, o preço das casas).
  • objective=’reg’: Define que o objetivo do modelo é minimizar o erro quadrático médio (mean squared error ou MSE). Este objetivo é adequado para problemas de regressão.
  • n_estimators=100: Especifica o número de árvores a serem construídas (100 árvores no caso). Mais árvores podem melhorar a precisão do modelo, mas podem aumentar o tempo de treinamento.
  • learning_rate=0.1: Define a taxa de aprendizado, que controla o quão rápido o modelo se adapta aos dados. Um valor menor (por exemplo, 0.1) faz com que o modelo aprenda mais devagar, mas com maior precisão.
  • max_depth=5: Define a profundidade máxima das árvores de decisão. Um valor maior pode ajudar o modelo a capturar padrões mais complexos, mas também aumenta o risco de overfitting (quando o modelo se ajusta demais aos dados de treinamento).

5. Treinamento do Modelo

model.fit(X_train, y_train)
  • model.fit(X_train, y_train): Treina o modelo XGBoost nos dados de treinamento, ajustando os parâmetros internos do modelo para minimizar o erro entre as previsões e os valores reais (preços das casas).
  • X_train: As características das casas que são usadas para treinar o modelo.
  • y_train: Os preços reais das casas no conjunto de treinamento.

6. Previsão com o Modelo Treinado

y_pred = model.predict(X_test)
  • model.predict(X_test): Gera previsões para os dados de teste, usando o modelo treinado. Aqui, o modelo tenta prever os preços das casas com base nas características do conjunto de teste.
  • X_test: As características das casas no conjunto de teste.
  • y_pred: As previsões geradas pelo modelo (preços estimados).

7. Avaliação do Modelo

mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f'Erro quadrático médio (MSE): {mse:.2f}')
print(f'Raiz do erro quadrático médio (RMSE): {rmse:.2f}')
  • mean_squared_error(y_test, y_pred): Calcula o erro quadrático médio (MSE), que mede a diferença média entre os valores reais (preços reais das casas no conjunto de teste) e as previsões feitas pelo modelo.
  • y_test: Os preços reais das casas no conjunto de teste.
  • y_pred: Os preços estimados pelo modelo.
  • np.sqrt(mse): Calcula a raiz quadrada do MSE, que é o RMSE (root mean squared error). O RMSE é mais fácil de interpretar, pois está na mesma unidade que os preços das casas. Ele mede a média das diferenças entre os preços reais e os previstos.
  • print: Exibe o erro quadrático médio (MSE) e sua raiz quadrada (RMSE), que são indicadores da precisão do modelo. Um RMSE mais baixo indica um modelo mais preciso.

Saída esperada:

Erro quadrático médio (MSE): 0.36
Raiz do erro quadrático médio (RMSE): 0.60

Esses valores indicam que o modelo está, em média, errando por 0.60 unidades de preço na previsão das casas, que no conjunto de dados California Housing estão em centenas de milhares de dólares.

Resumo:

  • Divisão de dados: Treinamento (70%) e teste (30%).
  • Modelo: XGBoost configurado para regressão, com parâmetros ajustados para controlar a profundidade da árvore, a taxa de aprendizado e o número de árvores.
  • Previsões e avaliação: O modelo faz previsões sobre os preços das casas e é avaliado pelo RMSE, que mede a precisão do modelo.

Prever vendas utilizando dados sintéticos

Aqui está um exemplo de como usar o XGBoost para prever vendas utilizando dados sintéticos. Esses dados serão gerados artificialmente, simulando um cenário de previsão de vendas com base em diversas variáveis.

Exemplo de Previsão de Vendas com XGBoost

Vamos gerar um conjunto de dados sintéticos que inclui características como a estação do ano, a publicidade, o número de promoções e o preço do produto para prever as vendas mensais.

1. Código completo

# Importando as bibliotecas necessárias
import xgboost as xgb
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# Definir um seed para reprodutibilidade
np.random.seed(42)
# Gerar dados sintéticos
n_samples = 1000
data = pd.DataFrame({
'season': np.random.choice([1, 2, 3, 4], size=n_samples), # Estação (1-Primavera, 2-Verão, 3-Outono, 4-Inverno)
'advertising': np.random.uniform(500, 5000, size=n_samples), # Orçamento de publicidade
'promotions': np.random.randint(0, 5, size=n_samples), # Número de promoções no mês
'price': np.random.uniform(10, 100, size=n_samples), # Preço do produto
'sales': np.random.uniform(1000, 20000, size=n_samples) # Vendas mensais (variável alvo)
})
# Definir as características (X) e o alvo (y)
X = data[['season', 'advertising', 'promotions', 'price']] # Características
y = data['sales'] # Alvo (vendas)
# Dividir os dados em treinamento e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Criar o modelo XGBoost para regressão
model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100, learning_rate=0.1, max_depth=5)
# Treinar o modelo
model.fit(X_train, y_train)
# Fazer previsões
y_pred = model.predict(X_test)
# Avaliar o desempenho do modelo
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f'Erro quadrático médio (MSE): {mse:.2f}')
print(f'Raiz do erro quadrático médio (RMSE): {rmse:.2f}')
# Exibir uma comparação das vendas reais e previstas
plt.figure(figsize=(10,6))
plt.scatter(range(len(y_test)), y_test, color='blue', label='Vendas reais')
plt.scatter(range(len(y_pred)), y_pred, color='red', label='Vendas previstas', alpha=0.5)
plt.title('Comparação entre Vendas Reais e Vendas Previstas')
plt.legend()
plt.show()

2. Explicação do Código

  1. Geração de Dados Sintéticos:
  • season: Representa a estação do ano, com valores entre 1 (Primavera) e 4 (Inverno). Usamos isso para simular o efeito sazonal sobre as vendas.
  • advertising: Orçamento de publicidade, gerado aleatoriamente entre 500 e 5000, simulando o impacto de campanhas publicitárias sobre as vendas.
  • promotions: Número de promoções realizadas no mês, variando de 0 a 4.
  • price: Preço do produto, variando de 10 a 100 unidades monetárias.
  • sales: A variável alvo, representando as vendas mensais, geradas aleatoriamente entre 1000 e 20000.
  1. Divisão dos Dados: Usamos train_test_split para dividir os dados em 70% para treinamento e 30% para teste. Isso nos permite treinar o modelo e avaliar sua performance em dados não vistos.
  2. Criação e Treinamento do Modelo:
  • Utilizamos o XGBRegressor para prever as vendas com base nas variáveis explicativas.
  • objective='reg:squarederror': Define que estamos lidando com um problema de regressão.
  • n_estimators=100: O modelo criará 100 árvores de decisão para combinar as previsões.
  • learning_rate=0.1: Define a taxa de aprendizado do modelo.
  1. Avaliação do Modelo:
  • Calculamos o MSE (Erro Quadrático Médio) para avaliar o desempenho do modelo.
  • O RMSE (Raiz do Erro Quadrático Médio) facilita a interpretação, pois está na mesma escala que as vendas.
  1. Visualização dos Resultados:
  • O gráfico de dispersão compara as vendas reais com as previstas, permitindo uma visualização clara de quão bem o modelo está fazendo as previsões.

3. Saída esperada

Após a execução, você deve ver os seguintes resultados:

Erro quadrático médio (MSE): 1000172.54
Raiz do erro quadrático médio (RMSE): 1000.09

--

--

João Cláudio Nunes Carvalho
João Cláudio Nunes Carvalho

Written by João Cláudio Nunes Carvalho

Professor of Physics at the Federal Institute of Ceará. Phd in physics(UFC). MBA in Data Science and Analytics — USP — University of São Paulo