📜  门| GATE-CS-2017(套装1)|问题 22(1)

📅  最后修改于: 2023-12-03 15:42:19.079000             🧑  作者: Mango

GATE-CS-2017(套装1)|问题 22

在本问题中,我们需要实现基于决策树的分类器的一些功能。以下是决策树节点结构的类定义:

class TreeNode:
    def __init__(self, attribute):
        self.attribute = attribute
        self.children = {}
        self.answer = ""

其中,attribute 表示这个节点关联的属性;children 是子节点的 set;answer 是与这个节点相连的答案。例如,如果一个根节点关联的属性是色泽(Color),颜色是红(Red)的商品到达了这个节点,从这个节点到叶子节点的路径上应该有一个 answer,例如“是一个好瓜”(Good)或“是一个坏瓜”(Bad)。

现在有一个已经构建好的决策树,你需要实现以下函数:

def predict(node, sample):
    '''
    预测给定样本的标签
    
    参数:
    node: TreeNode,决策树节点
    sample: list, 样本list,如['青绿', '蜷缩', '浊响', '清晰', '凹陷', '软粘']
    
    返回值:
    string,表示预测的标签
    '''
    pass

这个函数应该输出从给定 node 开始经过样本 sample 所得到的最后一级叶子节点的 answer。例如,如果包含('青绿','蜷缩','浊响','清晰','凹陷','硬滑')的样本落在了决策树上一个叶子节点,这个叶子节点的 answer 是“好瓜”,那么 predict 函数应该返回“Good”。

首先我们可以用 markdown 文档格式化上述内容,方便程序员阅读:

GATE-CS-2017(套装1)|问题 22

在本问题中,我们需要实现基于决策树的分类器的一些功能。以下是决策树节点结构的类定义:

    class TreeNode:
        def __init__(self, attribute):
            self.attribute = attribute
            self.children = {}
            self.answer = ""

其中,attribute 表示这个节点关联的属性;children 是子节点的 set;answer 是与这个节点相连的答案。例如,如果一个根节点关联的属性是色泽(Color),颜色是红(Red)的商品到达了这个节点,从这个节点到叶子节点的路径上应该有一个 answer,例如“是一个好瓜”(Good)或“是一个坏瓜”(Bad)。

现在有一个已经构建好的决策树,你需要实现以下函数:

def predict(node, sample):
    '''
    预测给定样本的标签
    
    参数:
    node: TreeNode,决策树节点
    sample: list, 样本list,如['青绿', '蜷缩', '浊响', '清晰', '凹陷', '软粘']
    
    返回值:
    string,表示预测的标签
    '''
    pass

这个函数应该输出从给定 node 开始经过样本 sample 所得到的最后一级叶子节点的 answer。例如,如果包含('青绿','蜷缩','浊响','清晰','凹陷','硬滑')的样本落在了决策树上一个叶子节点,这个叶子节点的 answer 是“好瓜”,那么 predict 函数应该返回“Good”。

接下来,我们可以开始撰写预测函数 predict 的实现:

def predict(node, sample):
    if not node.children:
        return node.answer
    attribute = node.attribute
    if sample[attribute] in node.children:
        return predict(node.children[sample[attribute]], sample)
    return node.answer

当传入的决策树节点的 children 为空时,表示此节点为叶子节点,我们直接返回 answer。否则,我们获取 attribute,判断 sample[attribute] 是否在 children 中。如果在,则我们继续向下遍历,否则我们返回 answer。