So berechnen Sie Konfidenzintervalle für Leistungsmetriken beim maschinellen Lernen mithilfe einer automatischen Bootstrap-Methode

Quellknoten: 1178501

So berechnen Sie Konfidenzintervalle für Leistungsmetriken beim maschinellen Lernen mithilfe einer automatischen Bootstrap-Methode

Sind Ihre Modellleistungsmessungen aufgrund eines „großen“ Testsets sehr genau oder aufgrund eines „kleinen“ oder unausgewogenen Testsets sehr unsicher?


By David B. Rosen (PhD), Lead Data Scientist für automatisierte Kreditgenehmigung bei IBM Global Financing



Die orangefarbene Linie zeigt 89.7 % als Untergrenze des Konfidenzintervalls für die ausgewogene Genauigkeit, grün für die ursprünglich beobachtete ausgeglichene Genauigkeit = 92.4 % (Punktschätzung) und rot für die Obergrenze von 94.7 %. (Diese und alle Bilder stammen vom Autor, sofern nicht anders angegeben.)

Einleitung

 
 
Wenn Sie die Leistung Ihres Klassifikators mit einer Genauigkeit von 94.8 % und F1 von 92.3 % in einem Testsatz angeben, bedeutet dies nicht viel, ohne etwas über die Größe und Zusammensetzung des Testsatzes zu wissen. Die Fehlerspanne dieser Leistungsmessungen hängt stark von der Größe des Testsatzes ab oder, bei einem unausgeglichenen Datensatz, hauptsächlich davon, wie viele unabhängige Instanzen der Minderheit Klasse, die es enthält (mehr Kopien derselben Instanzen durch Oversampling helfen für diesen Zweck nicht).

Wenn Sie in der Lage wären, einen anderen unabhängigen Testsatz ähnlichen Ursprungs zu sammeln, sind die Genauigkeit und F1 Ihres Modells in diesem Datensatz wahrscheinlich nicht gleich, aber wie viel Unterschied könnten sie plausibel sein? Eine ähnliche Frage wird in der Statistik als beantwortet Konfidenzintervall der Messung.

Wenn wir viele unabhängige Stichprobendatensätze aus der zugrunde liegenden Grundgesamtheit ziehen würden, dann würde für 95 % dieser Datensätze der wahre zugrunde liegende Grundgesamtheitswert der Metrik innerhalb des 95 %-Konfidenzintervalls liegen, das wir für diesen bestimmten Stichprobendatensatz berechnen würden.

In diesem Artikel zeigen wir Ihnen, wie Sie mit einer Bootstrap-Methode Konfidenzintervalle für eine beliebige Anzahl von Leistungskennzahlen für maschinelles Lernen auf einmal berechnen Im Prinzip so, wie Sie es von Google Maps kennen. legt fest, wie viele Boot-Beispieldatensätze standardmäßig generiert werden.

Wenn Sie nur sehen möchten, wie Sie diesen Code aufrufen, um Konfidenzintervalle zu berechnen, fahren Sie mit dem Abschnitt „Berechnen Sie die Ergebnisse!“ unten.

Die Bootstrap-Methodik

 
 
Wenn wir in der Lage wären, zusätzliche Testdatensätze aus der wahren Verteilung, die den Daten zugrunde liegt, zu ziehen, könnten wir die Verteilung der interessierenden Leistungsmetrik(en) über diese Datensätze hinweg sehen. (Beim Zeichnen dieser Datensätze würden wir nichts tun, um zu verhindern, dass eine identische oder ähnliche Instanz mehrmals gezeichnet wird, obwohl dies möglicherweise nur selten vorkommt.)

Da wir das nicht können, ist es das Nächstbeste, zusätzliche Datensätze aus dem zu ziehen empirische Verteilung dieses Testdatensatzes, d. h. Stichproben mit Ersetzung aus seinen Instanzen, um neue Bootstrap-Beispieldatensätze zu generieren. Stichproben mit Ersetzung bedeutet, dass wir eine bestimmte Instanz nach dem Zeichnen wieder einfügen, damit wir sie für denselben Beispieldatensatz erneut zeichnen können. Daher hat jeder dieser Datensätze im Allgemeinen mehrere Kopien einiger der Instanzen und enthält nicht alle Instanzen, die sich in der Basistestmenge befinden.

