决策树学习



我想实现决策树学习alogorithm。

我是编码的新手,所以我知道这不是最好的代码,但我只是希望它起作用。不幸的是我发现错误: e2 = b(pk2/(pk2 + nk2)) ZeroDivisionError: division by zero

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

让我们假设在某些拆分后您将留下两个具有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的编码方式,您应该处理案例。

(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是空的,或
  • 如果/elif条件不满足