2013-07-16 8 views
7

Ich arbeite an der 3D-Punkt-Identifikation mit der RandomForest-Methode von scikit. Eines der Probleme, auf die ich immer wieder stoße, ist, dass bestimmte Klassen häufiger als andere Klassen vorhanden sind. Dies bedeutet, dass der Klassifikator bei der Generierung von Vorhersagen durch den trainierten Klassifikator eher davon ausgeht, dass er zu einer der gebräuchlichen Klassen als zu der weniger gebräuchlichen Klasse gehört, wenn der Klassifikator über eine Punktklasse unsicher ist.Gewichtung von Klassen in einer RandomForest-Implementierung

Ich sehe, dass in der Scikit-Dokumentation for random forests gibt es einen sample_weight Parameter in der Fit-Methode. Von dem, was ich sagen kann, gewichtet nur bestimmte Gesamtproben (sagen wir, ich habe 50 Dateien, von denen ich trainiere, wird es die erste Probe doppelt so schwer wie alles andere gewichten) statt Klassen. Dies behebt das Problem nicht, da die am wenigsten verbreiteten Klassen in allen Samples, die ich habe, ungefähr so ​​selten sind. Es ist nur die Art dieser bestimmten Klasse.

Ich habe einige Papiere über ausgewogene zufällige Wälder und gewichtete zufällige Wälder gefunden. Aber ich habe nichts darüber gesehen, wie man das in Scikit benutzt. Ich hoffe, dass ich falsch liege - gibt es eine Möglichkeit, die eingebauten Klassen zu belasten? Soll ich etwas Getrenntes schreiben, das künstlich das Gewicht verschiedener Klassen in meinen Proben ausgleicht?

* EDIT mein Verständnis von sample_weight * Sample_weight entsprechend der Dokumentation zu klären scheint Proben und nicht die Klasse Gewicht zu beziehen. Also, wenn ich Dateien A, B und C in den Klassen 1, 2 und 3 Und lassen Sie uns sagen:

A = [1 1 1 2] 
B = [2 2 1 1] 
C = [3 1 1 1] 

Blick über wir eine Situation haben, sehr vereinfacht, in denen wir haben nur sehr wenige der Klasse 3 im Vergleich zu die anderen Klassen. Meine Situation hat 8 Klassen und trainiert auf Millionen von Punkten, aber das Verhältnis ist immer noch unglaublich gegen zwei bestimmte Klassen verzerrt.

Mit der sample_weight, die ein Array der Größe m aufnimmt (wobei m die Anzahl der Samples ist), würde ich gewichten können, wie stark eine dieser drei Dateien funktioniert. Also mein Verständnis ist, dass ich ein sample_weight = [1 1 2] machen kann, was die Probe C doppelt so stark machen würde wie die anderen beiden Samples. Aber das hilft nicht wirklich, weil mein Problem ist, dass die Klasse 3 extrem selten ist (in den tatsächlichen Daten ist es 1k Punkte von Millionen statt 1 von 12). Die Erhöhung der Gewichtung einer gegebenen Probe erhöht nicht das Gewicht bestimmter Klassen, es sei denn, ich täusche einige Daten nach, in denen die Probe fast nur aus dieser bestimmten Klasse besteht.

Ich fand sklearn.preprocessing.balance_weights(y) in der Dokumentation, aber ich kann niemanden finden, der es verwendet. In der Theorie macht es, was ich tun muss, aber ich sehe nicht, wie ich das Gewicht-Array wieder in meine Random Forest passen kann.

+4

Ich verstehe nicht: "Dies behebt das Problem nicht, weil die am wenigsten gemeinsamen Klassen in allen Samples, die ich habe, so selten sind. Es ist nur die Art dieser bestimmten Klasse." Wenn Sie die Beispielgewichtungen auf 'sample_weight = (1/n_samples_in_same_class)} setzen, würde das sinnvolle Werte für Klassengewichtungen ergeben. – ogrisel

+0

sample_weight gemäß der Dokumentation scheint sich auf Proben und nicht auf das Klassengewicht zu beziehen. – Nahkki

+1

Ja, aber Sie können allen Stichproben der gleichen Klasse dasselbe Stichprobengewicht zuweisen, und Sie werden so gewichtet, als ob Sie Klassengewichte bereitgestellt hätten. Es ist möglich, Klassengewichte zu simulieren, indem man das Gewicht der Probe angibt, aber nicht umgekehrt. – ogrisel

Antwort

2

Ich schätze, das gilt nur für die neuere Version von scikit-learn, aber Sie können dies jetzt verwenden.

Verwandte Themen