Unterschied zwischen varImp (Caret) und Wichtigkeit (randomForest) für zufällige Gesamtstruktur

8

Ich verstehe nicht, was der Unterschied zwischen varImp Funktion ( caret Paket) und importance Funktion ( randomForest Paket) für ein zufälliges Waldmodell ist:

Ich habe ein einfaches RF-Klassifikationsmodell berechnet und bei der Berechnung der Variablenbedeutung festgestellt, dass das "Ranking" der Prädiktoren nicht für beide Funktionen gleich ist:

Hier ist mein Code:

%Vor%

Ich dachte, sie hätten den gleichen "Algorithmus" benutzt, aber ich bin mir jetzt nicht sicher.

BEARBEITEN

Um das Problem zu reproduzieren, kann der Datensatz ionosphere (Paket kknn) verwendet werden:

%Vor%

Ich glaube, ich vermisse etwas ...

BEARBEITEN 2

Ich habe herausgefunden, dass wenn Sie den Mittelwert jeder Zeile der ersten zwei Spalten von importance(rfImp) machen, die Ergebnisse von varImp(rfImp) :

erhalten %Vor%

Ich weiß nicht, warum das passiert, aber dafür muss es eine Erklärung geben.

    
Rafa OR 17.06.2016, 18:59
quelle

3 Antworten

7

Wenn wir die Methode für varImp durchgehen:

Überprüfen Sie das Objekt:

%Vor%

Holen Sie sich die S3-Methode:

%Vor%

Es wird also nicht zufällig randomForest :: importance,

zurückgegeben

Es beginnt mit der Berechnung, wählt dann aber nur die kategorialen Werte aus, die sich im Dataset befinden.

Dann macht es etwas Interessantes, es prüft, ob wir nur zwei Spalten haben:

%Vor%

Laut der varImp-Manpage:

  

Random Forest: varImp.randomForest und varImp.RandomForest sind   Wrapper um die Wichtigkeit Funktionen aus dem RandomForest und   Party-Pakete jeweils.

Dies ist eindeutig nicht der Fall.

Warum?

Wenn wir nur zwei Werte haben, kann die Wichtigkeit der Variablen als Prädiktor als ein Wert dargestellt werden.

Wenn die Variable ein Prädiktor für g ist, muss sie auch ein Prädiktor für b

sein

Es macht Sinn, aber das passt nicht zu ihrer Dokumentation über das, was die Funktion tut, also würde ich dies wahrscheinlich als unerwartetes Verhalten melden. Die Funktion versucht zu helfen, wenn Sie die relative Berechnung selbst erwarten.

    
Shape 05.10.2016, 17:14
quelle
3

Diese Antwort ist als Ergänzung zur Lösung von @Shape gedacht. Ich denke, dass importance dem bekannten Ansatz von Breiman folgt, die als MeanDecreaseAccuracy gemeldete Variablenbedeutung zu berechnen, dh für die Out-of-Bag-Probe jedes Baums die Genauigkeit des Baumes zu berechnen und die Variablen danach zu permutieren die andere und messen die Genauigkeit nach der Permutation, um die Abnahme der Genauigkeit ohne diese Variable zu berechnen.
Ich konnte nicht viele Informationen darüber finden, wie genau die klassenspezifische Genauigkeitsabnahme in den ersten Spalten berechnet wird, aber ich nehme an, dass es richtig vorhergesagte Klasse k / gesamte vorhergesagte Klasse k ist.

Wie @Shape erklärt, meldet varImp nicht die von MeanDecreaseAccuracy gemeldete importance , sondern berechnet stattdessen den Mittelwert der (skalierten) klassenspezifischen Genauigkeitsabnahme und meldet sie für jede der Klassen. (Für mehr als 2 Klassen meldet varImp nur die klassenspezifische Genauigkeitsreduktion.)
Dieser Ansatz ist nur dann ähnlich, wenn die Klassenverteilung gleich ist. Der Grund ist, dass nur im ausgeglichenen Fall eine Verringerung der Genauigkeit einer Klasse die Genauigkeit in der anderen Klasse gleichermaßen verringert.

%Vor%

Ich glaube, dies kann so interpretiert werden, dass alle Klassen gleich gewichtet werden, während importance Variablen als wichtiger bezeichnet, wenn sie für die gebräuchlichere Klasse wichtig sind. Ich stimme Max Kuhn darin zu, aber der Unterschied sollte irgendwo in der Dokumentation erklärt werden.

    
joha 27.01.2017 13:19
quelle
2

Ich habe nicht Ihre genauen Daten, sondern Dummy-Daten (siehe unten). Ich kann dieses Verhalten nicht reproduzieren. Vielleicht überprüfen Sie, ob Sie wirklich nichts anderes getan haben, was Ihre Ergebnisse beeinflussen könnte. Welche Version von R und Caret benutzt du?

%Vor%

Aktualisierung:

Mit den Ionosphere Daten ist dies reproduzierbar:

%Vor%

... mit diesen Ergebnissen:

%Vor%

Meine Vermutung wäre, dass caret und randomForest nur verschiedene Methoden verwenden, um Ergebnisse aus verschiedenen Läufen für jede Variable zu aggregieren - aber @topepo wird Ihnen wahrscheinlich jetzt eine genaue Antwort geben.

    
geekoverdose 20.06.2016 20:05
quelle