Wenn wir probiert haben ohne Ersatz, dann würden wir einfach jedes Mal eine identische Kopie des ursprünglichen Datensatzes erhalten, gemischt in einer anderen zufälligen Reihenfolge, was keinen Nutzen hätte.

Das Perzentil Die Bootstrap-Methodik zur Schätzung des Konfidenzintervalls lautet wie folgt:

  1. Generieren nboots „Bootstrap-Beispiel“-Datensätze, die jeweils die gleiche Größe wie der ursprüngliche Testsatz haben. Jeder Beispieldatensatz wird durch zufälliges Ziehen von Instanzen aus dem Testsatz mit Ersatz erhalten.
  2. Berechnen Sie für jeden der Beispieldatensätze die Metrik und speichern Sie sie.
  3. Das 95%-Konfidenzintervall ist durch die 2.5 gegebenth zum 97.5th Perzentil unter den nboots berechnete Werte der Metrik. Wenn nboots=1001 und Sie haben die Werte in einer Reihe/einem Array/einer Liste sortiert X der Länge 1001, die 0th Perzentil ist X[0] und die 100th Perzentil ist X[1000], also wäre das Konfidenzintervall gegeben durch X[25] bis X[975].

Natürlich können Sie in Schritt 2 für jeden Beispieldatensatz beliebig viele Metriken berechnen, aber in Schritt 3 würden Sie die Perzentile für jede Metrik separat finden.

Beispieldatensatz und Konfidenzintervallergebnisse

 
 
Wir werden Ergebnisse aus diesem vorherigen Artikel als Beispiel verwenden: Umgang mit unausgewogener Klassifizierung, ohne die Daten neu auszubalancierenBevor Sie erwägen, Ihre verzerrten Daten zu überabtasten, versuchen Sie, Ihren Entscheidungsschwellenwert für die Klassifizierung anzupassen.

In diesem Artikel haben wir die verwendet hoch-unausgeglichenes Zwei-Klassen-Kaggle Datensatz zur Identifizierung von Kreditkartenbetrug. Wir haben uns entschieden, einen Klassifizierungsschwellenwert zu verwenden, der sich deutlich von dem Standardschwellenwert von 0.5 unterscheidet, der bei der Verwendung der Methode „predict()“ implizit ist, wodurch es unnötig wird, die Daten auszugleichen. Dieser Ansatz wird manchmal als Schwelle bewegt, in dem unser Klassifikator die Klasse zuweist, indem er den gewählten Schwellenwert auf die von der Vorhersage bereitgestellte vorhergesagte Klassenwahrscheinlichkeit anwendet_wahrscheinlich() Methode.

Wir beschränken den Geltungsbereich dieses Artikels (und Codes) auf die binäre Klassifizierung: Klassen 0 und 1, wobei Klasse 1 per Konvention die „positive“ Klasse und insbesondere die Minderheitsklasse für unausgeglichene Daten ist, obwohl der Code für die Regression funktionieren sollte (single kontinuierliches Ziel).

Generieren eines Boot-Beispieldatensatzes

 
 
Obwohl unser Konfidenzintervallcode verschiedene Zahlen von Datenargumenten verarbeiten kann, die an die Metrikfunktionen übergeben werden sollen, konzentrieren wir uns auf Metriken im Sklearn-Stil, die immer zwei Datenargumente akzeptieren, y_true und y_pred, wobei y_pred entweder binäre Klassenvorhersagen (0 oder 1) oder kontinuierliche Klassenwahrscheinlichkeits- oder Entscheidungsfunktionsvorhersagen oder sogar kontinuierliche Regressionsvorhersagen, wenn y_true ebenfalls kontinuierlich ist. Die folgende Funktion generiert ein einzelnes Startbeispiel-Dataset. Es akzeptiert alle data_args, aber in unserem Fall werden diese Argumente sein ytest(unsere tatsächlichen/echten Testset-Zielwerte in der vorheriger Artikel) und hardpredtst_tuned_thresh (die vorhergesagte Klasse). Beide enthalten Nullen und Einsen, um die wahre oder vorhergesagte Klasse für jede Instanz anzugeben.

