数据挖掘--决策树 待更新
简介
决策树, 举两个栗子:
- 网络上各种心理测试的题, 根据你选的答案, 跳到另一题, 最后得出你是什么性格的人.
- 图灵测试, 通过设计各种问题来问跟你聊天的人, 在20 个问题以内, 你来判断跟你聊天的是机器人还是人.
以上, 都是决策树的一种形式, 看图就懂:
- 判断年龄,->判断性别->是谁
从根节点, 一步一步判断(决策过程), 走到叶子节点得到一个确定的分类
- 也可以说是通过一步一步获取更多信息 来不断降低事件的不确定性(信息熵)
信息熵
理解:
物理的熵: 判断空间的混乱程度, 越混乱, 熵值越大
信息熵: 用来衡量事务的不确定性, 事务越不确定, 熵值越大; 随机变量不确定性的度量.
计算公式:
- xi 为最后分类的类别
- p(xi) 为: 第 i 个类别出现的次数 / 总次数
- 其中 - 号实际意义不大, 是为了把结果取正, log 的是在p(xi) = 1 时, 信息熵最小为0
决策树的优劣
- 优点:
- 复杂度不高, 结果易理解
- 过程直观
- 只需要一次训练, 存储在磁盘可之后多次使用
- 缺点:
- 可能产生过度匹配(过拟合)问题
- 使用数据:标称数据或数值数据类型
主要问题
- 如何更快的得到最后的分类结果, 即如何使决策树的层数最少?
- 更进一步阐述问题:
1. 决策树主要需要解决的问题: 每一个节点的选择, 即: 选择什么问题来使你获得更多的信息, 更有效的降低事物的熵.
2. 如何去掉不必要的分支, 使决策树更小, 即剪枝
解决方案
- ID3算法
信息增益 - C4.5算法
信息增益率 - CART算法
基尼系数
(在此, 我主要讨论ID3算法, 并且只讨论如何选择节点, 不管剪枝问题, 待更新…)
ID3算法
简介
- id3算法采用信息增益来选择节点
- 信息增益: 假如当前需分类事务的熵为 0.9, 在得到一个信息后(向下经过一个节点之后), 再次计算此时的熵为 0.4, 那么, 选择该节点的信息增益为 0.9-0.6 = 0.4
- 只能用标称型数据, 若是数值型需要给数据划分
训练过程
输入: 数据特征及其所属类别
输出: 一棵决策树
此处我们选择的归纳偏好为: 当只有一个属性无法划分, 而存在多个标签时, 选择最多的标签作为最终结果
算法: 采用递归的形式构造, 即从根节点开始, 不断进入子树递归构造
代码:def create_tree(dataSet, labels): classList = [exam[-1] for exam in dataSet] # 1. 若所有的类别相同, 到达叶子节点, 停止划分, if classList.count(classList[0]) == len(classList): return classList[0] # 2. 遍