我想实现决策树学习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
因此,要使除数等于零nk
和pk
必须通过该功能保持零,即:
-
examples
是空的,或 - 如果/elif条件不满足