Comparação da Calibração de Classificadores

Beginner

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

Introdução

Neste laboratório, compararemos a calibração de quatro modelos diferentes: Regressão Logística, Naive Bayes Gaussiano, Classificador Floresta Aleatória e SVM Linear. Curvas de calibração serão plotadas para cada modelo, mostrando a relação entre as probabilidades previstas e os resultados reais. Isto é importante porque modelos bem calibrados produzem probabilidades precisas e confiáveis.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar Bibliotecas e Gerar Conjunto de Dados

Começamos importando as bibliotecas necessárias e gerando um conjunto de dados sintético de classificação binária com 100.000 amostras e 20 características. Das 20 características, apenas 2 são informativas, 2 são redundantes e as restantes 16 são não informativas. Das 100.000 amostras, 100 serão usadas para ajustar os modelos e as restantes para testes.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

## Gerar conjunto de dados
X, y = make_classification(
    n_samples=100_000, n_features=20, n_informative=2, n_redundant=2, random_state=42
)

train_samples = 100  ## Amostras usadas para treinar os modelos
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    shuffle=False,
    test_size=100_000 - train_samples,
)

Plotar Curvas de Calibração

Treinamos cada um dos quatro modelos com o pequeno conjunto de dados de treino e plotamos as curvas de calibração usando as probabilidades previstas do conjunto de dados de teste. As curvas de calibração são criadas agrupando as probabilidades previstas, em seguida, plotando a probabilidade média prevista em cada grupo contra a frequência observada ('fracção de positivos'). Abaixo da curva de calibração, plotamos um histograma que mostra a distribuição das probabilidades previstas ou, mais especificamente, o número de amostras em cada grupo de probabilidade prevista.

import numpy as np
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibrationDisplay
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

## Criar classificadores
lr = LogisticRegression()
gnb = GaussianNB()
svc = NaivelyCalibratedLinearSVC(C=1.0, dual="auto")
rfc = RandomForestClassifier()

clf_list = [
    (lr, "Regressão Logística"),
    (gnb, "Naive Bayes"),
    (svc, "SVC"),
    (rfc, "Floresta Aleatória"),
]

fig = plt.figure(figsize=(10, 10))
gs = GridSpec(4, 2)
colors = plt.get_cmap("Dark2")

ax_calibration_curve = fig.add_subplot(gs[:2, :2])
calibration_displays = {}
markers = ["^", "v", "s", "o"]
for i, (clf, name) in enumerate(clf_list):
    clf.fit(X_train, y_train)
    display = CalibrationDisplay.from_estimator(
        clf,
        X_test,
        y_test,
        n_bins=10,
        name=name,
        ax=ax_calibration_curve,
        color=colors(i),
        marker=markers[i],
    )
    calibration_displays[name] = display

ax_calibration_curve.grid()
ax_calibration_curve.set_title("Gráficos de Calibração")

## Adicionar histograma
grid_positions = [(2, 0), (2, 1), (3, 0), (3, 1)]
for i, (_, name) in enumerate(clf_list):
    row, col = grid_positions[i]
    ax = fig.add_subplot(gs[row, col])

    ax.hist(
        calibration_displays[name].y_prob,
        range=(0, 1),
        bins=10,
        label=name,
        color=colors(i),
    )
    ax.set(title=name, xlabel="Probabilidade média prevista", ylabel="Contagem")

plt.tight_layout()
plt.show()

Interpretar Curvas de Calibração

As curvas de calibração mostram a relação entre as probabilidades previstas e os resultados reais para cada modelo. Modelos bem calibrados produzem curvas que seguem a linha diagonal, indicando que as probabilidades previstas correspondem aos resultados reais. Os quatro modelos produzem resultados diferentes:

  • A regressão logística produz previsões bem calibradas, pois otimiza diretamente a perda de log.
  • O Naive Bayes Gaussiano tende a empurrar as probabilidades para 0 ou 1, principalmente porque a equação do Naive Bayes apenas fornece uma estimativa correta das probabilidades quando a suposição de que as características são condicionalmente independentes se mantém.
  • O Classificador de Floresta Aleatória apresenta o comportamento oposto: os histogramas mostram picos em aproximadamente 0,2 e 0,9 de probabilidade, enquanto as probabilidades próximas de 0 ou 1 são muito raras.
  • O SVM linear mostra uma curva ainda mais sigmoide do que o Classificador de Floresta Aleatória, o que é típico dos métodos de margem máxima.

Conclusão

Neste laboratório, comparámos a calibração de quatro modelos diferentes: Regressão Logística, Naive Bayes Gaussiano, Classificador de Floresta Aleatória e SVM Linear. Plotamos curvas de calibração para cada modelo e observámos que modelos bem calibrados produzem curvas que seguem a linha diagonal. Os quatro modelos apresentaram resultados diferentes, com a Regressão Logística a apresentar boa calibração e os outros modelos a demonstrarem diferentes graus de viés. A calibração é um aspeto importante dos modelos de aprendizagem automática, e modelos bem calibrados produzem probabilidades precisas e fiáveis.

Resumo

Parabéns! Concluiu o laboratório Comparação da Calibração de Classificadores. Pode praticar mais laboratórios no LabEx para melhorar as suas competências.