Zum Hauptinhalt springen
Strg+K
scikit-learn homepage scikit-learn homepage
  • Installieren
  • Benutzerhandbuch
  • API
  • Beispiele
  • Community
    • Erste Schritte
    • Versionsverlauf
    • Glossar
    • Entwicklung
    • FAQ
    • Support
    • Verwandte Projekte
    • Roadmap
    • Steuerung
    • Über uns
  • GitHub
  • Installieren
  • Benutzerhandbuch
  • API
  • Beispiele
  • Community
  • Erste Schritte
  • Versionsverlauf
  • Glossar
  • Entwicklung
  • FAQ
  • Support
  • Verwandte Projekte
  • Roadmap
  • Steuerung
  • Über uns
  • GitHub

Abschnittsnavigation

  • Release Highlights
    • Release Highlights für scikit-learn 1.8
    • Release Highlights für scikit-learn 1.7
    • Release Highlights für scikit-learn 1.6
    • Release Highlights für scikit-learn 1.5
    • Release Highlights für scikit-learn 1.4
    • Release Highlights für scikit-learn 1.3
    • Release Highlights für scikit-learn 1.2
    • Release Highlights für scikit-learn 1.1
    • Release Highlights für scikit-learn 1.0
    • Release Highlights für scikit-learn 0.24
    • Release Highlights für scikit-learn 0.23
    • Release Highlights für scikit-learn 0.22
  • Biclustering
    • Eine Demo des Spectral Biclustering Algorithmus
    • Eine Demo des Spectral Co-Clustering Algorithmus
    • Biclustering von Dokumenten mit dem Spectral Co-Clustering Algorithmus
  • Kalibrierung
    • Vergleich der Kalibrierung von Klassifikatoren
    • Wahrscheinlichkeitskalibrierungskurven
    • Wahrscheinlichkeitskalibrierung für 3-Klassen-Klassifikation
    • Wahrscheinlichkeitskalibrierung von Klassifikatoren
  • Klassifikation
    • Klassifikator-Vergleich
    • Lineare und Quadratische Diskriminanzanalyse mit Kovarianzellipsoid
    • Normale, Ledoit-Wolf und OAS Lineare Diskriminanzanalyse zur Klassifikation
    • Klassifikationswahrscheinlichkeit plotten
    • Erkennung handschriftlicher Ziffern
  • Clustering
    • Eine Demo des K-Means Clusterings auf den handschriftlichen Zifferndaten
    • Eine Demo des strukturierten Ward Hierarchischen Clusterings auf einem Bild von Münzen
    • Eine Demo des Mean-Shift Clustering Algorithmus
    • Anpassung für Zufälligkeit in der Clusterleistungsbewertung
    • Agglomeratives Clustering mit verschiedenen Metriken
    • Ein Beispiel für K-Means++ Initialisierung
    • Vergleich der Leistung von Bisecting K-Means und Regular K-Means
    • Vergleich von BIRCH und MiniBatchKMeans
    • Vergleich verschiedener Clustering-Algorithmen auf Toy-Datensätzen
    • Vergleich verschiedener hierarchischer Linkage-Methoden auf Toy-Datensätzen
    • Vergleich der K-Means und MiniBatchKMeans Clustering-Algorithmen
    • Demo des DBSCAN Clustering Algorithmus
    • Demo des HDBSCAN Clustering Algorithmus
    • Demo des OPTICS Clustering Algorithmus
    • Demo des Affinity Propagation Clustering Algorithmus
    • Demonstration von K-Means Annahmen
    • Empirische Auswertung des Einflusses der K-Means Initialisierung
    • Merkmalsagglomeration
    • Merkmalsagglomeration vs. univariate Auswahl
    • Hierarchisches Clustering mit und ohne Struktur
    • Induktives Clustering
    • Online-Lernen eines Diktionärs von Gesichtsteilen
    • Hierarchisches Clustering Dendrogramm plotten
    • Segmentierung des Bildes von griechischen Münzen in Regionen
    • Auswahl der Anzahl von Clustern mit Silhouette-Analyse auf KMeans-Clustering
    • Spektrales Clustering für Bildsegmentierung
    • Verschiedenes Agglomeratives Clustering auf einer 2D-Einbettung von Ziffern
    • Vektorquantisierungsbeispiel
  • Kovarianzschätzung
    • Ledoit-Wolf vs OAS Schätzung
    • Robuste Kovarianzschätzung und Relevanz von Mahalanobis-Distanzen
    • Robuste vs. Empirische Kovarianzschätzung
    • Schrumpfkovarianzschätzung: LedoitWolf vs OAS und Maximum-Likelihood
    • Schwachstellen-Inverse Kovarianzschätzung
  • Kreuzzerlegung
    • Vergleich von Kreuzzerlegungsmethoden
    • Principal Component Regression vs. Partial Least Squares Regression
  • Datensatzbeispiele
    • Zufällig generierten Multilabel-Datensatz plotten
  • Entscheidungsbäume
    • Entscheidungsbaum-Regression
    • Entscheidungsfläche von Entscheidungsbäumen, trainiert auf dem Iris-Datensatz, plotten
    • Post-Pruning Entscheidungsbäume mit Kostenkomplexität
    • Verständnis der Entscheidungsbaumstruktur
  • Zerlegung
    • Blind Source Separation mit FastICA
    • Vergleich von LDA und PCA 2D-Projektion des Iris-Datensatzes
    • Zerlegung von Gesicht-Datensätzen
    • Faktorenanalyse (mit Rotation) zur Visualisierung von Mustern
    • FastICA auf 2D Punktwolken
    • Bildrauschen mit Dictionary Learning
    • Inkrementelles PCA
    • Kernel PCA
    • Modellauswahl mit Probabilistischem PCA und Faktorenanalyse (FA)
    • Principal Component Analysis (PCA) auf dem Iris-Datensatz
    • Sparse Coding mit einem voreingestellten Dictionary
  • Entwickeln von Schätzern
    • __sklearn_is_fitted__ als Entwickler-API
  • Ensemble-Methoden
    • Unterstützung für kategorische Merkmale in Gradient Boosting
    • Prädiktoren mit Stacking kombinieren
    • Vergleich von Random Forests und Histogram Gradient Boosting Modellen
    • Vergleich von Random Forests und dem Multi-Output Meta-Estimator
    • Entscheidungsbaum-Regression mit AdaBoost
    • Frühes Stoppen in Gradient Boosting
    • Merkmalswichtigkeiten mit einem Wald von Bäumen
    • Merkmals Transformationen mit Ensemble von Bäumen
    • Merkmale in Histogram Gradient Boosting Bäumen
    • Gradient Boosting Out-of-Bag Schätzungen
    • Gradient Boosting Regression
    • Gradient Boosting Regularisierung
    • Hashing-Merkmals-Transformation mit Totally Random Trees
    • IsolationForest Beispiel
    • Monotone Einschränkungen
    • Multi-Klassen AdaBoosted Entscheidungsbäume
    • OOB-Fehler für Random Forests
    • Vorhersagen von einzelnen und abstimmenden Regressionsmodellen plotten
    • Entscheidungsflächen von Ensembles von Bäumen auf dem Iris-Datensatz plotten
    • Vorhersageintervalle für Gradient Boosting Regression
    • Einzelner Estimator versus Bagging: Bias-Varianz-Zerlegung
    • Zwei-Klassen-AdaBoost
    • Visualisierung der probabilistischen Vorhersagen eines VotingClassifier
  • Beispiele basierend auf realen Datensätzen
    • Kompression Sensing: Tomographie-Rekonstruktion mit L1-Prior (Lasso)
    • Gesichtserkennungsbeispiel mit Eigenfaces und SVMs
    • Bildrauschen mit Kernel PCA
    • Verzögerte Merkmale für Zeitreihen-Prognose
    • Einfluss der Modellkomplexität
    • Out-of-Core Klassifikation von Textdokumenten
    • Ausreißererkennung auf einem realen Datensatz
    • Vorhersage-Latenz
    • Artenschutzmodellierung
    • Zeitbezogene Merkmalskonstruktion
    • Themenextraktion mit Non-negative Matrix Factorization und Latent Dirichlet Allocation
    • Visualisierung der Aktienmarktstruktur
    • Wikipedia-Haupteigenvektor
  • Merkmalsauswahl
    • Vergleich von F-Test und Mutual Information
    • Modellbasierte und sequentielle Merkmalsauswahl
    • Pipeline ANOVA SVM
    • Rekursive Merkmalseliminierung
    • Rekursive Merkmalseliminierung mit Kreuzvalidierung
    • Univariate Merkmalsauswahl
  • Gefrorene Schätzer
    • Beispiele für die Verwendung von FrozenEstimator
  • Gaußsche Mischmodelle
    • Analyse des Konzentrations-Prior-Typs der Variation im Bayes'schen Gaußschen Gemisch
    • Dichteschätzung für ein Gaußsches Gemisch
    • GMM Initialisierungsmethoden
    • GMM Kovarianzen
    • Gaußsche Mischmodell-Ellipsoide
    • Gaußsche Mischmodell-Auswahl
    • Gaußsche Mischmodell-Sinuskurve
  • Gauß-Prozess für maschinelles Lernen
    • Fähigkeit der Gauß-Prozess-Regression (GPR) zur Schätzung des Datenrauschpegels
    • Vergleich von Kernel Ridge und Gauß-Prozess-Regression
    • Prognose des CO2-Spiegels im Mona Loa Datensatz mittels Gauß-Prozess-Regression (GPR)
    • Gauß-Prozesse Regression: grundlegendes Einführungsexempel
    • Gauß-Prozess-Klassifikation (GPC) auf dem Iris-Datensatz
    • Gauß-Prozesse auf diskreten Datenstrukturen
    • Illustration der Gauß-Prozess-Klassifikation (GPC) auf dem XOR-Datensatz
    • Illustration von Prior und Posterior Gauß-Prozess für verschiedene Kerne
    • Iso-Wahrscheinlichkeitslinien für Gauß-Prozesse Klassifikation (GPC)
    • Probabilistische Vorhersagen mit Gauß-Prozess-Klassifikation (GPC)
  • Generalisierte Lineare Modelle
    • Vergleich von linearen Bayes'schen Regressoren
    • Kurvenanpassung mit Bayes'scher Ridge-Regression
    • Entscheidungsgrenzen von multinomialer und One-vs-Rest Logistischer Regression
    • Frühes Stoppen von Stochastic Gradient Descent
    • Anpassen eines Elastic Net mit einer voreingestellten Gram-Matrix und gewichteten Stichproben
    • HuberRegressor vs Ridge auf Datensatz mit starken Ausreißern
    • Gemeinsame Merkmalsauswahl mit Multi-Task Lasso
    • L1-Strafe und Sparsity in Logistischer Regression
    • L1-basierte Modelle für sparse Signale
    • Lasso-Modellauswahl über Informationskriterien
    • Lasso-Modellauswahl: AIC-BIC / Kreuzvalidierung
    • Lasso auf dichten und spärlichen Daten
    • Lasso, Lasso-LARS und Elastic Net Pfade
    • MNIST-Klassifikation mittels multinomialer Logistik + L1
    • Multiklassen-Sparse-Logistische-Regression auf 20newgroups
    • Nicht-negative kleinste Quadrate
    • One-Class SVM vs. One-Class SVM mittels Stochastic Gradient Descent
    • Gewöhnliche kleinste Quadrate und Ridge Regression
    • Orthogonal Matching Pursuit
    • Ridge-Koeffizienten als Funktion der Regularisierung plotten
    • Multi-Klassen SGD auf dem Iris-Datensatz plotten
    • Poisson-Regression und nicht-normale Verlustfunktion
    • Polynomielle und Spline-Interpolation
    • Quantilregression
    • Regularisierungspfad der L1-Logistischen Regression
    • Ridge-Koeffizienten als Funktion der L2-Regularisierung
    • Robuste lineare Schätzeranpassung
    • Robuste lineare Modellschätzung mit RANSAC
    • SGD: Maximum Margin Trennhyperplane
    • SGD: Strafen
    • SGD: Gewichtete Stichproben
    • SGD: konvexe Verlustfunktionen
    • Theil-Sen Regression
    • Tweedie-Regression auf Versicherungsansprüchen
  • Inspektion
    • Häufige Fallstricke bei der Interpretation von Koeffizienten linearer Modelle
    • Versagen des maschinellen Lernens bei der Inferenz kausaler Effekte
    • Partial Dependence und Individual Conditional Expectation Plots
    • Permutations-Wichtigkeit vs. Random Forest Merkmals-Wichtigkeit (MDI)
    • Permutations-Wichtigkeit bei multikollinearen oder korrelierten Merkmalen
  • Kernel-Approximation
    • Skalierbares Lernen mit Polynom-Kernel-Approximation
  • Manifold Learning
    • Vergleich von Manifold Learning Methoden
    • Manifold Learning Methoden auf einer abgetrennten Sphäre
    • Manifold Learning auf handschriftlichen Ziffern: Locally Linear Embedding, Isomap…
    • Mehrdimensionale Skalierung
    • Swiss Roll und Swiss-Hole Reduktion
    • t-SNE: Der Effekt verschiedener Perplexitätswerte auf die Form
  • Verschiedenes
    • Fortgeschrittene Plotting mit Partial Dependence
    • Vergleich von Anomalieerkennungsalgorithmen zur Ausreißererkennung auf Toy-Datensätzen
    • Vergleich von Kernel Ridge Regression und SVR
    • Pipelines anzeigen
    • Schätzer und komplexe Pipelines anzeigen
    • Bewertung von Ausreißererkennungs-Schätzern
    • Explizite Feature-Map-Approximation für RBF-Kerne
    • Gesichtsvervollständigung mit Multi-Output-Schätzern
    • Einführung der set_output API
    • Isotone Regression
    • Metadaten-Routing
    • Multilabel-Klassifikation
    • ROC-Kurve mit Visualisierungs-API
    • Die Johnson-Lindenstrauss-Schranke für Einbettung mit zufälligen Projektionen
    • Visualisierungen mit Display-Objekten
  • Fehlende Wert-Imputation
    • Fehlende Werte imputieren, bevor ein Schätzer erstellt wird
    • Fehlende Werte mit Varianten von IterativeImputer imputieren
  • Modellauswahl
    • Modellkomplexität und kreuzvalidierter Score ausbalancieren
    • Klassen-Likelihood-Verhältnisse zur Messung der Klassifikationsleistung
    • Vergleich von zufälliger Suche und Gitter-Suche zur Hyperparameter-Schätzung
    • Vergleich zwischen Gitter-Suche und sukzessiver Halbierung
    • Benutzerdefinierte Refit-Strategie einer Gitter-Suche mit Kreuzvalidierung
    • Demonstration von Multi-Metrik-Bewertung auf cross_val_score und GridSearchCV
    • Detection Error Tradeoff (DET) Kurve
    • Auswirkung der Modellregularisierung auf Trainings- und Testfehler
    • Leistung eines Klassifikators mit Konfusionsmatrix bewerten
    • Multiklassen-Receiver Operating Characteristic (ROC)
    • Verschachtelte vs. nicht verschachtelte Kreuzvalidierung
    • Kreuzvalidierte Vorhersagen plotten
    • Lernkurven plotten und die Skalierbarkeit von Modellen prüfen
    • Post-hoc-Anpassung des Cut-off-Punkts der Entscheidungskfunktion
    • Post-Hoc-Anpassung des Entscheidungsschwellenwerts für kostenempfindliches Lernen
    • Präzisions-Rückruf
    • Receiver Operating Characteristic (ROC) mit Kreuzvalidierung
    • Beispiel-Pipeline für Textmerkmal-Extraktion und -Bewertung
    • Statistischer Vergleich von Modellen mittels Gitter-Suche
    • Sukzessive Halbierungs-Iterationen
    • Testen der Signifikanz eines Klassifikations-Scores mit Permutationen
    • Unter-Anpassung vs. Über-Anpassung
    • Visualisierung des Kreuzvalidierungsverhaltens in scikit-learn
  • Multiklassen-Methoden
    • Übersicht über Multiklassen-Training Meta-Estimator
  • Multi-Output-Methoden
    • Multilabel-Klassifikation mit einem Klassifikator-Ketten
  • Nächste Nachbarn
    • Annähernde nächste Nachbarn in TSNE
    • Caching nächster Nachbarn
    • Vergleich von Nächsten Nachbarn mit und ohne Neighborhood Components Analysis
    • Dimensionsreduktion mit Neighborhood Components Analysis
    • Kernel-Dichteschätzung von Artenverteilungen
    • Kernel-Dichteschätzung
    • Nearest Centroid Klassifikation
    • Nearest Neighbors Klassifikation
    • Nearest Neighbors Regression
    • Neighborhood Components Analysis Illustration
    • Neuartigkeitserkennung mit Local Outlier Factor (LOF)
    • Ausreißererkennung mit Local Outlier Factor (LOF)
    • Einfache 1D Kernel-Dichteschätzung
  • Neuronale Netze
    • Vergleich von stochastischen Lernstrategien für MLPClassifier
    • Restricted Boltzmann Machine Merkmale für Ziffernklassifikation
    • Variierende Regularisierung im Multi-Layer Perceptron
    • Visualisierung von MLP-Gewichten auf MNIST
  • Pipelines und zusammengesetzte Schätzer
    • Column Transformer mit heterogenen Datenquellen
    • Column Transformer mit gemischten Typen
    • Verkettung mehrerer Merkmalsextraktionsmethoden
    • Auswirkung der Transformation der Ziele in einem Regressionsmodell
    • Pipelining: Verkettung einer PCA und einer logistischen Regression
    • Dimensionsreduktion auswählen mit Pipeline und GridSearchCV
  • Vorverarbeitung
    • Vergleich der Auswirkungen verschiedener Skalierer auf Daten mit Ausreißern
    • Vergleich von Target Encoder mit anderen Encodern
    • Demonstration der verschiedenen Strategien von KBinsDiscretizer
    • Merkmalsdiskretisierung
    • Bedeutung der Merkmalskalierung
    • Daten auf eine Normalverteilung abbilden
    • Target Encoders interne Kreuzanpassung
    • Verwendung von KBinsDiscretizer zur Diskretisierung kontinuierlicher Merkmale
  • Semi-Supervised Klassifikation
    • Entscheidungsgrenze semi-überwachter Klassifikatoren vs. SVM auf dem Iris-Datensatz
    • Auswirkung der Änderung des Schwellenwerts für Self-Training
    • Label Propagation Kreise: Lernen einer komplexen Struktur
    • Label Propagation Ziffern: Aktives Lernen
    • Label Propagation Ziffern: Leistung demonstrieren
    • Semi-überwachte Klassifikation auf einem Textdatensatz
  • Support Vector Machines
    • One-Class SVM mit nicht-linearem Kernel (RBF)
    • Klassifikationsgrenzen mit verschiedenen SVM-Kernen plotten
    • Verschiedene SVM-Klassifikatoren im Iris-Datensatz plotten
    • Support Vektoren in LinearSVC plotten
    • RBF SVM Parameter
    • SVM-Randbeispiel
    • SVM-Gleichstandsbeispiel
    • SVM mit benutzerdefiniertem Kernel
    • SVM-Anova: SVM mit universitärer Merkmalsauswahl
    • SVM: Maximum Margin Trennhyperplane
    • SVM: Trennhyperplane für unausgeglichene Klassen
    • SVM: Gewichtete Stichproben
    • Skalierung des Regularisierungsparameters für SVCs
    • Support Vector Regression (SVR) mit linearen und nicht-linearen Kernen
  • Arbeiten mit Textdokumenten
    • Klassifikation von Textdokumenten mit spärlichen Merkmalen
    • Clustering von Textdokumenten mit K-Means
    • FeatureHasher und DictVectorizer Vergleich
  • Beispiele
  • Modellauswahl
  • Statistischer Vergleich von Modellen mittels Gitter-Suche

