Messgenauigkeit eines logistischen Regressionsmodells


26

Ich habe ein trainiertes logistisches Regressionsmodell, das ich auf einen Testdatensatz anwende. Die abhängige Variable ist binär (boolesch). Für jede Stichprobe im Testdatensatz wende ich das logistische Regressionsmodell an, um eine prozentuale Wahrscheinlichkeit zu generieren, dass die abhängige Variable wahr ist. Dann zeichne ich auf, ob der aktuelle Wert wahr oder falsch war. Ich versuche, eine oder angepasste Zahl wie in einem linearen Regressionsmodell zu berechnen .R2R2

Dies gibt mir eine Aufzeichnung für jede Probe im Testsatz wie:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

Ich frage mich, wie man die Genauigkeit des Modells prüft. Mein erster Versuch war, eine Kontingenztabelle zu verwenden und "wenn prob_value_is_true> 0,80, denke, dass der tatsächliche Wert wahr ist" und dann das Verhältnis von korrekten zu falschen Klassifizierungen zu messen. Aber das gefällt mir nicht, weil es sich eher so anfühlt, als würde ich nur die 0,80 als Grenze bewerten, nicht die Genauigkeit des Modells als Ganzes und überhaupt prob_value_is_trueWerte.

Dann habe ich versucht, jeden prob_value_is_true diskreten Wert als Beispiel zu betrachten, indem ich alle Samples mit prob_value_is_true= 0,34 betrachtete und den Prozentsatz der Samples maß, bei denen der aktuelle Wert wahr ist (in diesem Fall wäre die perfekte Genauigkeit der Prozentsatz der Samples das war wahr = 34%). Ich könnte eine Modellgenauigkeitsbewertung erstellen, indem ich die Differenz bei jedem diskreten Wert von summiere prob_value_is_true. Die Stichprobengrößen sind hier jedoch ein großes Problem, insbesondere bei den Extremen (nahe 0% oder 100%), so dass die Durchschnittswerte der akuten Werte nicht genau sind. Daher scheint es nicht richtig, sie zur Messung der Modellgenauigkeit zu verwenden.

Ich habe sogar versucht, große Bereiche zu erstellen, um ausreichende Stichprobengrößen (0 - 25, 25 - 50, 50 - 75, 75 - 1,0) sicherzustellen, aber wie man die "Güte" dieses Prozentsatzes des tatsächlichen Werts misst, ist mir ein Rätsel . Angenommen, alle Proben mit prob_value_is_trueWerten zwischen 0,25 und 0,50 haben einen Durchschnitt acutal_valuevon 0,45. Ist das gut, da es im Sortiment ist? Schlecht, da es nicht in der Nähe von 37,5% (der Mitte des Bereichs) ist?

Ich bleibe also bei der Frage, wie es scheint, und hoffe, dass jemand mich auf eine Ressource oder Methode hinweisen kann, um eine Genauigkeitsstastik für ein logistisches Regressionsmodell zu berechnen.


Ich halte die Bereiche Beispiel: (0-.25, .25-.50, .50-.75, .75-1.0) für sinnvoll. Wäre es hilfreich, wenn Sie die Bereiche einschränken? Zum Beispiel: 0 - 0,03, 0,03 - 0,06, 0,06 - 0,09, ..... dh alle 0,03. Dies kann für Regionen mit vielen Datenpunkten nützlich sein.
Mac

Antworten:


18

Eine Kennzahl, die häufig zur Validierung der logistischen Regression verwendet wird, ist die AUC der ROC-Kurve (Darstellung der Empfindlichkeit gegenüber der 1-Spezifität - suchen Sie bei Bedarf bei Google nach Begriffen). Dies wertet im Wesentlichen den gesamten Bereich der Schwellenwerte aus.

Ein Nachteil: Die Bewertung des gesamten Bereichs von Schwellenwerten ist möglicherweise nicht das, wonach Sie streben, da dies (normalerweise) Schwellenwerte einschließt, die zu einer sehr großen Anzahl falsch negativer oder falsch positiver Ergebnisse führen. Es gibt Versionen der AUC, die dies berücksichtigen (teilweise AUC). Wenn dies für Sie ein Problem darstellt, können Sie dies überprüfen.


1
Wenn ich die AUC für einen Moment beiseite lasse, habe ich Recht, wenn ich annehme, dass die Konstruktion der ROC-Kurve in etwa so ist? Erstellen Sie für jeden diskreten Wert von prob_value_is_true eine Kontingenztabelle, indem Sie den diskreten Wert als Schwellenwert verwenden. Notieren Sie dann die True Positive Rate und die False Positive Rate jeder Kontingenztabelle. Zeichnen Sie die Raten für alle Kontingenztabellen in ein Streudiagramm und Sie sollten die ROC-Kurve sehen? Klingt das richtig?
John Reed

