访问/修改嵌套字典中的元素

时间:2020-07-22 18:23:23

标签: python dictionary recursion decision-tree pruning

我正在尝试将减少错误的后修剪应用于通过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'])

但是,我迷失了如何进行修改(并在每次迭代后更改整个树)以通过删除叶子来反映较小的树。此步骤对于拟合验证数据和测试是否有必要修剪是必要的。 任何对此的投入将不胜感激。

0 个答案:

没有答案