Estimativas Fora da Amostra em Reforço Gradiente

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório guiará você na implementação de um Classificador de Reforço Gradiente com estimativas fora da amostra (OOB) usando a biblioteca scikit-learn em Python. As estimativas OOB são uma alternativa às estimativas de validação cruzada e podem ser calculadas em tempo real sem a necessidade de ajustes repetidos do modelo. Este laboratório abordará os seguintes passos:

  1. Gerar dados
  2. Ajustar o classificador com estimativas OOB
  3. Estimar o melhor número de iterações usando validação cruzada
  4. Calcular o melhor número de iterações para dados de teste
  5. Plotar os resultados

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para você.

Gerar Dados

O primeiro passo é gerar alguns dados de exemplo que podemos usar para treinar e testar nosso modelo. Usaremos a função make_classification do módulo sklearn.datasets para gerar um problema de classificação binária aleatória com 3 recursos informativos.

import numpy as np
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=3, n_informative=3,
                           n_redundant=0, n_classes=2, random_state=1)

Ajustar o Classificador com Estimativas OOB

Em seguida, criaremos um Classificador de Reforço Gradiente com estimativas OOB usando a classe GradientBoostingClassifier do módulo sklearn.ensemble. Definiremos o número de estimadores para 100 e a taxa de aprendizado para 0,1.

from sklearn.ensemble import GradientBoostingClassifier

params = {
    "n_estimators": 100,
    "learning_rate": 0.1,
    "subsample": 1.0,
    "max_depth": 3,
    "min_samples_leaf": 1,
    "random_state": 1,
    "oob_score": True
}

clf = GradientBoostingClassifier(**params)
clf.fit(X, y)

Estimar o Número Ideal de Iterações usando Validação Cruzada

Podemos estimar o melhor número de iterações usando validação cruzada. Usaremos validação cruzada 5-fold e calculamos a perda de log negativo para cada número de iterações.

from sklearn.model_selection import cross_val_score

cv_scores = []
for i in range(1, params['n_estimators'] + 1):
    clf.set_params(n_estimators=i)
    scores = -1 * cross_val_score(clf, X, y, cv=5, scoring='neg_log_loss')
    cv_scores.append(scores.mean())

Calcular o Melhor Número de Iterações para Dados de Teste

Também podemos calcular o melhor número de iterações para os dados de teste. Calcularemos a perda de log negativo para cada número de iterações nos dados de teste.

from sklearn.metrics import log_loss
import matplotlib.pyplot as plt

test_scores = []
for i, y_pred in enumerate(clf.staged_predict_proba(X)):
    score = log_loss(y, y_pred)
    test_scores.append(score)

best_n_estimators = np.argmin(test_scores) + 1

Plotar os Resultados

Finalmente, podemos plotar os resultados para visualizar o desempenho do modelo para diferentes números de iterações. Plotaremos a perda de log negativo no eixo y e o número de iterações no eixo x.

plt.figure(figsize=(10, 5))
plt.plot(range(1, params['n_estimators'] + 1), cv_scores, label='CV')
plt.plot(range(1, params['n_estimators'] + 1), test_scores, label='Test')
plt.axvline(x=best_n_estimators, color='red', linestyle='--')
plt.xlabel('Número de iterações')
plt.ylabel('Perda de log negativo')
plt.legend()
plt.show()

Resumo

Neste laboratório, aprendemos como implementar um Classificador de Reforço Gradiente com estimativas fora da amostra e estimar o melhor número de iterações usando validação cruzada. Também calculamos o melhor número de iterações para os dados de teste e plotamos os resultados para visualizar o desempenho do modelo para diferentes números de iterações.