Warum senkt eine große Auswahl an K meine Kreuzvalidierungsbewertung?

11

Beim Herumspielen mit dem Boston Housing Dataset und RandomForestRegressor(mit Standardparametern) beim Scikit-Lernen fiel mir etwas Seltsames auf: Der durchschnittliche Kreuzvalidierungswert nahm ab, als ich die Anzahl der Falten über 10 erhöhte. Meine Kreuzvalidierungsstrategie lautete wie folgt:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... wo num_cvswar abwechslungsreich. Ich habe test_sizeauf 1/num_cvsden Zug / Test Split Größe Verhalten von k-fach CV zu spiegeln. Grundsätzlich wollte ich so etwas wie einen k-fachen Lebenslauf, aber ich brauchte auch Zufälligkeit (daher ShuffleSplit).

Dieser Versuch wurde mehrmals wiederholt, und dann wurden Durchschnittswerte und Standardabweichungen aufgezeichnet.

Kreisfläche ~ K in K-facher Kreuzvalidierung

(Beachten Sie, dass die Größe von kdurch die Fläche des Kreises angegeben wird; die Standardabweichung liegt auf der Y-Achse.)

Konsequent kwürde eine Erhöhung (von 2 auf 44) zu einer kurzen Erhöhung der Punktzahl führen, gefolgt von einer stetigen Verringerung, wenn sie kweiter zunimmt (über ~ 10-fach)! Wenn überhaupt, würde ich erwarten, dass mehr Trainingsdaten zu einer geringfügigen Erhöhung der Punktzahl führen!

Aktualisieren

Das Ändern der Bewertungskriterien, um einen absoluten Fehler zu bedeuten, führt zu einem Verhalten, das ich erwarten würde: Die Bewertung verbessert sich mit einer erhöhten Anzahl von Falten im K-fachen Lebenslauf, anstatt sich 0 zu nähern (wie bei der Standardeinstellung ' r2 '). Es bleibt die Frage, warum die Standard-Bewertungsmetrik für eine zunehmende Anzahl von Falten zu einer schlechten Leistung sowohl über die Mittelwert- als auch über die STD-Metrik führt .

Brian Bien
quelle
Irgendwelche doppelten Datensätze in Ihren Falten? Dies kann an einer Überanpassung liegen .
Hat aufgehört - Anony-Mousse
1
@ Anony-Mousse Nein, da das Boston Housing-Dataset keine doppelten Datensätze enthält und die Stichprobe von ShuffleSplit keine doppelten Datensätze verursacht.
Brian Bien
4
Verbessern Sie auch Ihre Darstellung. Verwenden Sie Fehlerbalken, um Mittelwert, + - stddev und min / max anzuzeigen. Setzen Sie k auf die andere Achse.
Hat aufgehört - Anony-Mousse
1
Ich denke nicht, dass mehr Trainingsbeispiele die Wahrscheinlichkeit einer Überanpassung erhöhen. Ich habe mit diesem Datensatz eine Lernkurve erstellt, wiederum unter Verwendung von ShuffleSplit (n_splits = 300 mit verschiedenen Testgrößen) und eine stetig erhöhte Genauigkeit festgestellt, da mehr Trainingsbeispiele zur Verfügung gestellt wurden.
Brian Bien
1
Entschuldigung, Sie haben Recht, mehr ist besser und das Beste ist 1. Aber Sie haben dieses Problem nicht, wenn Sie einen mittleren quadratischen oder absoluten Fehler verwenden. Es hat also etwas mit dem Fehlerbegriff zu tun
rep_ho

Antworten:

1

Die r ^ 2-Punktzahl ist undefiniert, wenn sie auf eine einzelne Stichprobe angewendet wird (z. B. ausgelassener Lebenslauf).

r ^ 2 ist nicht gut für die Bewertung kleiner Testsätze: Wenn ein ausreichend kleiner Testsatz bewertet wird, kann die Punktzahl trotz guter Vorhersagen weit im Negativ liegen.

Bei einer einzelnen Stichprobe kann eine gute Vorhersage für eine bestimmte Domäne schrecklich erscheinen:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

Erhöhen Sie die Größe des Testsatzes (wobei die Genauigkeit der Vorhersagen gleich bleibt), und plötzlich erscheint der r ^ 2-Wert nahezu perfekt:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

Wenn die Testgröße 2 Stichproben beträgt und wir zufällig 2 Stichproben bewerten, die zufällig nahe beieinander liegen, hat dies erhebliche Auswirkungen auf den r ^ 2-Score, selbst wenn die Vorhersagen recht gut sind ::

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Brian Bien
quelle