Ich habe dazu einen Code zusammengestellt, indem ich zufällige Werte als Wahrscheinlichkeit und tatsächlichen Wert eingegeben habe, und es war eine gerade Linie. Ich nehme an, AUC misst die Abweichung der "Kurve" von einem angepassten Modell gegen die "Linie" oder Zufälligkeit?
John Reed

In Bezug auf ROC: Ja, das ist ungefähr richtig. Es gibt einige Varianten (mehr oder weniger geglättet; unter Berücksichtigung der Wahrscheinlichkeiten, die für die Wahl der Schwellen vorhergesagt wurden oder nicht). Beachten Sie, dass es (je nach verwendeter Software / Sprache) eine Vielzahl von Tools gibt, die dies bereits bieten. In AUC: Es ist nicht mehr oder weniger als die tatsächliche Fläche unter der ROC-Kurve. Anders als bei einem perfekten Zufallsvorhersagefaktor wäre die ROC-Kurve eine gerade Linie von (0,0) nach (1,1), was eine AUC von 0,5 ergibt. Die AUC hat allerdings ein paar nette Interpretationen (siehe sogar Google oder Wikipedia :-))
Nick Sabbe

8

Es ist richtig, dass Sie sich um das Verhältnis kümmern, das als richtig eingestuft wird, da es hauptsächlich den Effekt einer beliebigen Grenze widerspiegelt. Ich würde zwei Maßnahmen empfehlen. Einer ist der Index- oder ROC-Bereich, wie andere beschrieben haben. Dies hat eine Interpretation, die einfacher ist als das Denken an eine ROC-Kurve und ein Maß für reine prädiktive Diskriminierung ist. Zweitens, schätzen Sie eine kontinuierliche Kalibrierungskurve ohne Datenbündelung. Wenn Vorhersagen für ein unabhängiges Dataset bewertet werden, können Sie bei deaktivierter Ausreißererkennung die Beziehung zwischen vorhergesagtem und tatsächlichem Prob [Y = 1] schätzen. Die Funktion im R- Paket erledigt beides. Andere Funktionen inclowessval.probrmsrms wird dasselbe für die interne Validierung tun und das Resampling verwenden, um die Auswirkungen einer Überanpassung zu beseitigen.


6

xx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)xvariabel, wie Sie vorschlagen. Dies ist nicht vollständig gültig, da dies von der Auswahl der Fächer abhängt. Dies kann hilfreich sein, um Ihr Modell zu erkunden.

Im Allgemeinen ist die Aufgabe, die Sie sich hier gestellt haben, schwierig. Das liegt daran, dass Sie mit logistischer Regression zwei verschiedene Arten von Dingen zu tun haben. Die Vorhersagen des Modells sind eine latente Variable, Ihre beobachtete Antwortvariable (die vermutlich von einer latenten Variablen generiert wird) dagegen nicht. Natürlich werden die Leute oft wissen wollen, wie die vorhergesagte Reaktion aussieht, und das ist absolut vernünftig. Dies ist nur einer dieser Fälle, in denen das Leben nicht fair ist.

y=1y^.5y=1y^p(y=1)y^=.31y1<.5

(0,1)R2R2c


Gute Antwort! In dem Beispiel also, in dem 30% aller Fälle Einsen sind, ist die vorhergesagte Wahrscheinlichkeit 0,31 eines bestimmten Falls wie eine "Rangfolge" dieses Falls im Vergleich zu anderen Fällen, wie nahe es bei 1 liegt (je größer desto näher). Und es sollte nicht als die vorhergesagte Wahrscheinlichkeit angesehen werden, dass dieser spezielle Fall 1 ist?
Mac

1
y^ich=.311.31.31.25

3

Ich denke, Sie könnten einen Schwellenwert festlegen (z. B. 0,5). Wenn also Ihre Wahrscheinlichkeit gleich oder größer als dieser Schwellenwert ist, wäre Ihre vorhergesagte Klasse 1 und andernfalls 0. Dann könnten Sie ein Maß für Ihre Genauigkeit auf diese Weise erhalten:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

Da Ihre Wahrscheinlichkeit die Wahrscheinlichkeit für die Angabe Ihrer Daten (x) ist und Ihr Klassenwert (y) nach Ihrem Modell gleich 1 ist, verstehe ich nicht, warum Sie immer Wahrscheinlichkeitswerte kleiner als 0,5 erhalten. Was ist die Häufigkeit Ihrer tatsächlichen Klassen (actual_value)?


