我正在尝试将减少错误的后修剪应用于通过Python中的嵌套字典实现的决策树。这是一棵树的样本,当拟合到数据上时,它的约束深度最多为三层(尽管可能更深)。
{'isLeaf': 'no',
'attr': 8,
'val': 0.936979167,
'mode': 0,
'left': {'isLeaf': 'no',
'attr': 's',
'val': 'Summer',
'mode': 0,
'left': {'isLeaf': 'no',
'attr': 'a',
'val': 4,
'mode': 0,
'left': {'isLeaf': 'yes', 'mode': 0, 'left': None, 'right': None},
'right': {'isLeaf': 'yes', 'mode': 0, 'left': None, 'right': None}},
'right': {'isLeaf': 'no',
'attr': 3,
'val': 'Sky',
'mode': 0,
'left': {'isLeaf': 'yes', 'mode': 0, 'left': None, 'right': None},
'right': {'isLeaf': 'yes', 'mode': 0, 'left': None, 'right': None}}},
'right': {'isLeaf': 'no',
'attr': 4,
'val': 23,
'mode': 1,
'left': {'isLeaf': 'no',
'attr': 1,
'val': 24.6,
'mode': 0,
'left': {'isLeaf': 'yes', 'mode': 1, 'left': None, 'right': None},
'right': {'isLeaf': 'yes', 'mode': 0, 'left': None, 'right': None}},
'right': {'isLeaf': 'no',
'attr': 11,
'val': 'day',
'mode': 1,
'left': {'isLeaf': 'yes', 'mode': 1, 'left': None, 'right': None},
'right': {'isLeaf': 'yes', 'mode': 0, 'left': None, 'right': None}}}}
从本质上讲,我具有属性'isLeaf','attr','val'和'mode'以及包含在进一步嵌套级别中的左右子元素。叶子节点不会分裂,因此缺少'attr'和'val'键。与减少错误修剪一样,我的目标是从底部(最深层)连续删除叶子并每次检查错误。如果它等于或好于整棵树,我将移除叶子。我了解如何访问/打印位于叶子上方的终端节点(在每次迭代中都需要将其转换为叶子)。这可能是一个简单的递归,如:
def get_leaf(tree):
node=tree
if node['right']['isLeaf'] =='yes' or node['left']['isLeaf'] =='yes':
print(node)
else:
if node['right']['isLeaf'] != 'yes':
get_leaf(node['right'])
if node['left']['isLeaf'] != 'yes':
get_leaf(node['left'])
但是,我迷失了如何进行修改(并在每次迭代后更改整个树)以通过删除叶子来反映较小的树。此步骤对于拟合验证数据和测试是否有必要修剪是必要的。 任何对此的投入将不胜感激。