R中的信息增益

数据挖掘 r 决策树
2021-09-23 12:51:15

我发现包用于计算“信息增益”以在 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 提供且易于访问的著名 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

与您的示例一样,所有三个包都给出完全不同的结果。

第一个问题:单位(对数的底)

如果您查看information.gainFSelector 中的文档,您将看到以下参数说明:

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 放在相同的单位中,它们会在两个变量上达成一致,但在其他两个变量上却不一致。还有其他事情正在发生。

添加到 [G5W 的答案][ https://datascience.stackexchange.com/a/16249/29575]中,FSelector(可能还有其他实现)在计算分数之前执行特征的离散化。

对于 FSelector,这是在文件 selector.info.gain.R 中完成的。您可以使用 来查看离散化FSelector:::discretize.all此步骤会删除特征顺序改变的信息。