Muitas pessoas acham a configuração inicial do CatBoost um pouco intimidante.

Talvez você tenha ouvido falar sobre sua capacidade de trabalhar com features categóricas sem nenhum pré-processamento, mas não sabe por onde começar.

Neste tutorial passo a passo, vou simplificar as coisas para você.

Afinal, esta é apenas mais uma biblioteca de gradient boosting para ter em sua caixa de ferramentas.

Vou guiá-lo pelo processo de instalação do CatBoost, carregamento dos seus dados e configuração de um classificador CatBoost.

Ao longo da jornada, também abordaremos como dividir seus dados em um conjunto de treinamento e um conjunto de teste, como lidar com dados desbalanceados e como treinar seu modelo em uma GPU.

Ao final deste guia, você estará pronto e confiante para usar o CatBoost em seus próprios projetos de classificação binária.

Então, vamos começar!

Instalando o CatBoost no Python

Existem duas maneiras principais de instalar o CatBoost no Python: usando pip e conda.

Se você prefere usar pip, pode instalar o CatBoost executando o seguinte comando no seu terminal:

pip install catboost

Se você prefere usar conda, pode instalá-lo executando:

conda install -c conda-forge catboost

Certifique-se de ter pip ou conda instalado em seu ambiente Python antes de executar esses comandos.

Depois de instalar o CatBoost com sucesso, você está pronto para seguir para o próximo passo: carregar seus dados.

Carregando os Dados

Usaremos o Adult Dataset. Você pode baixá-lo no Kaggle.

Este é um conjunto de dados bem conhecido que contém informações demográficas sobre a população dos EUA.

O objetivo é prever se uma pessoa ganha mais de $50.000 por ano.

O destaque do CatBoost é que ele pode lidar com features categóricas sem nenhum pré-processamento, então escolhi este conjunto de dados porque ele tem uma mistura de features categóricas e numéricas.

Usaremos a biblioteca pandas para carregar nossos dados.

Primeiro, vamos importar as bibliotecas necessárias:

import pandas as pd
from sklearn.model_selection import train_test_split

Agora, vamos carregar os dados.

Usaremos a função read_csv do pandas para carregar os dados.

data = pd.read_csv(data_path)
age workclass fnlwgt education education.num marital.status occupation relationship race sex capital.gain capital.loss hours.per.week native.country income
90 ? 77053 HS-grad 9 Widowed ? Not-in-family White Female 0 4356 40 United-States <=50K
82 Private 132870 HS-grad 9 Widowed Exec-managerial Not-in-family White Female 0 4356 18 United-States <=50K
66 ? 186061 Some-college 10 Widowed ? Unmarried Black Female 0 4356 40 United-States <=50K
54 Private 140359 7th-8th 4 Divorced Machine-op-inspct Unmarried White Female 0 3900 40 United-States <=50K
41 Private 264663 Some-college 10 Separated Prof-specialty Own-child White Female 0 3900 40 United-States <=50K

Agora temos nossos dados carregados e prontos para uso.

O próximo passo é dividir nossos dados em um conjunto de treinamento e um conjunto de teste.

Vamos usar a função train_test_split do módulo sklearn.model_selection.

Dividiremos os dados em 80% para treinamento e 20% para teste.

X = data.drop('income', axis=1)
y = data['income']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

No código acima, X é nosso conjunto de features e y é nossa variável alvo, que é ‘income’ neste caso.

Agora temos nossos dados divididos em conjuntos de treinamento e teste, e estamos prontos para treinar nosso classificador CatBoost.

Observe como não precisamos fazer nenhum pré-processamento para features numéricas ou categóricas.

Treinando um Classificador CatBoost

A biblioteca CatBoost fornece uma classe CatBoostClassifier para tarefas de classificação binária e multiclasse.

Por padrão, ela usa valores de hiperparâmetros que são geralmente eficazes para uma ampla gama de conjuntos de dados.

Ainda assim, recomendo que você tune os hiperparâmetros para seu conjunto de dados específico para obter o melhor desempenho.

Vamos importar a biblioteca necessária e criar uma instância do CatBoostClassifier:

from catboost import CatBoostClassifier

cat_features = X_train.select_dtypes(include=['object']).columns.tolist()
model = CatBoostClassifier(cat_features=cat_features)

Criei a variável cat_features para armazenar os nomes das colunas de features categóricas.

O método select_dtypes é usado para selecionar colunas de um DataFrame com base em seus tipos de dados.

Neste caso, estamos selecionando colunas com o tipo de dados ‘object’, que são nossas features categóricas.

O classificador otimiza a função Logloss, também conhecida como cross-entropy loss.

É a função de perda mais comum usada para tarefas de classificação binária.

Por padrão, o CatBoost usa codificação one-hot para features categóricas com um pequeno número de valores diferentes.

Para features com alta cardinalidade (como CEPs), o CatBoost usa uma codificação mais complexa, incluindo codificação de probabilidade e contagens de níveis categóricos.

