Informationsgewinn in R.


8

Ich habe Pakete gefunden, die zur Berechnung des "Informationsgewinns" zur Auswahl der Hauptattribute in C4.5 Decision Tree verwendet werden, und ich habe versucht, sie zur Berechnung des "Informationsgewinns" zu verwenden.

Die Ergebnisse der Berechnung der einzelnen Pakete unterscheiden sich jedoch wie im folgenden Code.

> IG.CORElearn <- attrEval(In_Occu ~ In_Temp+In_Humi+In_CO2+In_Illu+In_LP+Out_Temp+Out_Humi, dataUSE1, estimator = "InfGain")
> IG.RWeka     <- InfoGainAttributeEval(In_Occu ~ In_Temp+In_Humi+In_CO2+In_Illu+In_LP+Out_Temp+Out_Humi, dataUSE1)
> IG.FSelector <- information.gain(In_Occu ~ In_Temp+In_Humi+In_CO2+In_Illu+In_LP+Out_Temp+Out_Humi,dataUSE1)

> IG.CORElearn
   In_Temp    In_Humi     In_CO2    In_Illu      In_LP   Out_Temp   Out_Humi 
0.04472928 0.02705100 0.09305418 0.35064927 0.44299167 0.01832216 0.05551973 
> IG.RWeka
   In_Temp    In_Humi     In_CO2    In_Illu      In_LP   Out_Temp   Out_Humi 
0.11964771 0.04340197 0.12266724 0.38963327 0.44299167 0.03831816 0.07705798 
> IG.FSelector
         attr_importance
In_Temp       0.08293347
In_Humi       0.02919697
In_CO2        0.08411316
In_Illu       0.27007321
In_LP         0.30705843
Out_Temp      0.02656012
Out_Humi      0.05341252

Warum sind die Ergebnisse der Berechnung der einzelnen Pakete unterschiedlich? Und welches ist richtig?

Antworten:


2

Dies ist keine vollständige Antwort auf Ihre Frage, aber ich kann zumindest einen Teil des Problems erklären. Da Sie Ihre Daten nicht angeben, kann ich Ihre Ergebnisse nicht reproduzieren. Es ist jedoch einfach, dasselbe Problem mit anderen Daten zu demonstrieren. Ich werde den bekannten Iris-Datensatz verwenden, der mit R und Weka geliefert wird und leicht zugänglich ist.

Das gleiche Problem ist bei den Irisdaten offensichtlich.

library(CORElearn)
library(RWeka)
library(FSelector)
IG.CORElearn <- attrEval(Species ~ ., data=iris,  estimator = "InfGain")
IG.RWeka     <- InfoGainAttributeEval(Species ~ ., data=iris,)
IG.FSelector <- information.gain(Species ~ ., data=iris,)

IG.CORElearn
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   0.5572327    0.2831260    0.9182958    0.9182958 

IG.RWeka 
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   0.6982615    0.3855963    1.4180030    1.3784027 

IG.FSelector
             attr_importance
Sepal.Length       0.4521286
Sepal.Width        0.2672750
Petal.Length       0.9402853
Petal.Width        0.9554360

Wie in Ihrem Beispiel liefern alle drei Pakete völlig unterschiedliche Ergebnisse.

Ein Problem: Einheiten (Basis des Logarithmus)

Wenn Sie sich die Dokumentation information.gainin FSelector ansehen, sehen Sie diese Parameterbeschreibung:

Einheit
Einheit zur Berechnung der Entropie (an Entropie übergeben). Standard ist "log".

Auf diesem Weg sehen wir uns die Beschreibung der Entropiefunktion an und sehen:

Einheit
die Einheit, in der die Entropie gemessen wird. Der Standardwert ist "nats" (natürliche Einheiten). Für die Berechnung der Entropie in "Bits" setzen Sie unit = "log2".

Wenn wir die Standardeinstellung überschreiben und IG mit unit = "log2" berechnen, erhalten wir

IG.FSelector2 <- information.gain(Species ~ ., data=iris, unit="log2")
IG.FSelector2 
             attr_importance
Sepal.Length       0.6522837
Sepal.Width        0.3855963
Petal.Length       1.3565450
Petal.Width        1.3784027

Beachten Sie, dass jetzt die Werte für Information Gain mit RWeka für Sepal.Width und Petal.Width übereinstimmen. Ein Teil des Unterschieds bestand darin, einfach eine andere Basis für den Logarithmus zu verwenden. RWeka verwendet Basis 2 (Entropie gemessen in Bits). Standardmäßig verwendet FSelector die Basis e , ermöglicht es Ihnen jedoch, die Basis zu ändern und einige der gleichen Ergebnisse zu erzielen . Aus der Dokumentation geht hervor, dass Sie weder mit RWeka noch mit CORElearn die Basis für den Logarithmus auswählen können.

Es ist jedoch fast seltsam, dass RWeka und FSelector, sobald wir sie in denselben Einheiten haben, sich auf zwei Variablen einigen, aber nicht auf die beiden anderen. Es ist noch etwas anderes los.


0

Wenn Sie zur Antwort von [G5W] [ https://datascience.stackexchange.com/a/16249/29575] hinzufügen, führt FSelector (und möglicherweise auch die anderen Implementierungen) eine Diskretisierung der Funktionen durch, bevor die Ergebnisse berechnet werden.

Für FSelector erfolgt dies in der Datei selector.info.gain.R. Sie können die Diskretisierung mit überprüfen FSelector:::discretize.all. Dieser Schritt entfernt Informationen in dem Maße, in dem die Reihenfolge der Features geändert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.