本文主要是在阅读过程中对本书的一些概念摘录,包括一些个人的理解,主要是思想理解不涉及到复杂的公式推导。若有不准确的地方,欢迎留言指正交流

本文完整代码见 github : https://github.com/anlongstory/awsome-ML-DL-leaning/lihang-reading_notes (欢迎 Star ? )

5.决策树

决策树(decision tree)是一种基本的分类与回归方法,本文主要讨论分类的决策树。

通常决策树包含:特征选择决策树生成决策树的修剪

特征选择

这里主要是通过递归来选择最优的特征,这里首先要了解 经验熵经验条件熵信息增益 的概念及相关关系。

熵 H(X):表示随机变量不确定性的变量,不确定性越大,熵越大。

设 X 是有限个的离散随机变量,X的熵定义为:

其中 pi 为 Xi 的概率分布。 这里信息熵对数以 2 为底或以 e 为底,熵的单位分别为比特(bit) 或 纳特(nat)。

条件熵 H(Y|X): 表示已知随机变量 X 的条件下随机变量 Y 的不确定性。

定义为 X 给定条件下 Y 的条件概率分布的熵对 X 的数学期望:

其中 pi 为 Xi 的概率分布。

当熵与条件熵中的概率由数据估计(尤其是极大似然估计)得到时,对应的熵和条件熵就是经验熵(empirical entropy) 和经验条件熵(empirical conditional emtropy)。

相关代码:(详见info_gain.py)

# 经验熵
def entropy(datasets):data_length = len(datasets)label_count = {}for i in range(data_length):label = datasets[i][-1]if label not in label_count:label_count[label] = 0label_count[label]+=1ent = -sum([( p/data_length) * log(p/data_length,2) for p in label_count.values()])return ent# 经验条件熵
def condition_entropy(datasets,axis = 0):data_length = len(datasets)feature_sets = {}for i in range(data_length):feature = datasets[i][axis]if feature not in feature_sets:feature_sets[feature] = []feature_sets[feature].append(datasets[i])condi_ent = sum([ (len(p) / data_length)*entropy(p) for p in feature_sets.values()])return condi_ent

信息增益: 经验熵与条件经验熵之差

代码:

# 信息增益
def info_gain(ent,condi_entropy):return ent - condi_entropy

训特征 A 在训练集 D 上的信息增益定义式为:

下面给出例子帮助理解上述的公式。

例5.1

这里将上述表格的信息进行一个归纳总结,总共有 4 个特征,然后每个特征对应最后的类别为 是/否

特征 分布
A1 年龄 { 5青年 : [2是 3否] } { 5中年 : [ 3是 2否 ] } { 5老年 : [ 4是 1否 ] }
A2 工作 { 10没有工作 : [ 4是 6否 ] } { 5有工作 : [ 5是 ] }
A3 有房子 {9没有房子 : [ 3是 6否 ] } { 6有房子 : [ 6是 ] }
A4 信贷 { 6好 : [4是 2否] } { 5一般 : [ 1是 4否 ] } { 4非常好 : [ 4是 ] }
类别 D 9 是 6 否

以其中一个归纳举例,{ 5青年 : [2是 3否] } 表示 A1年龄 这个特征中 有 5 个是青年,5个青年中有 2 个批准申请贷款,3个不批准申请贷款,依次类推。

根据上面的定义式:

经验熵 H(D)

因为其中 类别 D 有 9 个是批准,6个不批准。

条件经验熵 H(D|A1)

最后求得H(D|A1) = 0.888 。
这里得 D1,D2,D3,分别对应 青年,中年,老年,括号里的概率分别对应青年,中年,老年中的 的个数。

依次类推可以计算得到 H(D|A2), H(D|A3), H(D|A4)。

信息增益g(D,A1)

根据定义式可得:
g(D,A1) = H(D) - H(D|A1) = 0.971 - 0.888 = 0.083

同理可得:
g(D,A2) = H(D) - H(D|A2)= 0.971 - 0.647 = 0.324
g(D,A3) = H(D) - H(D|A3)= 0.971 - 0.551 = 0.420
g(D,A4) = H(D) - H(D|A4)= 0.971 - 0.608 = 0.363

代码运行结果:

这里新增一个概念 信息增益比

信息增益比: 信息增益与经验熵之比

特征 A 对训练集 D 的信息增益为 g(D|A),经验熵为 H(D):

决策树的生成

主要介绍两种算法,

  • ID3 算法 (见 DecisionTree.py)

ID3 算法:在各个节点上应用 信息增益 准则来选择特征,递归地构建决策树。

