Penghasilan Informasi dalam R

8

Saya menemukan paket yang digunakan untuk menghitung "Information Gain" untuk memilih atribut utama di C4.5 Decision Tree dan saya mencoba menggunakannya untuk menghitung "Information Gain".

Tetapi hasil perhitungan masing-masing paket berbeda seperti kode di bawah ini.

> 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

Mengapa hasil perhitungan setiap paket berbeda? Dan yang mana yang benar?

Archimpressom
sumber

Jawaban:

2

Ini bukan jawaban lengkap untuk pertanyaan Anda, tetapi saya bisa menjelaskan setidaknya sebagian dari masalah. Karena Anda tidak memberikan data Anda, saya tidak dapat mereproduksi hasil Anda. Namun, mudah untuk menunjukkan masalah yang sama dengan data lain. Saya akan menggunakan set data iris terkenal yang disediakan dengan R dan Weka dan mudah diakses.

Masalah yang sama juga terlihat pada data 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

Seperti contoh Anda, ketiga paket memberikan hasil yang sama sekali berbeda.

Satu Masalah: Unit (Basis Logaritma)

Jika Anda melihat dokumentasi untuk information.gaindi FSelector, Anda akan melihat deskripsi parameter ini:

unit
Unit untuk menghitung entropi (diteruskan ke entropi). Defaultnya adalah "log".

Mengikuti jejak itu, kita melihat deskripsi fungsi entropi dan melihat:

unit
unit di mana entropi diukur. Standarnya adalah "nats" (satuan alami). Untuk menghitung entropi dalam "bit" set unit = "log2".

Jika kita mengganti default dan menghitung IG menggunakan unit = "log2" yang kita dapatkan

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

Perhatikan bahwa sekarang nilai untuk Penguatan Informasi setuju dengan RWeka untuk Sepal.Width dan Petal.Width. Bagian dari perbedaannya adalah hanya menggunakan basis yang berbeda untuk logaritma. RWeka menggunakan basis 2 (entropi diukur dalam bit). Secara default, FSelector menggunakan basis e , tetapi memungkinkan Anda untuk mengubah basis dan mendapatkan beberapa hasil yang sama. Tampaknya dari dokumentasi bahwa baik RWeka maupun CORE tidak mempelajari Anda memilih basis untuk logaritma.

Tetapi hampir aneh bahwa sekali kita mendapatkan RWeka dan FSelector di unit yang sama, mereka setuju pada dua variabel, tetapi tidak pada dua variabel lainnya. Masih ada hal lain yang terjadi.

G5W
sumber
0

Menambahkan ke [jawaban G5W] [ https://datascience.stackexchange.com/a/16249/29575] bahwa FSelector (dan mungkin juga implementasi lainnya) melakukan diskritisasi fitur sebelum menghitung skor.

Untuk FSelector, ini dilakukan di file selector.info.gain.R. Anda dapat memeriksa diskretisasi dengan FSelector:::discretize.all. Langkah ini menghapus informasi sejauh urutan fitur diubah.

aMKa
sumber