Hinweis

Zum Ende springen, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel direkt in Ihrem Browser über JupyterLite oder Binder auszuführen.

Statistischer Vergleich von Modellen mittels Grid Search#

Dieses Beispiel veranschaulicht, wie die Leistung von Modellen, die trainiert und bewertet wurden, mittels GridSearchCV statistisch verglichen werden kann.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Wir beginnen mit der Simulation von Mond-förmigen Daten (bei denen die ideale Trennung zwischen den Klassen nicht-linear ist) und fügen einen moderaten Grad an Rauschen hinzu. Die Datenpunkte gehören zu einer von zwei möglichen Klassen, die anhand von zwei Merkmalen vorhergesagt werden sollen. Wir simulieren 50 Stichproben für jede Klasse.

import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.datasets import make_moons

X, y = make_moons(noise=0.352, random_state=1, n_samples=100)

sns.scatterplot(
    x=X[:, 0], y=X[:, 1], hue=y, marker="o", s=25, edgecolor="k", legend=False
).set_title("Data")
plt.show()
Data

Wir werden die Leistung von SVC-Estimators vergleichen, die in ihrem kernel-Parameter variieren, um zu entscheiden, welche Wahl dieses Hyperparameters unsere simulierten Daten am besten vorhersagt. Wir werden die Leistung der Modelle mit RepeatedStratifiedKFold bewerten, wobei wir eine 10-fache stratifizierte Kreuzvalidierung 10 Mal wiederholen, wobei bei jeder Wiederholung eine andere Zufallszuordnung der Daten verwendet wird. Die Leistung wird mit roc_auc_score bewertet.

