Vergleich der Kalibrierung von Klassifizierern

Machine LearningMachine LearningBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir die Kalibrierung von vier verschiedenen Modellen vergleichen: Logistische Regression, Gaußscher Naiver Bayes, Random Forest Classifier und Linearer SVM. Für jedes Modell werden Kalibrierungskurven geplottet, die die Beziehung zwischen vorhergesagten Wahrscheinlichkeiten und tatsächlichen Ergebnissen zeigen. Dies ist wichtig, da gut kalibrierte Modelle Wahrscheinlichkeiten erzeugen, die genau und zuverlässig sind.

VM-Tipps

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.


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{{"Vergleich der Kalibrierung von Klassifizierern"}} sklearn/naive_bayes -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} sklearn/ensemble -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} sklearn/svm -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} sklearn/model_selection -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} sklearn/calibration -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} sklearn/datasets -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} ml/sklearn -.-> lab-49088{{"Vergleich der Kalibrierung von Klassifizierern"}} end

Bibliotheken importieren und Dataset generieren

Wir beginnen mit dem Import der erforderlichen Bibliotheken und der Generierung eines synthetischen binären Klassifizierungsdatasets mit 100.000 Proben und 20 Merkmalen. Von den 20 Merkmalen sind nur 2 informativ, 2 sind redundant und die verbleibenden 16 sind uninformativ. Von den 100.000 Proben werden 100 zur Modellanpassung verwendet und der Rest zur Testung.

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,
)

Kalibrierungskurven plotten

Wir trainieren jedes der vier Modelle mit dem kleinen Trainingsdataset und plotten Kalibrierungskurven mit den vorhergesagten Wahrscheinlichkeiten des Testdatasets. Kalibrierungskurven werden erstellt, indem die vorhergesagten Wahrscheinlichkeiten in Intervalle eingeteilt und dann die durchschnittliche vorhergesagte Wahrscheinlichkeit in jedem Intervall gegen die beobachtete Häufigkeit („Anteil positiver“) geplottet wird. Unter der Kalibrierungskurve plotten wir ein Histogramm, das die Verteilung der vorhergesagten Wahrscheinlichkeiten zeigt, oder genauer gesagt, die Anzahl der Proben in jedem Intervall der vorhergesagten Wahrscheinlichkeiten.

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()

Kalibrierungskurven interpretieren

Die Kalibrierungskurven zeigen die Beziehung zwischen vorhergesagten Wahrscheinlichkeiten und tatsächlichen Ergebnissen für jedes Modell. Gut kalibrierte Modelle erzeugen Kurven, die der Diagonalen folgen, was darauf hinweist, dass vorhergesagte Wahrscheinlichkeiten mit tatsächlichen Ergebnissen übereinstimmen. Die vier Modelle ergeben unterschiedliche Ergebnisse:

  • Die logistische Regression liefert gut kalibrierte Vorhersagen, da sie direkt das Log-Loss optimiert.
  • Der Gaußsche Naiver Bayes tendiert dazu, Wahrscheinlichkeiten auf 0 oder 1 zu drängen, hauptsächlich weil die Gleichung des naiven Bayes nur eine korrekte Schätzung der Wahrscheinlichkeiten liefert, wenn die Annahme der bedingten Unabhängigkeit der Merkmale zutrifft.
  • Der Random Forest Classifier zeigt das Gegenteil: Die Histogramme zeigen Spitzen bei einer Wahrscheinlichkeit von ca. 0,2 und 0,9, während Wahrscheinlichkeiten nahe bei 0 oder 1 sehr selten sind.
  • Der Lineare SVM zeigt eine noch sigmoidere Kurve als der Random Forest Classifier, was für Maximum-Margin-Methoden typisch ist.

Fazit

In diesem Lab haben wir die Kalibrierung von vier verschiedenen Modellen verglichen: Logistische Regression, Gaußscher Naiver Bayes, Random Forest Classifier und Linearer SVM. Wir haben für jedes Modell Kalibrierungskurven geplottet und festgestellt, dass gut kalibrierte Modelle Kurven erzeugen, die der Diagonalen folgen. Die vier Modelle haben unterschiedliche Ergebnisse geliefert, wobei die logistische Regression gut kalibriert war und die anderen Modelle unterschiedliche Grade an Bias zeigten. Die Kalibrierung ist ein wichtiger Aspekt von Machine-Learning-Modellen, und gut kalibrierte Modelle erzeugen Wahrscheinlichkeiten, die genau und zuverlässig sind.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab "Vergleich der Kalibrierung von Klassifizierern" abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.