【问题标题】:Is ID3 Machine Learning Algorithm able to handle more than YES/NO classes?ID3 机器学习算法是否能够处理超过 YES/NO 类?
【发布时间】:2016-03-28 18:15:17
【问题描述】:

我在这五天里几乎没有睡觉,现在我束手无策了。事实上,由于睡眠不足,我现在感觉不舒服。

我已经用两个类实现了 ID3,例如YES/NO,现在我的任务是处理一个具有 3 倍可能结果的数据集。

数据子集示例:

3.4,5.2,1.4,0.2,BarnOwl
2.3,4.5,1.3,0.3,BarnOwl
3.4,6,4.5,1.6,SnowyOwl
2.9,5.7,4.2,1.3,SnowyOwl
2.8,6.4,5.6,2.1,LongEaredOwl
3.2,6.4,5.3,2.3,LongEaredOwl
2.8,6.2,4.8,1.8,LongEaredOwl
2.3,5,3.3,1,SnowyOwl

我将数据打乱,并将前 100 个条目作为训练数据,所以一个示例分解:

{'SnowyOwl': 32, 'BarnOwl': 35, 'LongEaredOwl': 33}

在计算中

Entropy(32SO, 35BO, 33LO) =

= 1.58395

我编写了代码并检查了熵函数,而不是在范围内得到结果

Entropy = [0..1]

我收到1.58395

我得到的公式与YES/NO 完美搭配(对不起质量问题)

确认我的函数正在计算正确的结果,尽管超出了我使用的预期范围http://www.wolframalpha.com/

谁能确认这个公式是正确的? 那么为什么它超出了我的预期范围。

【问题讨论】:

    标签: machine-learning


    【解决方案1】:

    n 值离散随机变量的熵位于[0, log2(n)] 范围内。这意味着对于 3 个结果,范围将是 [0, \log2(3)] = [0, 1.58496250072]。答案是肯定的,你的熵公式很好。

    (要看到这一点,请注意,当所有结果的概率相同时,熵达到最大值,即1/n。然后-1/n\log2(1/n) - ... -1/n\log2(1/n) = n * 1/n * \log2(n) = log2(n)。另一方面,熵将在以下情况下取最小值其中一个结果以概率 1 发生,而所有其他结果以概率 0 发生:1*log2(1) - 0*log2(0) - ... - 0*log2(0) = 0。这就是范围为[0, log2(n)] 的原因。我忽略了熵在这两点上确实取最大值和最小值的证明。注意我设置了0*log2(0):=0,因为log2(0) 不存在。在实践中,通常会确保总和超过p*log2(p)p>0 的条款。)

    【讨论】:

    • 非常感谢 Blaz。这很有道理!
    • 如果可以的话,还有一个问题,如果有零个是/否,我返回 0,因为没有熵。但在我的示例中,如果我的一个类为零 -(32/100)log2(32/100)-(68/100)log2(68/100)-(0/100)log2(0/100) 将导致碰撞。事实上,我认为我无法成功完成此任务,这很不幸,因为如果允许我使用它,KNN 将轻松解决此问题。
    • 好答案。另请注意,您仍然可以通过使用基数为 N 的log 来规范化两个以上类的熵,其中 N 是类的数量。对于所有相等概率 (1 / N),最大熵将为 1,最小熵仍为 0(当单个类的概率为 1 而所有其他类的概率为 0)。
    • @chris,它会因为 log2(0) 未定义而崩溃吗?也许你可以检查是否 p=0;如果是这样,请忽略该术语,因为它对熵没有贡献。 (前段时间我实现了增量决策树学习器here;考虑查看hoeffding.cpp 以获取计算信息增益的函数;也许它会对您有所帮助。)
    • 好吧,归根结底,归一化并不重要,因为无论如何他都应该得到相同的树。但是关于@chris 期望熵在 [0..1] 范围内,使用 logN 可以做到这一点。当然,这也意味着信息增益也被限制为1。
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2017-06-07
    • 2011-08-01
    • 2018-09-05
    • 2021-04-01
    • 1970-01-01
    • 2018-11-09
    • 2016-08-30
    相关资源
    最近更新 更多