from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
from sklearn.svm import SVC

param_grid = [
    {"kernel": ["linear"]},
    {"kernel": ["poly"], "degree": [2, 3]},
    {"kernel": ["rbf"]},
]

svc = SVC(random_state=0)

cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=10, random_state=0)

search = GridSearchCV(estimator=svc, param_grid=param_grid, scoring="roc_auc", cv=cv)
search.fit(X, y)
GridSearchCV(cv=RepeatedStratifiedKFold(n_repeats=10, n_splits=10, random_state=0),
             estimator=SVC(random_state=0),
             param_grid=[{'kernel': ['linear']},
                         {'degree': [2, 3], 'kernel': ['poly']},
                         {'kernel': ['rbf']}],
             scoring='roc_auc')
In einer Jupyter-Umgebung führen Sie diese Zelle bitte erneut aus, um die HTML-Darstellung anzuzeigen, oder vertrauen Sie dem Notebook.
Auf GitHub kann die HTML-Darstellung nicht gerendert werden. Versuchen Sie bitte, diese Seite mit nbviewer.org zu laden.
Parameter
estimator estimator: Estimator-Objekt

Es wird angenommen, dass dies die scikit-learn-Estimator-Schnittstelle implementiert.
Entweder muss der Estimator eine ``score``-Funktion bereitstellen,
oder ``scoring`` muss übergeben werden.
SVC(random_state=0)
param_grid param_grid: dict oder Liste von Dictionaries

Dictionary mit Parameternamen (`str`) als Schlüssel und Listen von
zu versuchenden Parametereinstellungen als Werte, oder eine Liste solcher
Dictionaries, in welchem Fall die von jedem Dictionary im Gitter
aufgespannten Gitter durchsucht werden. Dies ermöglicht die Suche über jede
Sequenz von Parametereinstellungen.
[{'kernel': ['linear']}, {'degree': [2, 3], 'kernel': ['poly']}, ...]
scoring scoring: str, callable, list, tuple oder dict, default=None

Strategie zur Bewertung der Leistung des kreuzvalidierten Modells auf
dem Testdatensatz.

Wenn `scoring` eine einzelne Punktzahl darstellt, kann man verwenden:

- einen einzelnen String (siehe :ref:`scoring_string_names`);
- ein Callable (siehe :ref:`scoring_callable`), das einen einzelnen Wert zurückgibt;
- `None`, das :ref:`Standard-Bewertungskriterium des Estimators ` wird verwendet.

