- 前提基础:
决策树基本原理,本文参考 李航博士 著《统计学习方法》
熵的概念
信息增益
信息增益比: 可以修正信息增益来划分训练数据集时,存在偏向选择取值较多的特征的问题。可以对此问题进行校正
- 训练集生成决策树的两个关键问题:
- 在构建新节点时候如何选择特征及对应的判定条件? ID3 C4.5
- 如何停止构建新的节点?or 什么样子的节点被认定为叶子节点? 所有label都相同 or 没有特征可分割
- 决策树算法优点:
- 输入数据可以不做归一化,数据清洗阶段可以相对少做许多工作;
- 对缺失值不敏感,可以处理不相关特征数据;
- 效率高,速度快;
- 决策树算法缺点:
- 连续性特征往往需要离散化;
- 处理特征关联性比较强的数据表现得不是很好;
- 后续
- 本文并没有探讨决策树剪枝问题;后续更新
- 本文并没有介绍分类与回归树(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: 返回数据集中特征