Ganancia de información en R

8

Encontré paquetes que se utilizan para calcular la "Ganancia de información" para seleccionar los atributos principales en el Árbol de decisiones C4.5 y traté de usarlos para calcular la "Ganancia de información".

Pero los resultados del cálculo de cada paquete son diferentes como el código a continuación.

> 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

¿Por qué los resultados del cálculo de cada paquete son diferentes? ¿Y cuál es la correcta?

Archimpressom
fuente

Respuestas:

2

Esta no es una respuesta completa a su pregunta, pero puedo explicar al menos parte del problema. Como no proporciona sus datos, no puedo reproducir sus resultados. Sin embargo, es fácil demostrar el mismo problema con otros datos. Usaré el conocido conjunto de datos de iris que se proporciona con R y Weka y es de fácil acceso.

El mismo problema es evidente con los datos del 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

Como con su ejemplo, los tres paquetes dan resultados completamente diferentes.

Un problema: unidades (base de logaritmo)

Si observa la documentación information.gainen FSelector, verá la descripción de este parámetro:

unidad
Unidad para calcular la entropía (pasada a entropía). El valor predeterminado es "log".

Siguiendo ese rastro, miramos la descripción de la función de entropía y vemos:

unidad
la unidad en la que se mide la entropía. El valor predeterminado es "nats" (unidades naturales). Para calcular la entropía en "bits" set unit = "log2".

Si anulamos el valor predeterminado y calculamos IG usando unit = "log2" obtenemos

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

Tenga en cuenta que ahora los valores de Information Gain concuerdan con RWeka para Sepal.Width y Petal.Width. Parte de la diferencia era simplemente usar una base diferente para el logaritmo. RWeka utiliza la base 2 (entropía medida en bits). Por defecto, FSelector usa la base e , pero le permite cambiar la base y obtener algunos de los mismos resultados. De la documentación se desprende que ni RWeka ni CORElearn le permiten seleccionar la base para el logaritmo.

Pero es casi extraño que una vez que obtengamos a RWeka y FSelector en las mismas unidades, acuerden dos variables, pero no las otras dos. Todavía hay algo más sucediendo.

G5W
fuente
0

Agregando a [la respuesta de G5W] [ https://datascience.stackexchange.com/a/16249/29575] que FSelector (y posiblemente las otras implementaciones también) realiza una discretización de características antes de calcular los puntajes.

Para FSelector, esto se hace en el archivo selector.info.gain.R. Puede consultar la discretización con FSelector:::discretize.all. Este paso elimina información en la medida en que se altera el orden de las características.

aMKa
fuente