Benutzerdefinierte Metrik specificity_score() und Hilfsfunktionen

 
 
Wir werden eine benutzerdefinierte Metrikfunktion für die Spezifität definieren, was nur ein anderer Name für den Abruf von ist Negativ Klasse (Klasse 0). Auch eine calc_metrics-Funktion, die eine Reihe von interessanten Metriken auf unsere Daten anwendet, und ein paar Hilfsfunktionen dafür:

Hier erstellen wir unsere Liste von Metriken und wenden sie auf die Daten an. Wir haben die Genauigkeit nicht als relevante Metrik betrachtet, da ein falsches Negativ (Fehlklassifizierung eines echten Betrugs als legitim) für das Unternehmen viel kostspieliger ist als ein falsches Positiv (Fehlklassifizierung eines echten Betrugs als Betrug), während Accuracy beide Arten der Fehlklassifizierung behandelt sind gleich schlecht und bevorzugen daher die korrekte Klassifizierung derjenigen, deren wahre Klasse die Mehrheitsklasse ist, da diese viel häufiger vorkommen und daher viel mehr zur Gesamtgenauigkeit beitragen.

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



Erstellen jedes Boot-Beispieldatensatzes und Berechnen von Metriken dafür

 
 
In raw_metric_samples() werden wir tatsächlich mehrere Beispieldatensätze nacheinander generieren und die Metriken von jedem speichern:

Sie geben raw_metric_samples() eine Liste von Metriken (oder nur eine Metrik) von Interesse sowie die wahren und vorhergesagten Klassendaten, und es erhält nboots-Beispieldatensätze und gibt einen Datenrahmen mit nur den Werten der Metriken zurück, die aus jedem Datensatz berechnet wurden. Durch _boot_generator() ruft es one_boot() nacheinander in einem Generatorausdruck auf, anstatt alle Datensätze auf einmal als potenziell-riesig Liste.

Sehen Sie sich Metriken für 7 Boot-Beispieldatensätze an

 
 
Wir erstellen unsere Liste von Metrikfunktionen und rufen raw_metric_samples() auf, um die Ergebnisse für nur 7 Beispieldatensätze zu erhalten. Wir rufen hier zum Verständnis raw_metric_samples() auf – es ist nicht notwendig, um Konfidenzintervalle mit ci_auto() unten zu erhalten, obwohl eine Liste von Metriken (oder nur eine Metrik) für ci_auto() angegeben wird. is notwendig.

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



Jede Spalte oben enthält die Metriken, die aus einem Boot-Stichprobendatensatz (nummeriert von 0 bis 6) berechnet wurden, sodass die berechneten Metrikwerte aufgrund der Zufallsstichprobe variieren.

Anzahl der Startdatensätze mit berechnetem Standardwert

 
 
In unserer Implementierung standardmäßig die Anzahl der Boot-Datasets nboots wird automatisch aus dem gewünschten Konfidenzniveau (z. B. 95%) berechnet, um die Empfehlung zu erfüllen North, Curtis und Sham um eine minimale Anzahl von Boot-Ergebnissen in jedem Ende der Verteilung zu haben. (Eigentlich gilt diese Empfehlung für p-Werte und damit Hypothesentest Akzeptanzregionen, Aber Vertrauensintervalle ähnlich genug sind, um dies als Faustregel zu verwenden.) Obwohl diese Autoren mindestens 10 Boot-Ergebnisse im Schwanz empfehlen, Davidson & MacKinnon empfehlen mindestens 399 Stiefel für 95 % Vertrauen, was 11 Stiefel im Schwanz erfordert, also verwenden wir diese eher konservative Empfehlung.

