【问题标题】:Decision Tree Learning决策树学习
【发布时间】:2019-03-21 04:43:32
【问题描述】:

我想实现决策树学习算法。

我对编码很陌生,所以我知道这不是最好的代码,但我只是希望它能够工作。不幸的是我得到了错误:e2 = b(pk2/(pk2 + nk2)) ZeroDivisionError: division by zero

有人可以向我解释我做错了什么吗?

【问题讨论】:

  • 我在您的代码 sn-p 中看不到 e2 = b(pk2/(pk2 + nk2)) 行,但我认为错误很有表现力:您除以零,这是数学上未定义的。既然你把(pk2 + nk2)分开了,难道这些可以是相同的不同的符号吗?
  • 可以分享count方法的代码
  • 是的,我现在已经添加了!我知道你不能除以零,但我不明白零是从哪里来的。

标签: python decision-tree


【解决方案1】:

让我们假设在经过一些拆分后,您留下了两条具有 3 个特征/属性的记录(最后一列是真值标签)

1 1 1 2 2 2 2 1

现在您将要选择下一个要拆分的最佳功能,因此您将此方法称为remainder(examples, attribute) 作为内部调用nk1, pk1 = pk_nk(1, examples, attribute) 的选择的一部分。

pk_nk 为上述行和特征返回的值将是0, 0,这将导致e1 = b(pk1/(pk1 + nk1)) 出现除零异常。根据您对 DT 的编码方式,这是一个有效的场景,您应该处理该案例。

【讨论】:

    【解决方案2】:

    (pk2 + nk2) 在某些时候等于零。如果我们向后退一步查看您的代码,我们会看到它们被分配在这里:

    nk2, pk2 = pk_nk(2, examples, attribute)
    

    def pk_nk(path, examples, attribute):
        nk = 0
        pk = 0
        for ex in examples:
            if ex[attribute] == path and ex[7] == NO:
                nk += 1
            elif ex[attribute] == path and ex[7] == YES:
                pk += 1
        return nk, pk
    

    因此,要使除数为零,nkpk 在函数中必须保持为零,即:

    • examples 为空,或
    • if/elif 条件都不满足

    【讨论】:

    • @AtleVågenSvendsgaard 好吧,这取决于您希望代码做什么。如果代码按预期编写,那么您的输入有问题。如果不是,您需要更改逻辑以适应这些输入值。但我不能告诉你什么应该/不应该是有效的输入。
    猜你喜欢
    • 2011-05-06
    • 2013-04-21
    • 2011-06-23
    • 2011-01-29
    • 2013-01-07
    • 2016-12-29
    • 1970-01-01
    • 2017-05-03
    • 2012-12-19
    相关资源
    最近更新 更多