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

2024-03-28 11:09:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对决策树应用减少错误后修剪,该决策树是用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'])

但是,我不知道如何通过删除树叶来进行修改(并在每次迭代后更改整个树),以反映较小的树。这一步对于拟合验证数据和测试是否需要修剪是必要的。 如果您对此有任何意见,我们将不胜感激


Tags: norightnonenode决策树getifmode