Wir spezifizieren Alpha, das 1 ist – Konfidenzniveau. 95 % Konfidenz werden beispielsweise zu 0.95 und Alpha = 0.05. Wenn Sie eine explizite Anzahl von Stiefeln angeben (vielleicht eine kleinere nboots da Sie schnellere Ergebnisse wünschen), aber für Ihr angefordertes Alpha nicht ausreicht, wird automatisch ein höheres Alpha ausgewählt, um ein genaues Konfidenzintervall für diese Anzahl von Stiefeln zu erhalten. Es werden mindestens 51 Stiefel verwendet, da weniger nur bizarr kleine Konfidenzniveaus genau berechnen können (z. B. 40 % Konfidenz, was ein Intervall von 30 bisth Perzentil bis zum 70th Perzentil, das 40 % innerhalb des Intervalls, aber 60 % außerhalb davon hat), und es ist nicht klar, ob die Empfehlung für Mindeststiefel einen solchen Fall überhaupt in Erwägung gezogen hat.

Die Funktion get_alpha_nboots() setzt die Standard-nboots oder modifiziert die angeforderten alpha und nboots wie oben:

Lassen Sie uns die Standard-nboots für verschiedene Werte von alpha zeigen:

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



Folgendes passiert, wenn wir ein explizites nboots anfordern:

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



Kleine nboots-Werte erhöhten Alpha auf 0.05 und 0.40, und nboots=2 wird auf das Minimum von 51 geändert.

Histogramm von Bootstrap-Beispieldatensätzen, die das Konfidenzintervall nur für ausgeglichene Genauigkeit zeigen

 
 
Auch hier müssen wir dies nicht tun, um die Konfidenzintervalle unten durch Aufrufen von ci_auto() zu erhalten.

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



Die orangefarbene Linie zeigt 89.7 % als Untergrenze des Konfidenzintervalls für die ausgewogene Genauigkeit, grün für die ursprünglich beobachtete ausgeglichene Genauigkeit = 92.4 % (Punktschätzung) und rot für die Obergrenze von 94.7 %. (Dasselbe Bild erscheint oben in diesem Artikel.)

So berechnen Sie alle Konfidenzintervalle für die Liste der Metriken

 
 
Hier ist die Hauptfunktion, die das Obige aufruft und die Konfidenzintervalle aus den Perzentilen der Metrikergebnisse berechnet und die Punktschätzungen als erste Spalte ihres Ausgabedatenrahmens der Ergebnisse einfügt.

Berechnen Sie die Ergebnisse!

 
 
Das ist alles, was wir wirklich tun mussten: Rufen Sie ci_auto() wie folgt mit einer Liste von Metriken auf (met oben zugewiesen), um ihre Konfidenzintervalle zu erhalten. Die prozentuale Formatierung ist optional:

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



Diskussion der resultierenden Konfidenzintervalle

 
 
Hier ist die Verwirrungsmatrix aus der Original Artikel. Klasse 0 ist die negative (Mehrheitsklasse) und Klasse 1 ist die positive (sehr seltene Klasse)



Der Recall (Richtig-Positiv-Rate) von 134/(134+14) hat das breiteste Konfidenzintervall, da dies ein binomiales Verhältnis mit kleinen Zählungen ist.

Die Spezifität (Richtig-Negativ-Rate) beträgt 80,388/(80,388+4,907), was beinhaltet viel größere Zählungen, so dass es ein extrem enges Konfidenzintervall von nur [94.11 % bis 94.40 %] hat.

Da die ausgeglichene Genauigkeit einfach als Durchschnitt aus Recall und Spezifität berechnet wird, liegt die Breite ihres Konfidenzintervalls zwischen der von ihnen.

Ungenauigkeit der metrischen Messung aufgrund von Abweichungen in den Testdaten im Vergleich zu Abweichungen in den Zugdaten

 
 
Hier haben wir die Variabilität in der nicht berücksichtigt Modell basierend auf der Zufälligkeit unserer TAUCHERAUSBILDUNG Daten (obwohl das für manche Zwecke auch interessant sein kann, z. B. wenn Sie automatisiertes wiederholtes Neutraining haben und wissen möchten, wie stark die Leistung zukünftiger Modelle variieren könnte), sondern nur die Variabilität in der Messung der Leistung dieser besondere Modell (erstellt aus bestimmten Trainingsdaten) aufgrund der Zufälligkeit unseres Test Daten.

Wenn wir genügend unabhängige Testdaten hätten, könnten wir die Leistung dieses bestimmten Modells für die zugrunde liegende Population sehr genau messen, und wir wüssten, wie es funktionieren wird, wenn dieses Modell eingesetzt wird, unabhängig davon, wie wir das Modell erstellt haben und ob wir es könnten Erhalten Sie ein besseres oder schlechteres Modell mit einem anderen Trainingsbeispiel-Dataset.

