Rでの情報獲得


8

C4.5ディシジョンツリーで主要な属性を選択するための「情報ゲイン」の計算に使用されているパッケージを見つけて、「情報ゲイン」の計算にそれらを使用してみました。

ただし、以下のコードのように、各パッケージの計算結果は異なります。

> 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

各パッケージの計算結果が異なるのはなぜですか?そしてどちらが正しいのですか?

回答:


2

これはあなたの質問に対する完全な答えではありませんが、問題の少なくとも一部を説明することができます。データを提供していないため、結果を再現できません。ただし、他のデータで同じ問題を実証するのは簡単です。私は、RとWekaで提供され、アクセスが簡単な、よく知られたアイリスデータセットを使用します。

同じ問題が虹彩データでも明らかです。

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

例と同様に、3つのパッケージはすべて、まったく異なる結果をもたらします。

1つの問題:単位(対数の底)

information.gainFSelector のドキュメントを見ると、次のパラメーターの説明が表示されます。

unit
エントロピーを計算するためのユニット(エントロピーに渡される)。デフォルトは「ログ」です。

そのトレイルに続いて、エントロピー関数の説明を見て、次のことを確認します。

unit
エントロピーが測定される単位。デフォルトは「nats」(自然単位)です。「ビット」でエントロピーを計算するには、unit = "log2"を設定します。

デフォルトを上書きしてunit = "log2"を使用してIGを計算すると、

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

ここで、Information Gainの値がSepal.WidthおよびPetal.WidthのRWekaと一致することに注意してください。違いの一部は、単に対数に異なる底を使用したことです。RWekaは、基数2(ビット単位で測定されるエントロピー)を使用します。デフォルトでは、FSelectorはベースeを使用しますを使用しますが、ベースを変更して同じ結果のいくつかを取得できます。ドキュメントから、RWekaもCORElearnも対数の底を選択できないように見えます。

しかし、RWekaとFSelectorを同じ単位で取得すると、2つの変数については一致するが、他の2つについては一致しないというのは、ほとんど奇妙です。まだ何か他のことが起こっています。


0

[G5Wの回答] [ https://datascience.stackexchange.com/a/16249/29575]に、FSelector(およびおそらく他の実装も)がスコアを計算する前に機能の離散化を実行することを追加します。

FSelectorの場合、これはファイルselector.info.gain.Rで行われます。で離散化を確認できFSelector:::discretize.allます。この手順では、機能の順序が変更される程度に情報が削除されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.