Ganho de informações em R


8

Encontrei pacotes sendo usados ​​para calcular o "Ganho de Informações" para selecionar os principais atributos na Árvore de Decisão C4.5 e tentei usá-los para calcular o "Ganho de Informações".

Mas os resultados do cálculo de cada pacote são diferentes, como no código abaixo.

> 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 que os resultados do cálculo de cada pacote são diferentes? E qual deles está certo?

Respostas:


2

Esta não é uma resposta completa para sua pergunta, mas posso explicar pelo menos parte do problema. Como você não fornece seus dados, não consigo reproduzir seus resultados. No entanto, é fácil demonstrar o mesmo problema com outros dados. Usarei o conhecido conjunto de dados de íris fornecido com R e Weka e que é fácil de acessar.

O mesmo problema é aparente com os dados da íris.

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 no seu exemplo, todos os três pacotes fornecem resultados completamente diferentes.

Um problema: unidades (base do logaritmo)

Se você olhar para a documentação do information.gainFSelector, verá esta descrição de parâmetro:

unidade
Unidade para calcular a entropia (passada para a entropia). O padrão é "log".

Seguindo essa trilha, examinamos a descrição da função entropia e vemos:

unidade
a unidade na qual a entropia é medida. O padrão é "nats" (unidades naturais). Para calcular a entropia em "bits" defina unit = "log2".

Se substituirmos o padrão e calcularmos o IG usando unit = "log2", obteremos

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

Observe que agora os valores para o ganho de informações concordam com RWeka para Sepal.Width e Petal.Width. Parte da diferença era simplesmente usar uma base diferente para o logaritmo. RWeka usa a base 2 (entropia medida em bits). Por padrão, o FSelector usa a base e , mas permite alterar a base e obter alguns dos mesmos resultados. Parece na documentação que nem RWeka nem CORElearn permitem selecionar a base para o logaritmo.

Mas é quase estranho que uma vez que tenhamos RWeka e FSelector nas mesmas unidades, eles concordam em duas variáveis, mas não nas outras duas. Ainda há algo mais acontecendo.


0

Adicionando à [resposta do G5W] [ https://datascience.stackexchange.com/a/16249/29575] esse FSelector (e possivelmente também as outras implementações) executa uma discretização de recursos antes de calcular pontuações.

Para FSelector, isso é feito no arquivo selector.info.gain.R. Você pode verificar a discretização com FSelector:::discretize.all. Esta etapa remove as informações na medida em que a ordem dos recursos é alterada.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.