Unabhängigkeit einzelner Instanzen

 
 
Die Bootstrap-Methode geht davon aus, dass jede Ihrer Instanzen (Fälle, Beobachtungen) unabhängig von einer zugrunde liegenden Population gezogen wird. Wenn Ihre Testreihe Gruppen von Zeilen enthält, die nicht voneinander unabhängig sind, z. B. wiederholte Beobachtungen derselben Entität, die wahrscheinlich miteinander korrelieren, oder Instanzen, die aus anderen Instanzen in Ihrem Test überabgetastet/repliziert/erzeugt werden gesetzt, sind die Ergebnisse möglicherweise nicht gültig. Möglicherweise müssen Sie verwenden gruppiert Sampling, bei dem Sie statt einzelner Reihen ganze Gruppen nach dem Zufallsprinzip zusammenstellen und dabei vermeiden, eine Gruppe aufzulösen oder nur einen Teil davon zu verwenden.

Außerdem sollten Sie sicherstellen, dass Sie keine Gruppen haben, die auf das Trainings- und Test-Set aufgeteilt wurden, da das Test-Set dann nicht unbedingt unabhängig ist und Sie möglicherweise eine unentdeckte Überanpassung bekommen. Wenn Sie beispielsweise Oversampling verwenden, sollten Sie dies im Allgemeinen nur tun nachdem es wurde aus dem Testset gesplittet, vorher nicht. Und normalerweise würden Sie das Trainingsset überabtasten, aber nicht das Testset, da das Testset repräsentativ für Instanzen bleiben muss, die das Modell bei einer zukünftigen Bereitstellung sehen wird. Und für die Kreuzvalidierung möchten Sie scikit-learn verwenden model_selection.GroupKFold().

Zusammenfassung

 
 
Sie können jederzeit Konfidenzintervalle für Ihre Bewertungsmetrik(en) berechnen, um zu sehen, wie genau Ihre Testdaten es Ihnen ermöglichen, die Leistung Ihres Modells zu messen. Ich plane einen weiteren Artikel, um Konfidenzintervalle für Metriken zu demonstrieren, die Wahrscheinlichkeitsvorhersagen (oder Konfidenzwerte – keine Beziehung zu statistischer Konfidenz) auswerten, dh weiche Klassifizierungen wie Log Loss oder ROC AUC, und nicht die hier verwendeten Metriken, die die auswerten diskrete Wahl der Klasse durch das Modell (harte Klassifizierung). Derselbe Code funktioniert sowohl für beide als auch für die Regression (Vorhersage einer kontinuierlichen Zielvariablen) – Sie müssen ihm nur eine andere Art von Vorhersage (und im Fall einer Regression eine andere Art von wahren Zielen) übergeben.

Dieses Jupyter-Notebook ist in Github verfügbar: bootConfIntAutoV1o_standalone.ipynb

War dieser Artikel informativ und/oder nützlich? Bitte posten Sie unten einen Kommentar, wenn Sie Kommentare oder Fragen zu diesem Artikel oder zu Konfidenzintervallen, dem Bootstrap, der Anzahl der Stiefel, dieser Implementierung, dem Datensatz, dem Modell, der Schwellenwertverschiebung oder den Ergebnissen haben.

Zusätzlich zu den oben genannten vorheriger Artikel, vielleicht interessiert dich auch meine So erkennen Sie die Datums-/Datumszeitspalten automatisch und legen ihren Datentyp fest, wenn Sie eine CSV-Datei in Pandas lesen, obwohl es nicht direkt mit dem vorliegenden Artikel zusammenhängt.

Einige Rechte vorbehalten

 
Bio: David B. Rosen (PhD) ist Lead Data Scientist für Automated Credit Approval bei IBM Global Financing. Finden Sie mehr von Davids Schreiben unter dabruro.medium.com.

Original. Mit Genehmigung erneut veröffentlicht.

Related:

Quelle: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html

Zeitstempel:

Mehr von KDnuggets