Comparación de la Calibración de Clasificadores

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, compararemos la calibración de cuatro modelos diferentes: Regresión Logística, Naive Bayes Gaussiano, Clasificador de Bosque Aleatorio y SVM Lineal. Se trazarán curvas de calibración para cada modelo, que muestran la relación entre las probabilidades predichas y los resultados reales. Esto es importante porque los modelos bien calibrados producen probabilidades precisas y confiables.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/naive_bayes("Naive Bayes") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/calibration("Probability Calibration") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} sklearn/naive_bayes -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} sklearn/ensemble -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} sklearn/svm -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} sklearn/model_selection -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} sklearn/calibration -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} sklearn/datasets -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} ml/sklearn -.-> lab-49088{{"Comparación de la Calibración de Clasificadores"}} end

Importar bibliotecas y generar conjunto de datos

Comenzamos importando las bibliotecas necesarias y generando un conjunto de datos de clasificación binaria sintético con 100.000 muestras y 20 características. De las 20 características, solo 2 son informativas, 2 son redundantes y las 16 restantes son no informativas. De las 100.000 muestras, 100 se utilizarán para ajustar el modelo y el resto para la prueba.

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

## Generate dataset
X, y = make_classification(
    n_samples=100_000, n_features=20, n_informative=2, n_redundant=2, random_state=42
)

train_samples = 100  ## Samples used for training the models
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    shuffle=False,
    test_size=100_000 - train_samples
)

Trazar curvas de calibración

Entrenamos cada uno de los cuatro modelos con el pequeño conjunto de datos de entrenamiento y trazamos curvas de calibración utilizando las probabilidades predichas del conjunto de datos de prueba. Las curvas de calibración se crean agrupando las probabilidades predichas, luego se traza la probabilidad predicha media en cada grupo contra la frecuencia observada ('fracción de positivos'). Debajo de la curva de calibración, trazamos un histograma que muestra la distribución de las probabilidades predichas o, más específicamente, el número de muestras en cada grupo de probabilidades predichas.

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

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

clf_list = [
    (lr, "Logistic"),
    (gnb, "Naive Bayes"),
    (svc, "SVC"),
    (rfc, "Random forest"),
]

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("Calibration plots")

## Add histogram
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="Mean predicted probability", ylabel="Count")

plt.tight_layout()
plt.show()

Interpretar curvas de calibración

Las curvas de calibración muestran la relación entre las probabilidades predichas y los resultados reales para cada modelo. Los modelos bien calibrados producen curvas que siguen la línea diagonal, lo que indica que las probabilidades predichas coinciden con los resultados reales. Los cuatro modelos producen resultados diferentes:

  • La regresión logística produce predicciones bien calibradas ya que optimiza directamente la pérdida logarítmica.
  • El Naive Bayes Gaussiano tiende a empujar las probabilidades a 0 o 1, principalmente porque la ecuación de Naive Bayes solo proporciona una estimación correcta de las probabilidades cuando se cumple la suposición de que las características son condicionalmente independientes.
  • El Clasificador de Bosque Aleatorio muestra un comportamiento opuesto: los histogramas muestran picos en aproximadamente 0,2 y 0,9 de probabilidad, mientras que las probabilidades cercanas a 0 o 1 son muy raras.
  • El SVM Lineal muestra una curva sigmoidea aún más pronunciada que el Clasificador de Bosque Aleatorio, lo que es típico de los métodos de márgenes máximos.

Conclusión

En este laboratorio, comparamos la calibración de cuatro modelos diferentes: Regresión Logística, Naive Bayes Gaussiano, Clasificador de Bosque Aleatorio y SVM Lineal. Trazamos curvas de calibración para cada modelo y observamos que los modelos bien calibrados producen curvas que siguen la línea diagonal. Los cuatro modelos produjeron resultados diferentes, con la Regresión Logística bien calibrada y los otros modelos mostrando diferentes grados de sesgo. La calibración es un aspecto importante de los modelos de aprendizaje automático, y los modelos bien calibrados producen probabilidades precisas y confiables.

Resumen

¡Felicitaciones! Has completado el laboratorio de Comparación de Calibración de Clasificadores. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.