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:
- Gerar dados
- Ajustar o classificador com estimativas OOB
- Estimar o melhor número de iterações usando validação cruzada
- Calcular o melhor número de iterações para dados de teste
- 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.