Cardinalidade é o termo técnico para o número de valores únicos em uma coluna categórica.

Precisamos especificar os nomes das colunas de features categóricas no parâmetro cat_features ao inicializar o CatBoostClassifier.

Eu selecionei todas as features não numéricas como features categóricas no código acima.

Lidando com Dados Desbalanceados

O CatBoost fornece o parâmetro scale_pos_weight.

Este parâmetro ajusta o custo de classificar erroneamente exemplos positivos (classe 1).

Um bom valor padrão é a razão entre amostras negativas e positivas no conjunto de dados de treinamento.

Basta dividir o número de amostras negativas pelo número de amostras positivas e passar o resultado para o parâmetro scale_pos_weight:

scale_pos_weight = len(y_train[y_train=='<=50K']) / len(y_train[y_train=='>50K'])
model = CatBoostClassifier(cat_features=cat_features, scale_pos_weight=scale_pos_weight)

Tenha cuidado caso você precise prever probabilidades reais do evento positivo.

Este parâmetro quebra a calibração das probabilidades, então não é recomendado para uso em tarefas onde a calibração é importante.

Nossos dados não são terrivelmente desbalanceados, então não usarei este parâmetro neste exemplo.

Treinamento Usando GPU

O CatBoost permite que você treine seu modelo usando uma GPU.

Isso pode acelerar significativamente o processo de treinamento, especialmente para grandes conjuntos de dados.

Para habilitar o treinamento em GPU, defina o parâmetro task_type como ‘GPU’ ao inicializar o CatBoostClassifier:

model = CatBoostClassifier(cat_features=cat_features, task_type='GPU')

Por fim, vamos treinar nosso modelo nos dados de treinamento:

model.fit(X_train, y_train)

Com isso, nosso classificador CatBoost está treinado e pronto para fazer previsões.

Fazendo Previsões com o CatBoost

Existem dois tipos de previsões que podemos fazer: previsões de classe e previsões de probabilidade.

Previsões de Classe

Neste caso, o modelo prevê diretamente o rótulo da classe.

Ele faz isso definindo todos os exemplos onde a probabilidade da classe positiva é maior que 0,5 como 1 e o restante como 0.

class_predictions = model.predict(X_test)

No código acima, model.predict() é usado para fazer previsões de classe nos dados de teste X_test.

Prevendo Probabilidades

Em alguns casos, as probabilidades de cada classe são mais importantes do que as previsões de classe.

Isso é útil quando queremos ter uma medida da confiança do modelo em suas previsões ou selecionar um limiar personalizado para a classe positiva.

O CatBoost nos permite prever essas probabilidades usando o método predict_proba:

probability_predictions = model.predict_proba(X_test)

No código acima, model.predict_proba() é usado para prever as probabilidades das classes.

A saída é uma matriz 2D, onde o primeiro elemento de cada par é a probabilidade da classe negativa (0) e o segundo elemento é a probabilidade da classe positiva (1).

Agora que sabemos como fazer previsões, vamos seguir para avaliar o desempenho do nosso modelo.

Avaliando o Desempenho do Modelo

Usaremos várias métricas para isso: Log Loss, ROC AUC e um relatório de classificação.

Primeiro, vamos importar as funções necessárias do módulo sklearn.metrics:

from sklearn.metrics import log_loss, roc_auc_score, classification_report

Log Loss

Log Loss mede quão bem um modelo pode prever a verdadeira probabilidade de cada classe.

Como é a métrica diretamente otimizada pelo CatBoost, tende a ser uma boa medida do desempenho do modelo.

Quanto menor o log loss, melhores as previsões.

Não é adequado se você estiver usando scale_pos_weight para lidar com dados desbalanceados.

Nesse caso, você deve usar ROC AUC.

log_loss_value = log_loss(y_test, probability_predictions[:,1])
print(f'Log Loss: {log_loss_value}')

Usamos probability_predictions[:,1] para obter a probabilidade da classe positiva (1), já que o log loss trabalha com probabilidades, não com rótulos de classe.

ROC AUC

ROC AUC (Área Sob a Curva ROC - Receiver Operating Characteristic) é uma medida de desempenho para problemas de classificação onde você está mais interessado em quão bem o modelo prevê os exemplos positivos.

Quanto maior o AUC, melhor o modelo.

roc_auc = roc_auc_score(y_test, probability_predictions[:,1])
print(f'ROC AUC: {roc_auc}')

Assim como antes, precisamos passar a probabilidade da classe positiva (1) para a função roc_auc_score.

Relatório de Classificação

Um relatório de classificação exibe as pontuações de precisão, recall, F1 e suporte para cada classe e para o modelo como um todo.

class_report = classification_report(y_test, class_predictions)
print(f'Relatório de Classificação:\n {class_report}')

Relatório de Classificação

Ao avaliar essas métricas, você entenderá quão bem seu classificador CatBoost está se saindo em sua tarefa de classificação binária.

Seja o primeiro a saber das novidades em Machine Learning. Me siga no LinkedIn.