2

Vielleicht möchten softclassvalSie sich mein Paket ansehen (auf softclassval.r-forge.r-project.org finden Sie auch zwei mündliche Präsentationen, die ich zu den Ideen hinter dem Paket gegeben habe).

Ich habe es für ein etwas anderes Problem geschrieben, nämlich wenn der Hinweis (zB Pathologe) "ablehnt", eine klare Klasse zu geben. Sie können es jedoch mit "normalen" harten Klassen verwenden und es vermeidet die Definition eines Schwellenwerts für die Verhärtung der ursprünglich kontinuierlichen Vorhersage - Sie werten also die 0,8 nicht aus.

Ich empfehle jedoch, es zusammen mit beispielsweise einem ROC- oder Spezifitäts-Sensitivitäts-Diagramm zu verwenden: Die Ergebnisse sehen oft ziemlich schlecht aus, da "meine" Methoden bereits geringfügige Abweichungen bestrafen (z. B. 0,9 statt 1 ergeben 0,1 Unterschiede für meine Maße Bei allen Schwellenwerten unter 0,9 wird dies ignoriert. Eigentlich halte ich das eher für einen Vorteil: Das Fehlen dieser Empfindlichkeit gegen kleine Abweichungen ist einer der Hauptkritikpunkte bei solchen "verhärteten" Maßnahmen wie Genauigkeit, Empfindlichkeit, Rückruf usw.

Durch Vergleichen des mittleren absoluten Fehlers (MAE) und des mittleren quadratischen Fehlers (RMSE) können Sie außerdem feststellen, ob Sie viele kleine Abweichungen oder weniger stark falsch eingeschätzte Stichproben haben.


1

Prich=ichnvlOGicht(ein+bxich)

y.rep[ich]BernOullich(p[ich])

Führen Sie diese Simulation dann beispielsweise 100 Mal aus. Sie erhalten eine Matrix mit n Zeilen (n ist die Anzahl der Probanden) und k Spalten (in diesem Fall k = 100, die Anzahl der Simulationen). In r Code:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

Nun berechnen Sie die Differenz zwischen der in jeder Simulation vorhergesagten und der beobachteten. Berechnen Sie nach der Berechnung dieses Unterschieds einfach die mittlere Anzahl von wahr-positiv und falsch-positiv für jede Zeile (jedes Subjekt) und zeichnen Sie das Histogramm auf. Oder berechnen Sie beides für jede Spalte (Simulation) und zeichnen Sie das Histogramm auf (ich bevorzuge dies).

Ich hoffe es hilft...


1

Es gibt viele Möglichkeiten, die Genauigkeit solcher Vorhersagen zu schätzen, und die optimale Auswahl hängt wirklich davon ab, wofür die Schätzung implementiert wird.

Wenn Sie beispielsweise vorhaben, einige Treffer mit hoher Punktzahl für eine teure Folgestudie auszuwählen, möchten Sie möglicherweise die Präzision bei hohen Punktzahlen maximieren. Wenn die Folgestudie jedoch günstig ist, können Sie den Rückruf (die Empfindlichkeit) bei niedrigeren Werten maximieren. Die ROC AUC ist möglicherweise geeignet, wenn Sie eine andere Methode usw. vergleichen.

Auf der praktischen Seite, R‚s ROCRenthält Paket 2 nützliche Funktionen

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Zusammen können diese Funktionen eine Vielzahl von Genauigkeitsmaßen berechnen, einschließlich globaler Skalarwerte (z. B. "auc" ) und von der Punktzahl abhängiger Vektoren zum Zeichnen von Rückrufgenauigkeits- und ROC-Kurven ( "prec" , "rec" , "tpr" und "rec") "fpr" usw.)


1

