【机器学习】手动实现分类决策树 (不用sk-learn)

【机器学习】手动实现分类决策树 (不用sk-learn)

不用sk-learn库,一步一步实现分类决策树,外加可视化哦~

  1. 树结构:二叉树结构+决策节点+叶子节点
  2. 度量:entropy或gini
  3. 构造树
  4. 读入数据:车辆轮廓分类(数据量:846,特征维度:18)
    数据来源:CSDN - 一些用于聚类和分类问题的数据集 分类数据35
  5. 训练
  6. 测试

下面就开始啦

树结构

二叉树结构

from graphviz import Digraph
import uuid
from random import sample


class BinaryTree:
    def __init__(self, rootObj):
        self.key = rootObj
        self.leftChild = None
        self.rightChild = None
        self.dot = Digraph(comment='Binary Tree')

    def insertLeft(self, newNode):
        if self.leftChild is None:
            self.leftChild = newNode
        else:
            t = newNode
            t.leftChild = self.leftChild
            self.leftChild = t

    def insertRight(self, newNode):
        if self.rightChild is None:
            self.rightChild = newNode
        else:
            t = newNode
            t.rightChild = self.rightChild
            self.rightChild = t

    # 可视化,输出到Binary_Tree.gv
    def print_tree(self, save_path='./Binary_Tree.gv', label=True):

        # colors for labels of nodes
        colors = ['skyblue', 'tomato', 'orange', 'purple', 'green', 'yellow', 'pink', 'red']

        # Draws a binary tree with a node as its root
        def print_node(node, node_tag):
            # The node color
            color = sample(colors, 1)[0]
            if node.leftChild is not None:
                if type(node.leftChild.key).__name__ == 'DecisionNode':  # DecisionNode
                    left_tag = str(uuid.uuid1())  # Data for the left node
                    self.dot.node(left_tag,
                                  str(node.leftChild.key.feature_name + " <= " + str(
                                      node.leftChild.key.feature_value) + " ? "),
                                  style='filled', color=color)  # left
                    label_string = 'Y' if label else ''  # Whether to label the connector indicates a left subtree
                    self.dot.edge(node_tag, left_tag, label=label_string)  # The line between the left child and parent
                    print_node(node.leftChild, left_tag)
                else:  # leaf
                    left_tag = str(uuid.uuid1())
                    self.dot.node(left_tag, str(
                        "samples = " + str(node.leftChild.key.num) + "\n value = " + str(node.leftChild.key.value)),
                                  style='filled', color=color)
                    label_string = 'Y' if label else ''
                    self.dot.edge(node_tag, left_tag, label=label_string)
                    print_node(node.leftChild, left_tag)

            if node.rightChild is not None:
                if type(node.rightChild.key).__name__ == 'DecisionNode'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值