Wenn `scoring` mehrere Punktzahlen darstellt, kann man verwenden:

- eine Liste oder ein Tupel eindeutiger Strings;
- ein Callable, das ein Dictionary zurückgibt, dessen Schlüssel die Metriknamen
und dessen Werte die Metrikpunktzahlen sind;
- ein Dictionary mit Metriknamen als Schlüssel und Callables als Werte.

Siehe :ref:`multimetric_grid_search` für ein Beispiel.
'roc_auc'
n_jobs n_jobs: int, default=None

Anzahl der parallel auszuführenden Jobs.
``None`` bedeutet 1, es sei denn, es befindet sich in einem :obj:`joblib.parallel_backend`-Kontext.
``-1`` bedeutet die Verwendung aller Prozessoren. Siehe :term:`Glossar `
für weitere Details.

.. versionchanged:: v0.20
Standardwert von `n_jobs` wurde von 1 auf None geändert.
None
refit refit: bool, str, oder callable, default=True

Ein Estimator wird mit den besten gefundenen Parametern auf dem gesamten Datensatz neu trainiert.

Bei der Bewertung mehrerer Metriken muss dies ein `str` sein, der den Scorer angibt, der verwendet wird, um die besten Parameter für das anschließende Neutrainieren des Estimators zu finden.

Wenn bei der Auswahl eines besten Estimators andere Überlegungen als die maximale Punktzahl vorliegen, kann ``refit`` auf eine Funktion gesetzt werden, die den ausgewählten ``best_index_`` unter Angabe von ``cv_results_`` zurückgibt. In diesem Fall werden der ``best_estimator_`` und ``best_params_`` gemäß dem zurückgegebenen ``best_index_`` gesetzt, während das Attribut ``best_score_`` nicht verfügbar ist.

Der neu trainierte Estimator ist unter dem Attribut ``best_estimator_`` verfügbar und ermöglicht die direkte Verwendung von ``predict`` auf dieser ``GridSearchCV``-Instanz.

Auch bei der Bewertung mehrerer Metriken sind die Attribute ``best_index_``, ``best_score_`` und ``best_params_`` nur verfügbar, wenn ``refit`` gesetzt ist, und alle werden in Bezug auf diesen spezifischen Scorer bestimmt.

Siehe den Parameter ``scoring``, um mehr über die Bewertung mehrerer Metriken zu erfahren.