而 ID3 算法只有树的生成,所以产生的树容易过拟合。因此 C4.5 可以看作是对 ID3 算法的改进。

  • C4.5 算法

C4.5 算法: 在各个节点上应用信息增益比 来选择特征,递归地构建决策树,并进行了剪枝。

决策树剪枝

主要是在决策树学习的损失函数中加入了 叶节点个数 的因素。 将 |T|*α 作为惩罚项,自下而上递归地将叶节点回缩以后再计算损失函数的值,如果损失函数的值有减小,就删除当前节点,其中 α 为系数,|T| 为当前决策树 T 的叶节点个数,这里 α 越大,模型(树)越简单,α 越小,模型(树)越复杂。

决策树生成只考虑通过提高信息增益(或信息增益比)对训练集进行拟合,剪枝也是在损失函数中加入了模型复杂度(叶节点的个数)的因素。所以生成时学习的是局部的模型,剪枝学习的是整体的模型。

CART 算法

CART (classification and regression tree,分类与回归树)模型是在给定输入随机变量 X 下输出随机变量 Y 的条件概率分布的学习方法。

分成两步构成:

  • 决策树生成:对回归树用 平方误差 最小化准则,对分类树用 基尼指数 最小化准则,进行特征选择生成决策树。
  • 决策树剪枝: 首先从生成算法生成的树的底端不断剪枝,直到根节点,形成一个子树序列,然后通过交叉验证法在独立的验证数据集上进行测试,从中选择最优子树。

决策树生成

这里主要介绍分类树的生成,及基尼指数。

基尼指数:分类问题中,假设有 K 类,样本点属于第 k 类的概率为 pk ,则概率分布的基尼指数定义为:

对于二分类问题,第一类的概率为 p,则概率分布的基尼指数为:

如果样本集合 D 根绝特征 A 是否取某一个可能值 a 被分割成 D1,和D2 两部分,则在特征 A 的条件下,集合 D 的基尼指数定义为:

以上述例5.1为例,年龄特征 A1青年,中年,老年 会分别划分为:

Gini(D,A1 = 1)  对应 D1 = 青年,D2 = 中年,老年
Gini(D,A1 = 2)  对应 D1 = 中年,D2 = 青年,老年
Gini(D,A1 = 3)  对应 D1 = 老年,D2 = 青年,中年

依次类推。 |Di| 指对应类别的样本总数,|D| 表示集合总样本数。

基尼指数 Gini(D) 表示集合 D 的不确定性,Gini(D,A) 表示经 A=a 分割后集合 D 的不确定性。基尼指数值越大,样本集合的不确定性就越大,与熵相似。

基尼指数的作用

基尼指数主要是用来选择 最优特征最优切分点 的。

仍然以例5.1为例,对特征 A1,A2,A3,A4,分别求对应的:

Gini(D,A1)
 Gini(D,A1 = 1) = 0.44
 Gini(D,A1 = 2) = 0.48
 Gini(D,A1 = 3) = 0.44

Gini(D,A2)
 Gini(D,A2 = 1) = 0.32

Gini(D,A3)
 Gini(D,A3 = 1) = 0.27 # 所有基尼指数中的最小值

Gini(D,A4)
 Gini(D,A4 = 1) = 0.36
 Gini(D,A4 = 2) = 0.47
 Gini(D,A4 = 3) = 0.32

由上面可以看到,Gini(D,A3 = 1)=0.27 最小,所以选择特征 A3 为最优特征,A3 = 1 为最优分割点。 对另一个节点 A1,A2,A4,继续使用这个方法计算最优特征及最优切分点,依次类推,构建决策树。

相关阅读:

《统计学习方法》—— 1. 统计学习方法概论(Python实现)
《统计学习方法》—— 2. 感知器(Python实现)
《统计学习方法》—— 3. K近邻法(Python实现)
《统计学习方法》—— 4. 朴素贝叶斯(Python实现)
《统计学习方法》—— 6. 逻辑斯特回归与最大熵模型(Python实现)
《统计学习方法》—— 7. 支持向量机(Python实现)
《统计学习方法》—— 8. 提升方法 (Python实现)
《统计学习方法》—— 9. EM 算法(Python实现)
《统计学习方法》——10. 隐马尔可夫模型(Python实现)
《统计学习方法》—— 11. 条件随机场

