决策树ID3和C4.5算法实现

  • 前提基础:

     决策树基本原理,本文参考 李航博士 著《统计学习方法》

     熵的概念

     信息增益

     信息增益比: 可以修正信息增益来划分训练数据集时,存在偏向选择取值较多的特征的问题。可以对此问题进行校正

  • 训练集生成决策树的两个关键问题:
  1. 在构建新节点时候如何选择特征及对应的判定条件?   ID3 C4.5
  2. 如何停止构建新的节点?or 什么样子的节点被认定为叶子节点? 所有label都相同 or 没有特征可分割
  • 决策树算法优点:
  1. 输入数据可以不做归一化,数据清洗阶段可以相对少做许多工作;
  2. 对缺失值不敏感,可以处理不相关特征数据;
  3. 效率高,速度快;
  • 决策树算法缺点:
  1. 连续性特征往往需要离散化;
  2. 处理特征关联性比较强的数据表现得不是很好;
  • 后续
  1. 本文并没有探讨决策树剪枝问题;后续更新
  2. 本文并没有介绍分类与回归树(classification and regress tree,CART)模型;后续更新

 

  • 代码如下:

---------参考了wepo大神---------

数据集采用 《统计学习方法》第五章 表5.1 贷款申请样本数据表

年龄:1->青年    2->中年    3->老年

有工作:  0->否   1->是

有自己的房子:   0->否   1->是

信贷情况:1->一般    2->好    3->非常好

类别:yes->是     no->否

 

代码部分:

import numpy as np

class decisionTree:
    """
    使用方法: clf = decisioTree(), 参数mode可选ID3 or C4.5
    - 训练,调用fit方法: clf.fit(X, y) X,y均为np.ndarray类型
    - 预测,调用predict方法:clf.predict(x) X为np.ndarray
    - 可视化决策树结构,调用show()方法
    """
    def __init__(self, mode = 'ID3'):
        self.tree = None

        if mode == 'ID3' or mode == 'C4.5':
            self.mode = mode
        else:
            raise Exception('mode should be C4.5 or ID3')

    def calcEntropy(self, y):
        """
        :param y: 数据集的标签
        :return: 熵值
        """
        num = y.shape[0]
        # 统计y中不同laebl值的个数,并用字典labelCounts存储
        labelCounts = {}
        for label in y:
            if label not in labelCounts.keys():
                labelCounts[label] = 0
            labelCounts[label] += 1

        # 计算熵值
        entropy = 0.
        for key in labelCounts:
            prob = 1. * labelCounts[key] / num
            entropy = entropy - prob * np.log2(prob)
        return entropy

    def splitDataSet(self, X, y, index, value):
        """
        :param X:
        :param y:
        :param index:
        :param value:
        :return: 返回数据集中特征
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值