Siehe :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_digits.py`, um zu sehen, wie mit einer aufrufbaren Funktion über `refit` eine benutzerdefinierte Auswahlstrategie entworfen wird.

Siehe :ref:`dieses Beispiel
` für ein Beispiel, wie ``refit=callable`` verwendet wird, um die Modellkomplexität und den Kreuzvalidierungs-Score auszugleichen.

.. versionchanged:: 0.20
Unterstützung für callable hinzugefügt.
True
cv cv: int, cross-validation generator oder ein Iterable, default=None

Bestimmt die Kreuzvalidierungs-Splitting-Strategie.
Mögliche Eingaben für cv sind:

- None, um die Standard-5-Falt-Kreuzvalidierung zu verwenden,
- Ganzzahl, um die Anzahl der Faltungen in einem `(Stratified)KFold` anzugeben,
- :term:`CV-Splitter`,
- Ein Iterable, das (Trainings-, Test-)Splits als Index-Arrays liefert.

Bei Ganzzahl-/None-Eingaben wird, wenn der Estimator ein Klassifikator ist und ``y``
entweder binär oder multiklass ist, :class:`StratifiedKFold` verwendet. In allen
anderen Fällen wird :class:`KFold` verwendet. Diese Splitter werden mit
`shuffle=False` instanziiert, sodass die Splits über Aufrufe hinweg gleich
sind.

Siehe das :ref:`Benutzerhandbuch ` für die verschiedenen
Kreuzvalidierungsstrategien, die hier verwendet werden können.

.. versionchanged:: 0.22
Standardwert von ``cv``, wenn None, wurde von 3-Falt auf 5-Falt geändert.
RepeatedStrat...andom_state=0)
verbose verbose: int

Steuert die Ausführlichkeit: Je höher, desto mehr Nachrichten.

- >1 : Die Berechnungszeit für jede Faltung und jeden Parameterkandidaten wird
angezeigt;
- >2 : Die Punktzahl wird ebenfalls angezeigt;
- >3 : Die Faltungs- und Parameterkandidatenindizes werden ebenfalls angezeigt,
zusammen mit der Startzeit der Berechnung.
0
pre_dispatch pre_dispatch: int oder str, default='2*n_jobs'

Steuert die Anzahl der Jobs, die während der parallelen Ausführung
ausgeliefert werden. Die Reduzierung dieser Anzahl kann nützlich sein, um eine
Explosion des Speicherverbrauchs zu vermeiden, wenn mehr Jobs ausgeliefert werden,
als CPUs verarbeiten können. Dieser Parameter kann sein:

- None, in diesem Fall werden alle Jobs sofort erstellt und gespawnt. Verwenden
Sie dies für leichte und schnell laufende Jobs, um Verzögerungen durch On-Demand-
Spawning der Jobs zu vermeiden
- Eine Ganzzahl, die die genaue Gesamtzahl der gespawnten Jobs angibt
- Ein String, der einen Ausdruck als Funktion von n_jobs angibt, z. B. '2*n_jobs'
'2*n_jobs'
error_score error_score: 'raise' oder numerisch, default=np.nan

Wert, der der Punktzahl zugewiesen wird, wenn beim Anpassen des Estimators ein Fehler auftritt.
Wenn auf 'raise' gesetzt, wird der Fehler ausgelöst. Wenn eine numerische
Zahl angegeben wird, wird FitFailedWarning ausgelöst. Dieser Parameter
beeinflusst den Refit-Schritt nicht, der immer den Fehler auslösen wird.
nan
return_train_score return_train_score: bool, default=False

Wenn ``False``, enthält das Attribut ``cv_results_`` keine Trainingspunktzahlen.
Die Berechnung von Trainingspunktzahlen wird verwendet, um Einblicke zu gewinnen,
wie verschiedene Parametereinstellungen den Kompromiss zwischen Überanpassung/Unteranpassung
beeinflussen. Die Berechnung der Punktzahlen auf dem Trainingsdatensatz kann jedoch
rechenintensiv sein und ist nicht unbedingt erforderlich, um die Parameter
auszuwählen, die die beste Generalisierungsleistung erzielen.

.. versionadded:: 0.19

.. versionchanged:: 0.21
Der Standardwert wurde von ``True`` auf ``False`` geändert.
False
SVC(random_state=0)
Parameter
C C: float, Standard=1.0

Regularisierungsparameter. Die Stärke der Regularisierung ist umgekehrt proportional zu C. Muss strikt positiv sein. Die Strafe ist eine quadratische l2-Strafe. Für eine intuitive Visualisierung der Auswirkungen der Skalierung des Regularisierungsparameters C siehe :ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`.
1.0
kernel kernel: {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'} oder callable, Standard='rbf'

Gibt den zu verwendenden Kernel-Typ im Algorithmus an. Wenn keiner angegeben ist, wird 'rbf' verwendet. Wenn ein Callable angegeben ist, wird es verwendet, um die Kernel-Matrix aus Datenmatrizen vorab zu berechnen; diese Matrix sollte ein Array der Form ``(n_samples, n_samples)`` sein. Für eine intuitive Visualisierung verschiedener Kernel-Typen siehe :ref:`sphx_glr_auto_examples_svm_plot_svm_kernels.py`.
'rbf'
degree degree: int, Standard=3

Grad der polynomialen Kernel-Funktion ('poly'). Muss nicht-negativ sein. Ignoriert von allen anderen Kernels.
3
gamma gamma: {'scale', 'auto'} oder float, Standard='scale'

Kernel-Koeffizient für 'rbf', 'poly' und 'sigmoid'.

- Wenn ``gamma='scale'`` (Standard) übergeben wird, verwendet es 1 / (n_features * X.var()) als Wert von gamma,
- Wenn 'auto', verwendet es 1 / n_features
- Wenn float, muss es nicht-negativ sein.

.. versionchanged:: 0.22
Der Standardwert von ``gamma`` hat sich von 'auto' zu 'scale' geändert.
'scale'
coef0 coef0: float, Standard=0.0

Unabhängiger Term in der Kernel-Funktion. Er ist nur bei 'poly' und 'sigmoid' signifikant.
0.0
shrinking shrinking: bool, Standard=True

Ob die Schrumpfungsheuristik verwendet werden soll. Siehe das :ref:`Benutzerhandbuch `.
True
probability probability: bool, Standard=False

Ob Wahrscheinlichkeitsschätzungen aktiviert werden sollen. Dies muss vor dem Aufruf von `fit` aktiviert werden und verlangsamt diese Methode, da sie intern eine 5-fache Kreuzvalidierung verwendet, und `predict_proba` kann inkonsistent mit `predict` sein. Lesen Sie mehr im :ref:`Benutzerhandbuch `.
False
tol tol: float, Standard=1e-3

Toleranz für das Abbruchkriterium.
0.001
cache_size cache_size: float, Standard=200

Gibt die Größe des Kernel-Caches an (in MB).
200
class_weight class_weight: dict oder 'balanced', Standard=None

Setzt den Parameter C der Klasse i auf class_weight[i]*C für SVC. Wenn nicht angegeben, wird angenommen, dass alle Klassen das Gewicht eins haben.
Der Modus "balanced" verwendet die Werte von y, um die Gewichte automatisch invers proportional zu den Klassenhäufigkeiten in den Eingabedaten als ``n_samples / (n_classes * np.bincount(y))`` anzupassen.
None
verbose verbose: bool, Standard=False

Detaillierte Ausgabe aktivieren. Beachten Sie, dass diese Einstellung eine prozessweite Laufzeiteinstellung in libsvm nutzt, die, wenn sie aktiviert ist, in einem Multithreading-Kontext möglicherweise nicht richtig funktioniert.
False
max_iter max_iter: int, Standard=-1

Harte Grenze für Iterationen innerhalb des Lösers oder -1 für keine Grenze.
-1
decision_function_shape decision_function_shape: {'ovo', 'ovr'}, Standard='ovr'

Gibt zurück, ob eine One-vs-Rest ('ovr') Entscheidungsfunktion der Form (n_samples, n_classes) wie bei allen anderen Klassifikatoren zurückgegeben werden soll, oder die ursprüngliche One-vs-One ('ovo') Entscheidungsfunktion von libsvm, die die Form (n_samples, n_classes * (n_classes - 1) / 2) hat. Beachten Sie jedoch, dass intern One-vs-One ('ovo') immer als Multi-Class-Strategie zum Trainieren von Modellen verwendet wird; eine ovr-Matrix wird nur aus der ovo-Matrix konstruiert.
Der Parameter wird für die binäre Klassifikation ignoriert.

.. versionchanged:: 0.19
decision_function_shape ist standardmäßig 'ovr'.

.. versionadded:: 0.17
*decision_function_shape='ovr'* wird empfohlen.

.. versionchanged:: 0.17
Deprecated *decision_function_shape='ovo' und None*.
'ovr'
break_ties break_ties: bool, Standard=False

Wenn true, ``decision_function_shape='ovr'`` und die Anzahl der Klassen > 2 ist, ``predict`` wird Bindungen gemäß den Konfidenzwerten von ``decision_function`` auflösen; andernfalls wird die erste Klasse unter den gebundenen Klassen zurückgegeben. Bitte beachten Sie, dass das Auflösen von Bindungen mit relativ hohen Rechenkosten im Vergleich zu einem einfachen Predict verbunden ist. Siehe :ref:`sphx_glr_auto_examples_svm_plot_svm_tie_breaking.py` für ein Beispiel seiner Verwendung mit ``decision_function_shape='ovr'``.

.. versionadded:: 0.22
False
random_state random_state: int, RandomState-Instanz oder None, Standard=None

Steuert die pseudo-zufällige Zahlengenerierung zum Mischen der Daten für Wahrscheinlichkeitsschätzungen. Ignoriert, wenn `probability` False ist.
Geben Sie eine Ganzzahl für reproduzierbare Ergebnisse über mehrere Funktionsaufrufe an.
Siehe :term:`Glossar `.
0


Wir können nun die Ergebnisse unserer Suche inspizieren, sortiert nach ihrem mean_test_score

import pandas as pd

results_df = pd.DataFrame(search.cv_results_)
results_df = results_df.sort_values(by=["rank_test_score"])
results_df = results_df.set_index(
    results_df["params"].apply(lambda x: "_".join(str(val) for val in x.values()))
).rename_axis("kernel")
results_df[["params", "rank_test_score", "mean_test_score", "std_test_score"]]
params rank_test_score mean_test_score std_test_score
kernel
rbf {'kernel': 'rbf'} 1 0.9400 0.079297
linear {'kernel': 'linear'} 2 0.9300 0.077846
3_poly {'degree': 3, 'kernel': 'poly'} 3 0.9044 0.098776
2_poly {'degree': 2, 'kernel': 'poly'} 4 0.6852 0.169106


Wir sehen, dass der Estimator mit dem 'rbf'-Kernel die beste Leistung erbrachte, dicht gefolgt von 'linear'. Beide Estimators mit einem 'poly'-Kernel zeigten eine schlechtere Leistung, wobei der mit einem polynomialen Grad von zwei eine deutlich geringere Leistung als alle anderen Modelle erreichte.

Normalerweise endet die Analyse hier, aber die Hälfte der Geschichte fehlt. Die Ausgabe von GridSearchCV liefert keine Informationen über die Sicherheit der Unterschiede zwischen den Modellen. Wir wissen nicht, ob diese **statistisch** signifikant sind. Um dies zu bewerten, müssen wir einen statistischen Test durchführen. Insbesondere zum Kontrastieren der Leistung zweier Modelle sollten wir ihre AUC-Scores statistisch vergleichen. Es gibt 100 Stichproben (AUC-Scores) für jedes Modell, da wir eine 10-fache Kreuzvalidierung 10 Mal wiederholt haben.

Die Scores der Modelle sind jedoch nicht unabhängig: Alle Modelle werden auf den **gleichen** 100 Partitionen bewertet, was die Korrelation zwischen der Leistung der Modelle erhöht. Da einige Partitionen der Daten die Unterscheidung der Klassen für alle Modelle besonders einfach oder schwierig machen können, variieren die Modell-Scores gemeinsam.

Betrachten wir diesen Partizipationseffekt, indem wir die Leistung aller Modelle in jeder Faltung auftragen und die Korrelation zwischen den Modellen über die Faltungen hinweg berechnen.

# create df of model scores ordered by performance
model_scores = results_df.filter(regex=r"split\d*_test_score")

# plot 30 examples of dependency between cv fold and AUC scores
fig, ax = plt.subplots()
sns.lineplot(
    data=model_scores.transpose().iloc[:30],
    dashes=False,
    palette="Set1",
    marker="o",
    alpha=0.5,
    ax=ax,
)
ax.set_xlabel("CV test fold", size=12, labelpad=10)
ax.set_ylabel("Model AUC", size=12)
ax.tick_params(bottom=True, labelbottom=False)
plt.show()

# print correlation of AUC scores across folds
print(f"Correlation of models:\n {model_scores.transpose().corr()}")
plot grid search stats
Correlation of models:
 kernel       rbf    linear    3_poly    2_poly
kernel
rbf     1.000000  0.882561  0.783392  0.351390
linear  0.882561  1.000000  0.746492  0.298688
3_poly  0.783392  0.746492  1.000000  0.355440
2_poly  0.351390  0.298688  0.355440  1.000000

Wir können beobachten, dass die Leistung der Modelle stark von der Faltung abhängt.

Folglich werden wir bei Annahme von Unabhängigkeit zwischen Stichproben die in unseren statistischen Tests berechnete Varianz unterschätzen und die Anzahl der falsch positiven Fehler erhöhen (d. h. einen signifikanten Unterschied zwischen Modellen feststellen, obwohl keiner existiert) [1].

Für diese Fälle wurden mehrere variantenkorrigierte statistische Tests entwickelt. In diesem Beispiel zeigen wir, wie einer davon (der sogenannte Nadeau- und Bengio-korrigierte t-Test) unter zwei verschiedenen statistischen Rahmenwerken implementiert wird: frequentistisch und bayesianisch.

Vergleich zweier Modelle: frequentistischer Ansatz#

Wir können zunächst fragen: "Ist das erste Modell signifikant besser als das zweite Modell (wenn nach mean_test_score sortiert)?"

Um diese Frage mit einem frequentistischen Ansatz zu beantworten, könnten wir einen gepaarten t-Test durchführen und den p-Wert berechnen. Dies ist in der Prognoseliteratur auch als Diebold-Mariano-Test bekannt [5]. Viele Varianten eines solchen t-Tests wurden entwickelt, um das 'Problem der Nichtunabhängigkeit von Stichproben', das im vorherigen Abschnitt beschrieben wurde, zu berücksichtigen. Wir verwenden die Variante, die sich als die höchste Replizierbarkeit (die bewertet, wie ähnlich die Leistung eines Modells bei der Bewertung auf verschiedenen zufälligen Partitionen desselben Datensatzes ist) erwiesen hat, während sie gleichzeitig eine niedrige Rate an falsch positiven und falsch negativen Fehlern aufweist: den Nadeau- und Bengio-korrigierten t-Test [2], der eine 10-mal wiederholte 10-fache Kreuzvalidierung verwendet [3].

Dieser korrigierte gepaarte t-Test wird berechnet als

\[t=\frac{\frac{1}{k \cdot r}\sum_{i=1}^{k}\sum_{j=1}^{r}x_{ij}} {\sqrt{(\frac{1}{k \cdot r}+\frac{n_{test}}{n_{train}})\hat{\sigma}^2}}\]

wobei \(k\) die Anzahl der Faltungen, \(r\) die Anzahl der Wiederholungen in der Kreuzvalidierung, \(x\) die Differenz der Leistungen der Modelle, \(n_{test}\) die Anzahl der für das Testen verwendeten Stichproben, \(n_{train}\) die Anzahl der für das Trainieren verwendeten Stichproben und \(\hat{\sigma}^2\) die Varianz der beobachteten Unterschiede darstellt.

Implementieren wir einen korrigierten rechtsseitigen gepaarten t-Test, um zu bewerten, ob die Leistung des ersten Modells signifikant besser ist als die des zweiten Modells. Unsere Nullhypothese ist, dass das zweite Modell mindestens so gut abschneidet wie das erste Modell.

import numpy as np
from scipy.stats import t


def corrected_std(differences, n_train, n_test):
    """Corrects standard deviation using Nadeau and Bengio's approach.

    Parameters
    ----------
    differences : ndarray of shape (n_samples,)
        Vector containing the differences in the score metrics of two models.
    n_train : int
        Number of samples in the training set.
    n_test : int
        Number of samples in the testing set.

    Returns
    -------
    corrected_std : float
        Variance-corrected standard deviation of the set of differences.
    """
    # kr = k times r, r times repeated k-fold crossvalidation,
    # kr equals the number of times the model was evaluated
    kr = len(differences)
    corrected_var = np.var(differences, ddof=1) * (1 / kr + n_test / n_train)
    corrected_std = np.sqrt(corrected_var)
    return corrected_std


def compute_corrected_ttest(differences, df, n_train, n_test):
    """Computes right-tailed paired t-test with corrected variance.

    Parameters
    ----------
    differences : array-like of shape (n_samples,)
        Vector containing the differences in the score metrics of two models.
    df : int
        Degrees of freedom.
    n_train : int
        Number of samples in the training set.
    n_test : int
        Number of samples in the testing set.

    Returns
    -------
    t_stat : float
        Variance-corrected t-statistic.
    p_val : float
        Variance-corrected p-value.
    """
    mean = np.mean(differences)
    std = corrected_std(differences, n_train, n_test)
    t_stat = mean / std
    p_val = t.sf(np.abs(t_stat), df)  # right-tailed t-test
    return t_stat, p_val
model_1_scores = model_scores.iloc[0].values  # scores of the best model
model_2_scores = model_scores.iloc[1].values  # scores of the second-best model

differences = model_1_scores - model_2_scores

n = differences.shape[0]  # number of test sets
df = n - 1
n_train = len(next(iter(cv.split(X, y)))[0])
n_test = len(next(iter(cv.split(X, y)))[1])

t_stat, p_val = compute_corrected_ttest(differences, df, n_train, n_test)
print(f"Corrected t-value: {t_stat:.3f}\nCorrected p-value: {p_val:.3f}")
Corrected t-value: 0.750
Corrected p-value: 0.227

Wir können die korrigierten t- und p-Werte mit den unkorrigierten vergleichen.

t_stat_uncorrected = np.mean(differences) / np.sqrt(np.var(differences, ddof=1) / n)
p_val_uncorrected = t.sf(np.abs(t_stat_uncorrected), df)

print(
    f"Uncorrected t-value: {t_stat_uncorrected:.3f}\n"
    f"Uncorrected p-value: {p_val_uncorrected:.3f}"
)
Uncorrected t-value: 2.611
Uncorrected p-value: 0.005

Bei Verwendung des konventionellen Signifikanzniveaus alpha von p=0.05 beobachten wir, dass der unkorrigierte t-Test zu dem Schluss kommt, dass das erste Modell signifikant besser ist als das zweite.

Mit dem korrigierten Ansatz können wir diesen Unterschied dagegen nicht feststellen.

Im letzteren Fall erlaubt uns der frequentistische Ansatz jedoch nicht zu schlussfolgern, dass das erste und das zweite Modell eine äquivalente Leistung aufweisen. Wenn wir diese Behauptung aufstellen wollen, müssen wir einen bayesianischen Ansatz verwenden.

Vergleich zweier Modelle: Bayesischer Ansatz#

Wir können die bayesianische Schätzung verwenden, um die Wahrscheinlichkeit zu berechnen, dass das erste Modell besser ist als das zweite. Die bayesianische Schätzung gibt eine Verteilung aus, gefolgt von dem Mittelwert \(\mu\) der Unterschiede in der Leistung zweier Modelle.

Um die Posterior-Verteilung zu erhalten, müssen wir einen Prior definieren, der unsere Überzeugungen darüber modelliert, wie der Mittelwert verteilt ist, bevor wir die Daten betrachten, und ihn mit einer Likelihood-Funktion multiplizieren, die berechnet, wie wahrscheinlich unsere beobachteten Unterschiede sind, gegeben die Werte, die der Mittelwert der Unterschiede annehmen könnte.

Die bayesianische Schätzung kann in vielerlei Hinsicht durchgeführt werden, um unsere Frage zu beantworten, aber in diesem Beispiel implementieren wir den Ansatz, der von Benavoli und Kollegen vorgeschlagen wurde [4].

Eine Möglichkeit, unseren Posterior mit einem geschlossenen Ausdruck zu definieren, besteht darin, einen Prior zu wählen, der konjugiert zur Likelihood-Funktion ist. Benavoli und Kollegen [4] zeigen, dass wir beim Vergleich der Leistung zweier Klassifikatoren den Prior als Normal-Gamma-Verteilung (mit unbekanntem Mittelwert und unbekannter Varianz) modellieren können, die konjugiert zu einer Normal-Likelihood ist, um so den Posterior als Normalverteilung auszudrücken. Durch Marginalisierung der Varianz aus diesem normalen Posterior definieren wir den Posterior des Mittelwertparameters als Student-t-Verteilung. Spezifisch

\[St(\mu;n-1,\overline{x},(\frac{1}{n}+\frac{n_{test}}{n_{train}}) \hat{\sigma}^2)\]

wobei \(n\) die Gesamtzahl der Stichproben, \(\overline{x}\) den mittleren Unterschied der Scores darstellt, \(n_{test}\) die Anzahl der für das Testen verwendeten Stichproben, \(n_{train}\) die Anzahl der für das Trainieren verwendeten Stichproben und \(\hat{\sigma}^2\) die Varianz der beobachteten Unterschiede darstellt.

Beachten Sie, dass wir auch in unserem bayesianischen Ansatz die Nadeau- und Bengio-korrigierte Varianz verwenden.

Berechnen und plotten wir den Posterior.

# initialize random variable
t_post = t(
    df, loc=np.mean(differences), scale=corrected_std(differences, n_train, n_test)
)

Plotten wir die Posterior-Verteilung.

x = np.linspace(t_post.ppf(0.001), t_post.ppf(0.999), 100)

plt.plot(x, t_post.pdf(x))
plt.xticks(np.arange(-0.04, 0.06, 0.01))
plt.fill_between(x, t_post.pdf(x), 0, facecolor="blue", alpha=0.2)
plt.ylabel("Probability density")
plt.xlabel(r"Mean difference ($\mu$)")
plt.title("Posterior distribution")
plt.show()
Posterior distribution

Wir können die Wahrscheinlichkeit, dass das erste Modell besser ist als das zweite, berechnen, indem wir die Fläche unter der Kurve der Posterior-Verteilung von Null bis unendlich berechnen. Und auch umgekehrt: Wir können die Wahrscheinlichkeit berechnen, dass das zweite Modell besser ist als das erste, indem wir die Fläche unter der Kurve von minus unendlich bis Null berechnen.

better_prob = 1 - t_post.cdf(0)

print(
    f"Probability of {model_scores.index[0]} being more accurate than "
    f"{model_scores.index[1]}: {better_prob:.3f}"
)
print(
    f"Probability of {model_scores.index[1]} being more accurate than "
    f"{model_scores.index[0]}: {1 - better_prob:.3f}"
)
Probability of rbf being more accurate than linear: 0.773
Probability of linear being more accurate than rbf: 0.227

Im Gegensatz zum frequentistischen Ansatz können wir die Wahrscheinlichkeit berechnen, dass ein Modell besser ist als das andere.

Beachten Sie, dass wir ähnliche Ergebnisse wie im frequentistischen Ansatz erzielt haben. Aufgrund unserer Wahl der Prioren führen wir im Wesentlichen die gleichen Berechnungen durch, dürfen aber unterschiedliche Aussagen treffen.

Region of Practical Equivalence#

Manchmal sind wir daran interessiert, die Wahrscheinlichkeiten zu bestimmen, dass unsere Modelle eine äquivalente Leistung aufweisen, wobei "äquivalent" auf praktische Weise definiert wird. Ein naiver Ansatz [4] wäre, Estimators als praktisch äquivalent zu definieren, wenn sie sich um weniger als 1 % in ihrer Genauigkeit unterscheiden. Wir könnten diese praktische Äquivalenz aber auch unter Berücksichtigung des zu lösenden Problems definieren. Zum Beispiel würde ein Unterschied von 5 % in der Genauigkeit einen Anstieg von 1000 $ im Umsatz bedeuten, und jede darüber hinausgehende Menge betrachten wir als relevant für unser Geschäft.

In diesem Beispiel definieren wir die Region of Practical Equivalence (ROPE) als \([-0.01, 0.01]\). Das heißt, wir betrachten zwei Modelle als praktisch äquivalent, wenn sie sich in ihrer Leistung um weniger als 1 % unterscheiden.

Um die Wahrscheinlichkeiten für praktisch äquivalente Klassifikatoren zu berechnen, berechnen wir die Fläche unter der Kurve des Posterior über das ROPE-Intervall.

rope_interval = [-0.01, 0.01]
rope_prob = t_post.cdf(rope_interval[1]) - t_post.cdf(rope_interval[0])

print(
    f"Probability of {model_scores.index[0]} and {model_scores.index[1]} "
    f"being practically equivalent: {rope_prob:.3f}"
)
Probability of rbf and linear being practically equivalent: 0.432

Wir können plotten, wie sich der Posterior über das ROPE-Intervall verteilt.

x_rope = np.linspace(rope_interval[0], rope_interval[1], 100)

plt.plot(x, t_post.pdf(x))
plt.xticks(np.arange(-0.04, 0.06, 0.01))
plt.vlines([-0.01, 0.01], ymin=0, ymax=(np.max(t_post.pdf(x)) + 1))
plt.fill_between(x_rope, t_post.pdf(x_rope), 0, facecolor="blue", alpha=0.2)
plt.ylabel("Probability density")
plt.xlabel(r"Mean difference ($\mu$)")
plt.title("Posterior distribution under the ROPE")
plt.show()
Posterior distribution under the ROPE

Wie in [4] vorgeschlagen, können wir diese Wahrscheinlichkeiten anhand der gleichen Kriterien wie im frequentistischen Ansatz interpretieren: Ist die Wahrscheinlichkeit, innerhalb des ROPE zu liegen, größer als 95 % (Alpha-Wert von 5 %)? In diesem Fall können wir schlussfolgern, dass beide Modelle praktisch äquivalent sind.

Der bayesianische Schätzansatz ermöglicht es uns auch, zu berechnen, wie unsicher wir uns über unsere Schätzung der Differenz sind. Dies kann anhand von Glaubwürdigkeitsintervallen berechnet werden. Für eine gegebene Wahrscheinlichkeit zeigen sie den Bereich von Werten, den die geschätzte Größe, in unserem Fall die mittlere Leistungsdifferenz zwischen den Modellen, annehmen kann. Zum Beispiel sagt ein 50 % Glaubwürdigkeitsintervall [x, y] aus, dass mit 50 % Wahrscheinlichkeit die wahre (mittlere) Leistungsdifferenz zwischen den Modellen zwischen x und y liegt.

Ermitteln wir die Glaubwürdigkeitsintervalle unserer Daten mit 50 %, 75 % und 95 %.

cred_intervals = []
intervals = [0.5, 0.75, 0.95]

for interval in intervals:
    cred_interval = list(t_post.interval(interval))
    cred_intervals.append([interval, cred_interval[0], cred_interval[1]])

cred_int_df = pd.DataFrame(
    cred_intervals, columns=["interval", "lower value", "upper value"]
).set_index("interval")
cred_int_df
unterer Wert oberer Wert
Intervall
0.50 0.000977 0.019023
0.75 -0.005422 0.025422
0.95 -0.016445 0.036445


Wie in der Tabelle gezeigt, besteht eine 50%ige Wahrscheinlichkeit, dass die tatsächliche mittlere Differenz zwischen den Modellen zwischen 0,000977 und 0,019023 liegt, eine 70%ige Wahrscheinlichkeit, dass sie zwischen -0,005422 und 0,025422 liegt, und eine 95%ige Wahrscheinlichkeit, dass sie zwischen -0,016445 und 0,036445 liegt.

Paarweiser Vergleich aller Modelle: frequentistischer Ansatz#

Wir könnten auch daran interessiert sein, die Leistung aller unserer Modelle, die mit GridSearchCV bewertet wurden, zu vergleichen. In diesem Fall würden wir unseren statistischen Test mehrmals durchführen, was uns zum Problem des Mehrfachvergleichs führt.

Es gibt viele mögliche Wege, dieses Problem anzugehen, aber ein Standardansatz ist die Anwendung einer Bonferroni-Korrektur. Bonferroni kann berechnet werden, indem der p-Wert mit der Anzahl der verglichenen Vergleiche multipliziert wird.

Vergleichen wir die Leistung der Modelle mithilfe des korrigierten t-Tests.

from itertools import combinations
from math import factorial

n_comparisons = factorial(len(model_scores)) / (
    factorial(2) * factorial(len(model_scores) - 2)
)
pairwise_t_test = []

for model_i, model_k in combinations(range(len(model_scores)), 2):
    model_i_scores = model_scores.iloc[model_i].values
    model_k_scores = model_scores.iloc[model_k].values
    differences = model_i_scores - model_k_scores
    t_stat, p_val = compute_corrected_ttest(differences, df, n_train, n_test)
    p_val *= n_comparisons  # implement Bonferroni correction
    # Bonferroni can output p-values higher than 1
    p_val = 1 if p_val > 1 else p_val
    pairwise_t_test.append(
        [model_scores.index[model_i], model_scores.index[model_k], t_stat, p_val]
    )

pairwise_comp_df = pd.DataFrame(
    pairwise_t_test, columns=["model_1", "model_2", "t_stat", "p_val"]
).round(3)
pairwise_comp_df
model_1 model_2 t_stat p_val
0 rbf linear 0.750 1.000
1 rbf 3_poly 1.657 0.302
2 rbf 2_poly 4.565 0.000
3 linear 3_poly 1.111 0.807
4 linear 2_poly 4.276 0.000
5 3_poly 2_poly 3.851 0.001


Wir beobachten, dass nach der Korrektur für Mehrfachvergleiche das einzige Modell, das sich signifikant von den anderen unterscheidet, '2_poly' ist. 'rbf', das von GridSearchCV an erster Stelle eingestufte Modell, unterscheidet sich nicht signifikant von 'linear' oder '3_poly'.

Paarweiser Vergleich aller Modelle: Bayesischer Ansatz#

Bei der Verwendung der bayesianischen Schätzung zum Vergleich mehrerer Modelle müssen wir keine Korrektur für Mehrfachvergleiche vornehmen (Gründe hierfür siehe [4]).

Wir können unsere paarweisen Vergleiche auf die gleiche Weise durchführen wie im ersten Abschnitt.

pairwise_bayesian = []

for model_i, model_k in combinations(range(len(model_scores)), 2):
    model_i_scores = model_scores.iloc[model_i].values
    model_k_scores = model_scores.iloc[model_k].values
    differences = model_i_scores - model_k_scores
    t_post = t(
        df, loc=np.mean(differences), scale=corrected_std(differences, n_train, n_test)
    )
    worse_prob = t_post.cdf(rope_interval[0])
    better_prob = 1 - t_post.cdf(rope_interval[1])
    rope_prob = t_post.cdf(rope_interval[1]) - t_post.cdf(rope_interval[0])

    pairwise_bayesian.append([worse_prob, better_prob, rope_prob])

pairwise_bayesian_df = pd.DataFrame(
    pairwise_bayesian, columns=["worse_prob", "better_prob", "rope_prob"]
).round(3)

pairwise_comp_df = pairwise_comp_df.join(pairwise_bayesian_df)
pairwise_comp_df
model_1 model_2 t_stat p_val worse_prob better_prob rope_prob
0 rbf linear 0.750 1.000 0.068 0.500 0.432
1 rbf 3_poly 1.657 0.302 0.018 0.882 0.100
2 rbf 2_poly 4.565 0.000 0.000 1.000 0.000
3 linear 3_poly 1.111 0.807 0.063 0.750 0.187
4 linear 2_poly 4.276 0.000 0.000 1.000 0.000
5 3_poly 2_poly 3.851 0.001 0.000 1.000 0.000


Mit dem bayesianischen Ansatz können wir die Wahrscheinlichkeit berechnen, dass ein Modell besser, schlechter oder praktisch äquivalent zu einem anderen ist.

Die Ergebnisse zeigen, dass das von GridSearchCV an erster Stelle eingestufte Modell 'rbf' eine Wahrscheinlichkeit von etwa 6,8 % hat, schlechter als 'linear' zu sein, und eine Wahrscheinlichkeit von 1,8 %, schlechter als '3_poly' zu sein. 'rbf' und 'linear' haben eine 43%ige Wahrscheinlichkeit, praktisch äquivalent zu sein, während 'rbf' und '3_poly' eine 10%ige Chance dazu haben.

Ähnlich wie bei den mit dem frequentistischen Ansatz erzielten Schlussfolgerungen haben alle Modelle eine 100%ige Wahrscheinlichkeit, besser als '2_poly' zu sein, und keines hat eine praktisch äquivalente Leistung mit letzterem.

Kernbotschaften#

  • Kleine Unterschiede in den Leistungsmaßen können leicht zufällig sein und nicht darauf zurückzuführen sein, dass ein Modell systematisch besser vorhersagt als das andere. Wie in diesem Beispiel gezeigt, können Statistiken Ihnen sagen, wie wahrscheinlich das ist.

  • Beim statistischen Vergleich der Leistung zweier Modelle, die in GridSearchCV bewertet wurden, ist es notwendig, die berechnete Varianz zu korrigieren, die unterschätzt werden könnte, da die Scores der Modelle nicht voneinander unabhängig sind.

  • Ein frequentistischer Ansatz, der einen (variantenkorrigierten) gepaarten t-Test verwendet, kann uns mit einer über den Zufall hinausgehenden Wahrscheinlichkeit sagen, ob die Leistung eines Modells besser ist als die eines anderen.

  • Ein bayesianischer Ansatz kann die Wahrscheinlichkeiten liefern, dass ein Modell besser, schlechter oder praktisch äquivalent zu einem anderen ist. Er kann uns auch sagen, wie sicher wir uns sind, dass die wahren Unterschiede unserer Modelle in einen bestimmten Wertebereich fallen.

  • Wenn mehrere Modelle statistisch verglichen werden, ist eine Korrektur für Mehrfachvergleiche erforderlich, wenn der frequentistische Ansatz verwendet wird.

Referenzen

[1]

Dietterich, T. G. (1998). Approximate statistical tests for comparing supervised classification learning algorithms. Neural computation, 10(7).

[2]

Nadeau, C., & Bengio, Y. (2000). Inference for the generalization error. In Advances in neural information processing systems.

[3]

Bouckaert, R. R., & Frank, E. (2004). Evaluating the replicability of significance tests for comparing learning algorithms. In Pacific-Asia Conference on Knowledge Discovery and Data Mining.

[4] (1,2,3,4,5)

Benavoli, A., Corani, G., Demšar, J., & Zaffalon, M. (2017). Time for a change: a tutorial for comparing multiple classifiers through Bayesian analysis. The Journal of Machine Learning Research, 18(1). Sehen Sie die Python-Bibliothek, die dieses Paper begleitet, hier.

[5]

Diebold, F.X. & Mariano R.S. (1995). Comparing predictive accuracy Journal of Business & economic statistics, 20(1), 134-144.

Gesamtlaufzeit des Skripts: (0 Minuten 1,443 Sekunden)

Launch binder
Launch JupyterLite

Jupyter Notebook herunterladen: plot_grid_search_stats.ipynb

Python Quellcode herunterladen: plot_grid_search_stats.py

Gepackt herunterladen: plot_grid_search_stats.zip

Verwandte Beispiele

Testen der Signifikanz eines Klassifikations-Scores mit Permutationen

Testen der Signifikanz eines Klassifikations-Scores mit Permutationen

Vergleich der Kalibrierung von Klassifikatoren

Vergleich der Kalibrierung von Klassifikatoren

Häufige Fallstricke bei der Interpretation von Koeffizienten linearer Modelle

Häufige Fallstricke bei der Interpretation von Koeffizienten linearer Modelle

Beispiel-Pipeline für Textmerkmal-Extraktion und -Bewertung

Beispiel-Pipeline für Textmerkmal-Extraktion und -Bewertung

Galerie generiert von Sphinx-Gallery

vorherige

Beispiel-Pipeline zur Extraktion und Bewertung von Textmerkmalen

nächste

Successive Halving Iterations

Auf dieser Seite
  • Vergleich zweier Modelle: frequentistischer Ansatz
  • Vergleich zweier Modelle: Bayesischer Ansatz
    • Region of Practical Equivalence
  • Paarweiser Vergleich aller Modelle: frequentistischer Ansatz
  • Paarweiser Vergleich aller Modelle: Bayesischer Ansatz
  • Kernbotschaften

Diese Seite

  • Quelle anzeigen
Quellcode herunterladen
Jupyter Notebook herunterladen
Gezippt herunterladen
Launch JupyterLite
Launch binder

© Copyright 2007 - 2025, scikit-learn Entwickler (BSD-Lizenz).