Gain d'informations en R

8

J'ai trouvé des packages utilisés pour calculer le "gain d'informations" pour sélectionner les principaux attributs dans l'arbre de décision C4.5 et j'ai essayé de les utiliser pour calculer le "gain d'informations".

Mais les résultats du calcul de chaque paquet sont différents comme le code ci-dessous.

> 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

Pourquoi les résultats du calcul de chaque paquet sont-ils différents? Et lequel a raison?

Archimpressom
la source

Réponses:

2

Ce n'est pas une réponse complète à votre question, mais je peux expliquer au moins une partie du problème. Puisque vous ne fournissez pas vos données, je ne peux pas reproduire vos résultats. Cependant, il est facile de démontrer le même problème avec d'autres données. J'utiliserai l'ensemble de données iris bien connu fourni avec R et Weka et qui est facile d'accès.

Le même problème est apparent avec les données de l'iris.

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

Comme avec votre exemple, les trois packages donnent des résultats complètement différents.

Un problème: les unités (base du logarithme)

Si vous consultez la documentation de information.gainFSelector, vous verrez cette description de paramètre:

unit
Unité de calcul de l'entropie (passée à l'entropie). La valeur par défaut est "log".

En suivant cette piste, nous regardons la description de la fonction d'entropie et voyons:

unité
unité dans laquelle l'entropie est mesurée. La valeur par défaut est "nats" (unités naturelles). Pour calculer l'entropie en "bits", réglez unit = "log2".

Si nous remplaçons la valeur par défaut et calculons IG en utilisant unit = "log2" nous obtenons

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

Notez que maintenant les valeurs pour le gain d'informations sont d'accord avec RWeka pour Sepal.Width et Petal.Width. Une partie de la différence était simplement d'utiliser une base différente pour le logarithme. RWeka utilise la base 2 (entropie mesurée en bits). Par défaut, FSelector utilise la base e , mais vous permet de modifier la base et d'obtenir certains des mêmes résultats. Il ressort de la documentation que ni RWeka ni CORElearn ne vous permettent de sélectionner la base du logarithme.

Mais il est presque plus étrange qu'une fois que nous obtenons RWeka et FSelector dans les mêmes unités, ils s'accordent sur deux variables, mais pas sur les deux autres. Il se passe encore autre chose.

G5W
la source
0

Ajoutant à [la réponse de G5W] [ https://datascience.stackexchange.com/a/16249/29575] que FSelector (et éventuellement les autres implémentations également) effectue une discrétisation des fonctionnalités avant de calculer les scores.

Pour FSelector, cela se fait dans le fichier selector.info.gain.R. Vous pouvez vérifier la discrétisation avec FSelector:::discretize.all. Cette étape supprime les informations dans la mesure où l'ordre des fonctionnalités est modifié.

aMKa
la source