Sie müssen definieren, was Sie mit "Genauigkeit" meinen. Was Sie wissen möchten, bitte entschuldigen Sie, dass ich Ihnen die Worte in den Mund genommen habe, wie gut Ihr Modell zu den Trainingsdaten passt und was noch wichtiger ist, wie gut sich dieses Modell auf Proben "verallgemeinert", die nicht zu Ihren Trainingsdaten gehören. Obwohl ROC-Kurven nützlich sein können, um den Kompromiss zwischen Genauigkeit und Wiederaufruf für verschiedene Werte des Schwellenwerts zu analysieren, empfehle ich, der Toolbox den mittleren Fehlerquadrat oder den Brier-Score hinzuzufügen. Die Berechnung ist einfach, und Sie können sofort feststellen, ob sich Änderungen an Features auf die Anpassung des Modells auswirken, wenn sie auf Trainingsdaten angewendet werden. Da in diesem Fall eine Überanpassung möglich ist, ist Ihre Arbeit hier nicht erledigt. Um die Leistung der Generalisierung zu bewerten oder wie gut Sie mit Daten umgehen, die Sie noch nicht gesehen haben, ist dies nicht der Fall. Es reicht nicht aus, um Ihre Leistung anhand der Trainingsmuster zu überprüfen. Natürlich ist Ihr Modell gut darin, denn es sind die Werte, die Sie zur Bestimmung der Koeffizienten für Ihre Logistik verwendet haben. Sie müssen einige Beispiele für Testdaten beiseite legen. Ihre MSE-Leistung für dieses Set sollte Ihre Generalisierungserwartungen entsprechend der Höffding-Ungleichung festlegen. Ihr maximaler Generalisierungsfehler hängt von der Anzahl der Features in Ihrem Modell sowie von der Anzahl der Stichproben ab, die zur Berechnung der Teststatistik verwendet wurden. Denken Sie daran, dass Sie einige Ihrer Trainingsmuster für Testmuster stehlen müssen. Ich empfehle eine 10-fache Kreuzvalidierung, bei der Sie mischen, 90% für das Training und 10% für das Testen auswählen und dann alle Messungen messen, wiederholen und dann mitteln. weil sie die Werte sind, die Sie verwendet haben, um die Koeffizienten für Ihre Logistik zu bestimmen. Sie müssen einige Beispiele für Testdaten beiseite legen. Ihre MSE-Leistung für dieses Set sollte Ihre Generalisierungserwartungen entsprechend der Höffding-Ungleichung festlegen. Ihr maximaler Generalisierungsfehler hängt von der Anzahl der Features in Ihrem Modell sowie von der Anzahl der Stichproben ab, die zur Berechnung der Teststatistik verwendet wurden. Denken Sie daran, dass Sie einige Ihrer Trainingsmuster für Testmuster stehlen müssen. Ich empfehle eine 10-fache Kreuzvalidierung, bei der Sie mischen, 90% für das Training und 10% für das Testen auswählen und dann alle Messungen messen, wiederholen und dann mitteln. weil sie die Werte sind, die Sie verwendet haben, um die Koeffizienten für Ihre Logistik zu bestimmen. Sie müssen einige Beispiele für Testdaten beiseite legen. Ihre MSE-Leistung für dieses Set sollte Ihre Generalisierungserwartungen entsprechend der Höffding-Ungleichung festlegen. Ihr maximaler Generalisierungsfehler hängt von der Anzahl der Features in Ihrem Modell sowie von der Anzahl der Stichproben ab, die zur Berechnung der Teststatistik verwendet wurden. Denken Sie daran, dass Sie einige Ihrer Trainingsmuster für Testmuster stehlen müssen. Ich empfehle eine 10-fache Kreuzvalidierung, bei der Sie mischen, 90% für das Training und 10% für das Testen auswählen und dann alle Messungen messen, wiederholen und dann mitteln. Ihre MSE-Leistung für dieses Set sollte Ihre Generalisierungserwartungen entsprechend der Höffding-Ungleichung festlegen. Ihr maximaler Generalisierungsfehler hängt von der Anzahl der Features in Ihrem Modell sowie von der Anzahl der Stichproben ab, die zur Berechnung der Teststatistik verwendet wurden. Denken Sie daran, dass Sie einige Ihrer Trainingsmuster für Testmuster stehlen müssen. Ich empfehle eine 10-fache Kreuzvalidierung, bei der Sie mischen, 90% für das Training und 10% für das Testen auswählen und dann alle Messungen messen, wiederholen und dann mitteln. Ihre MSE-Leistung für dieses Set sollte Ihre Generalisierungserwartungen entsprechend der Höffding-Ungleichung festlegen. Ihr maximaler Generalisierungsfehler hängt von der Anzahl der Features in Ihrem Modell sowie von der Anzahl der Stichproben ab, die zur Berechnung der Teststatistik verwendet wurden. Denken Sie daran, dass Sie einige Ihrer Trainingsmuster für Testmuster stehlen müssen. Ich empfehle eine 10-fache Kreuzvalidierung, bei der Sie mischen, 90% für das Training und 10% für das Testen auswählen und dann alle Messungen messen, wiederholen und dann mitteln.


1

0-Log(1-p^)01-Log(p^)1

Dies unterliegt keinen willkürlichen Schwellenwerten. Je kleiner das Maß, desto besser.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.