Wie man die zufälligen Waldbäume dazu bringt, Dezimalstellen zu stimmen, aber nicht binär

9

Meine Frage betrifft die binäre Klassifizierung, beispielsweise die Trennung von guten und schlechten Kunden, aber nicht die Regression oder nicht-binäre Klassifizierung. In diesem Zusammenhang ist ein zufälliger Wald ein Ensemble von Klassifizierungsbäumen. Für jede Beobachtung stimmt jeder Baum mit "Ja" oder "Nein", und die durchschnittliche Stimme aller Bäume ist die endgültige Waldwahrscheinlichkeit.

Meine Frage bezieht sich auf das Ändern des Verhaltens der zugrunde liegenden Bäume: Wie können wir die randomForest-Funktion (des randomForest-Pakets von R) so ändern, dass jeder Baum eine Dezimalzahl anstelle eines binären Ja / Nein stimmt. Um besser zu verstehen, was ich mit Dezimalstelle meine, lassen Sie uns darüber nachdenken, wie Entscheidungsbäume funktionieren.

Ein ausgewachsener Entscheidungsbaum hat 1 gute oder 1 schlechte Instanz in seinen Endknoten. Angenommen, ich beschränke die Größe des Terminalknotens auf 100. Dann sehen die Terminalknoten folgendermaßen aus:

Knoten1 = 80 schlecht, 20 gut
Knoten2 = 51 schlecht, 49 gut
Knoten3 = 10 schlecht, 90 gut

Beachten Sie, dass, obwohl Node1 und Node2 "schlecht" stimmen, ihre "Stärke der Schlechtigkeit" stark unterschiedlich ist. Das ist es, wonach ich suche. Anstatt 1 oder 0 zu erzeugen (was das Standardverhalten ist), kann man das R-Paket so ändern, dass sie 80/100, 51/100, 10/100 usw. wählen?

FatihAkici
quelle
Ich
FatihAkici
Sie meinen, Sie möchten die tatsächlich vorhergesagten Wahrscheinlichkeiten , nicht nur die wahrscheinlichste vorhergesagte Klasse.
smci
Ja @smci genau.
FatihAkici

Antworten:

10

Dies ist ein subtiler Punkt, der von Software zu Software unterschiedlich ist. Es gibt zwei Hauptmethoden, die mir bekannt sind:

  1. Binäre Blätter - Jedes Blatt stimmt mit der Mehrheit ab. So randomForestfunktioniert R auch bei Verwendungpredict(..., type="prob")
  2. Proportionsblätter - Jedes Blatt gibt den Anteil der Trainingsmuster zurück, die zu jeder Klasse gehören. So sklearn.ensemble.RandomForestClassifier.predict_probafunktioniert es. In einer anderen Antwort weist @ usεr11852 darauf hin, dass das rangerPaket von R auch diese Funktionalität bietet. Glücklicherweise kann ich bestätigen, dass meine begrenzte Nutzung rangerauch viel, viel schneller ist als randomForest.

Ich glaube nicht, dass es einen einfachen Weg gibt, randomForestdie Proportional-Leaf-Methode anzuwenden, da die R-Software eigentlich nur ein Haken in ein C & FORTRAN-Programm ist. Sofern Sie nicht gerne den Code eines anderen ändern, müssen Sie entweder Ihren eigenen Code schreiben oder eine andere Softwareimplementierung finden.

Sycorax sagt Reinstate Monica
quelle
Vielen Dank, Sycorax. Denken Sie, dass der Quellcode von Rs randomForest geändert werden kann, um dies zu begleiten?
FatihAkici
Bei ausreichenden Ressourcen kann jede Software geändert werden, um alles zu tun. Auf der anderen Seite randomForesthandelt es sich nur um eine R-Schnittstelle zum FORTRAN-Code, sodass möglicherweise erhebliche Ressourcen erforderlich sind, um dies zu erreichen.
Sycorax sagt Reinstate Monica
@FatihAkici Eigentlich sieht es so aus, als hätte ich mich geirrt. Der kompilierte Code ist ein C-Port von Breimans ursprünglichem FORTRAN-Code.
Sycorax sagt Reinstate Monica
5
Ich habe im Rahmen einer REU für einen Sommer 2015 an dem randomForest-Paket gearbeitet. Es ist definitiv möglich, den Code zu ändern, um dies zu tun, aber es ist ein bisschen schwierig, weil es tatsächlich C-Fortran gemischt ist. Der größte Teil des "äußeren" Codes ist C, während einige Kernfunktionen in Fortran verbleiben und nach der Kompilierung verknüpft werden. Leider ist es zu lange her, dass ich den Code gesehen habe, um zu wissen, wo ich suchen muss. Ich würde jedoch empfehlen, bereit zu sein, sowohl in C als auch in Fortran zu arbeiten, wenn Sie das Paket ändern möchten.
Chipbuster
5

Es ist durchaus möglich, einen "Wahrscheinlichkeitswald" anzubauen. Die Methodik von Malley et al. (2012) " Wahrscheinlichkeitsmaschinen: Konsistente Wahrscheinlichkeitsschätzung unter Verwendung nichtparametrischer Lernmaschinen ", in der beschrieben wird, wie dies getan wird und wie es mit der Standardimplementierung zufälliger Gesamtstrukturen verglichen wird. Darüber hinaus implementiert der hervorragende R-Paket- Ranger diese Funktionalität bereits. Einfach probability = TRUEbeim Funktionsaufruf einstellen ranger.

usεr11852
quelle
2

Einfach benutzen predict.randomForest(..., type="prob"). Du machst eine gute Sache .

Stephan Kolassa
quelle
2
Stephan, danke für deine Antwort, aber das ist nicht das, wonach ich suche. Der von Ihnen erwähnte Code nimmt den Durchschnitt der zugrunde liegenden binären Baumstimmen, aber ich versuche, die zugrunde liegenden Bäume dezimal abstimmen zu lassen. In einem Wald mit 3 Bäumen möchte ich also nicht (1 + 1 + 0) / 3, sondern (.80 + .51 + .10) / 3. Ist das sinnvoll?
FatihAkici
2
Es macht Sinn, und das ist das Verhalten des zufälligen Waldklassifikators in sklearn: scikit-learn.org/stable/modules/generated/…
psarka
1
Ah, ich verstehe deinen Standpunkt. Entschuldigung, dann habe ich falsch verstanden. Nach der Hilfeseite zu urteilen und die predict.allund die norm.votesParameter zu betrachten, scheint dies nicht möglich zu sein. Wenn Sie dies wirklich wollen, müssen Sie wahrscheinlich Ihre eigene zufällige Gesamtstruktur codieren. Ich stimme @psarka zu, dass dies absolut sinnvoll ist. (Ich würde diese Antwort löschen, aber dann würden wir diese Diskussion in den Kommentaren verlieren.)
Stephan Kolassa
Es war in der Tat eine sehr fruchtbare Diskussion, lieber Stephan und @psarka. Vielen Dank!
FatihAkici