《统计学习方法》—— 5.决策树(Python实现)相关推荐

  1. 资源 | 《统计学习方法》的Python 3.6复现,实测可用

    来源:机器之心 本文多图,建议阅读6分钟. 本文为你分享一个 GitHub 项目,其用 Python 复现了课程内容,并提供代码实现和课件. <统计学习方法>可以说是机器学习的入门宝典,许 ...

  2. python词频统计代码_机器学习必备宝典-《统计学习方法》的python代码实现及课件...

    <统计学习方法>可以说是机器学习的入门宝典,许多机器学习培训班.互联网企业的面试.笔试题目,很多都参考这本书.本站根据网上资料用python复现了课程内容,并提供本书的代码实现.课件下载. ...

  3. 机器学习必备宝典-《统计学习方法》的python代码实现、电子书及课件

    本文转自微信公众号:机器学习初学者 原创: 机器学习初学者 机器学习初学者 6天前 <统计学习方法>可以说是机器学习的入门宝典,许多机器学习培训班.互联网企业的面试.笔试题目,很多都参考这 ...

  4. 《统计学习方法》的Python 3.6复现,实测可用

    选自Github,作者:黄海广. <统计学习方法>可以说是机器学习的入门宝典,许多机器学习培训班.互联网企业的面试.笔试题目,很多都参考这本书.机器之心近期发现了一个 GitHub 项目, ...

  5. 【统计学习方法】决策树

    何为决策树? 决策树定义 决策树是一种用于分类的树结构.如图所示,它由结点(node)和有向边(directed edge)组成,结点包括内部结点(internal node)和叶结点(leaf no ...

  6. 隐马尔可夫模型(《统计学习方法》、python实现)

    转载地址:http://www.hankcs.com/ml/hidden-markov-model.html 本文是<统计学习方法>第10章的笔记,用一段167行的Python代码实现了隐 ...

  7. 统计学习方法之决策树(2)信息增益比,决策树的生成算法

    声明:原创内容,如需转载请注明出处 今天讲解的内容是: 信息增益比,决策树的生成算法-ID3和C4.5 我们昨天已经学习了什么是信息增益,并且通过信息增益来选择最优特征,但是用信息增益会出现偏向于选择 ...

  8. 统计学习方法五 决策树分类

    决策树分类 1,概念 2,决策树算法 2.1,特征选择: 熵:值越大,不确定性因素越大:条件熵:条件对结果的影响不确定性:信息增益:信息增益比 2.2,决策树生成算法 1,ID3算法 2,c4.5算法 ...

  9. 李航《统计学习方法》系列Python实现

    该书系列代码实现:推荐该博主 转链接:https://blog.csdn.net/wds2006sdo/article/details/51923546

最新文章

  1. R语言ggplot2可视化散点图、并以与y=0为界绘制基于散点包围的多边形(ploygon)、对于y=0坐标轴的上方和下方的多边形分别使用不同的颜色进行填充
  2. linux下rsync+inotify实现服务器之间文件实时同步
  3. 嵌入式系统 Boot Loader 技术内幕-目前看到介绍Boot loader最通俗明了的文章
  4. 记录部件中GetFieldControlByFieldName(字段值样式设置)用法
  5. linux 查看服务器作业,linux – 如何在服务器负载较低时运行作业?
  6. LeetCode 400. 第N个数字(数学)
  7. 开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍
  8. easyui-textbox 和 easyui-validatebox 设置值和获取值
  9. JFreeChart自定义拆线图
  10. android 动画效果
  11. word如何设置页码,WPS超实用小技巧
  12. 解决:WPS文字行末是英文单词时自动换行问题
  13. ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定
  14. AlertManager警报通知 E-mail 微信 模板
  15. 基于VHDL利用PS2键盘控制的电子密码锁设计
  16. favicon.ico在线转换网站
  17. 范畴论-一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已
  18. urllib库爬取拍信创意图片(post请求)json传参
  19. 爬虫实战——中国天气网数据
  20. docker 镜像瘦身工具 docker-slim

热门文章

  1. DJYGUI系列文章十一:GDD矩形区域运算
  2. Unity接讯飞在线语音API
  3. JavaScript计时器的用法setTimeout()和setInterval()
  4. <C语言>代码实现与自己创造的“人工智障”进行三子棋对弈,并且艰难的让电脑赢!
  5. 如何编写让别人能读懂的代码?
  6. python3环境下的全角与半角转换代码和测试
  7. python双色球选号_用Python帮你选注双色球号码 赠送清华大学出版社Python从小白到大牛电子书籍一本...
  8. shell 免杀aspx_避开eval关键字,打造免杀一句话木马
  9. html背景图片动画,用CSS3的animation轻松实现背景动画:漂浮的云
  10. Android 实战之酷云(二)