Ich habe versucht, gewichtete Samples in scikit-learn zu verwenden, während ich einen Random Forest Classifier trainiere. Es funktioniert gut, wenn ich eine Probengewichtung direkt an den Klassifizierer weiterleite, z. RandomForestClassifier().fit(X,y,sample_weight=weights)
, aber wenn ich eine Rastersuche versucht, besser Hyper für den Klassifikator zu finden, schlug ich eine Wand:Beispielgewichte in scikit-learn gebrochene Kreuzvalidierung
die Gewichte zu übergeben, wenn der Raster Parameter verwendet, ist die Nutzung:
grid_search = GridSearchCV(RandomForestClassifier(), params, n_jobs=-1,
fit_params={"sample_weight"=weights})
Das Problem ist, dass der Kreuzvalidator keine Stichprobengewichte kennt und diese daher nicht zusammen mit den tatsächlichen Daten neu abtastet, so dass der Aufruf grid_search.fit(X,y)
fehlschlägt: Der Kreuzvalidator erzeugt Teilmengen von X und y, sub_X und sub_y und schließlich einen Klassifizierer aufgerufen mit classifier.fit(sub_X, sub_y, sample_weight=weights)
aber jetzt Gewichte wurde nicht neu abgetastet, so dass eine Ausnahme ausgelöst wird.
Für jetzt habe ich um das Problem herum gearbeitet, indem ich Proben mit hohem Gewicht überbeprobt habe, bevor ich den Klassifikator trainiere, aber es ist ein vorübergehender Workaround. Irgendwelche Vorschläge zum weiteren Vorgehen?
Das Problem ist, dass GridSearchCV die Kreuzvalidierung in seinen Code eingebettet hat. Ich habe kein Problem, das zu ändern, aber es scheint mir dreckig zu sein. Sind die beiden Ansätze (Resampling und Gewichtung) als Meta-Frage tatsächlich gleichwertig? hmm, schaute ein bisschen hinein und es scheint, dass sie nicht sind aber auch, dass beide gut funktionieren: http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf –
Ich fing an, Hyperparameter-Suche zu modifizieren ('fit_grid_point' in grid_search.py), um Klassengewichte zu berücksichtigen, und dann erkannte ich, dass es in scikit-learn noch ein weiteres eklatantes Unterlassen gibt: Das Scoring in der Kreuzvalidierung wird auch die Klassengewichte nicht berücksichtigen (mir ist mehr wichtig die Minderheitsklasse bei der Bewertung des Fehlers falsch klassifizieren). Das alles bringt mich dazu, Resampling durchzuführen und dieses Problem nur dann richtig zu beheben, wenn ich auf Performance-Probleme stoße. –