Ich habe einen Datensatz mit 140000 Beispielen und 30 Funktionen, für die ich mehrere Klassifikatoren für eine binäre Klassifizierung trainiere (SVM, Logistic Regression, Random Forest usw.).
In vielen Fällen ist die Optimierung von Hyperparametern für den gesamten Datensatz mithilfe der Raster- oder Zufallssuche zeitlich zu kostspielig.
Ich begann mit der folgenden Technik
- Unterprobe meines Datensatzes
- Verwenden Sie die erhaltene Fraktion, um die Hyperparameter einzustellen
- Verwenden Sie die erhaltenen Parameter, um ein Modell mit dem gesamten Datensatz zu trainieren
Um jeden Parametersatz im zweiten Schritt zu bewerten, benutze ich sklearn
's GridSearchCV
mit cv = 10. Um das endgültige Modell zu bewerten, das ich im dritten Schritt erstelle, verwende ich sklearn
's cross_val_predict
. In diesem Sinne bewerte ich meine Modelle, indem ich 10% der Daten auslasse, trainiere den Rest und messe die Vorhersagegenauigkeit auf den 10%, iterativ 10-mal, und nehme dann den Durchschnitt der Bewertungen.
Was mich beunruhigt hat, ist, dass die Vorhersagegenauigkeit, die ich durch das Training meines gesamten Datensatzes erhalte, sehr nahe an der Bewertung liegt, die ich erhalte, wenn ich die Parameter auf den besten Parametersatz abstimme (jeder getestete Parametersatz gibt eine Punktzahl aus, die sich aus der Mittelung von 10 ergibt). Ergebnisse der Fold-Cross-Validierung).
In den meisten Fällen liegt die Genauigkeit, cross_val_predict
die anhand aller Trainingsbeispiele (gesamter Datensatz) gemessen wurde, etwas über der Bewertung der besten Parameter.
Zur Veranschaulichung wird hier eine Reihe von Parametern ausgewertet (bei einem kleineren Datensatz als dem, den ich oben beschrieben habe, aber der Effekt ist derselbe).
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
Und hier sind die gemittelten Punktzahlen (von cross_val_predict
), die ich aus dem Training für meinen gesamten Datensatz mit den besten Parametern erhalten habe
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Wie Sie sehen können, verbessert das Training des gesamten Datensatzes die Ergebnisse. Ich habe auch bestätigt, dass ein schlecht abgestimmtes Modell (z. B. die Verwendung der Standardwerte oder Zufallswerte für C
und gamma
) zu einer viel schlechteren Vorhersagegenauigkeit führt.
Insgesamt denke ich, dass das Optimieren der Hyperparameter für eine Teilmenge nicht ideal ist, aber möglicherweise zu relativ guten Ergebnissen führen kann, ohne zu lange warten zu müssen. Ich habe zum Beispiel vor der Verwendung dieses Ansatzes das optunity
Paket zum Optimieren des Hyperparameters für den gesamten Datensatz verwendet. Dieser Vorgang würde 3-5 Tage in Anspruch nehmen und zu Ergebnissen führen, die entweder eine wirklich gute Präzision oder einen wirklich guten Rückruf aufweisen, jedoch nicht beides. Obwohl für jede Klasse entweder die Präzision oder der Rückruf wirklich hoch war (höher als bei allen meinen anderen klassifikatoren hatten erreicht) die f1 messung war wirklich niedrig. Im Gegenteil, die Verwendung des späteren Ansatzes führt zu einigen Stunden Training und einer besseren F1-Messung.
Meine Anliegen sind:
Beschränke ich meine Klassifizierungsgenauigkeit? Vermeide ich es, die gesamte Vorhersagekraft zu nutzen, die mein Dataset bieten kann, indem ich nur auf eine Teilmenge abstimme? Wenn ein solcher Leistungsschaden eintritt, wird er irgendwie durch einen Faktor begrenzt?