分类模型:决策树
目录
一、决策树的引入:................................................................................................................ 3
二、首先从一个实例讲起:.................................................................................................... 4
三、 什么是决策树/判定树(decision tree)?..........................................................................9
3.1 熵(entropy)概念:........................................................................................................ 11
3.2 决策树归纳算法 (ID3)...............................................................................................13
3.3 信息熵和信息增益的计算示例(ID3 关键步骤).........................................................14
3.4 决策树的其他优化算法:.......................................................................................... 16
3.5 树剪枝叶 (避免 overfitting 过拟合)........................................................................17
3.5.1 先剪枝.....................................................................................................................18
3.5.2 后剪枝.....................................................................................................................19
3.6 决策树算法的特点............................................................................................................21
四、电商实例ID3 算法详解..................................................................................................22
1.ID3 算法步骤演示................................................................................................................ 22
2.按照 ID3 得到的决策树.......................................................................................................24
五、Spark 模拟实现决策树....................................................................错误!未定义书签。
1.Python 代码实例:...............................................................................错误!未定义书签。
2.Scala 代码实例:..................................................................................错误!未定义书签。
六、Scikit-Learn 代码示例:................................................................................................. 25
1.Scikit-Learn库实现上述例子.............................................................................................. 32
(1)scikit-learn 实现待测数据的分类.........................................错误!未定义书签。
(2)对上述示例的决策树过程进行分析....................................................................35
2.Iris 数据集的例子.................................................................................................................37
七、Python 原生实现代码:..................................................................................................44
ID3 算法的 Python 实现..........................................................................................................44
1.ID3 算法实现................................................................................................................ 44
2.构建数据集....................................................................................................................48
3.训练的决策树的结构信息打印及字典转化为树状的显示.......................................49
4.持久化决策树................................................................................................................49
5.测试 ID3 算法............................................................................................................... 50
补充:C4.5 算法 Python 实现................................................................错误!未定义书签。
1.C4.5 算法实现...............................................................................错误!未定义书签。
2.构建数据集................................................................................... 错误!未定义书签。
3.训练决策树................................................................................... 错误!未定义书签。
4.测试 C4.5 算法..............................................................................错误!未定义书签。
补充:基尼指数...................................................................................................................... 50
1.决策树的引入:
有的同学可能在大学学习过一门课程叫《数据结构》,里面有一个重要的结构就是“树”,
和现实生活中的树一样,树的主要由四部分树根、树干、树枝、树叶组成,今天的决策树也
是一种树结构,大家学习的时候可以想象现实生活中的树来来理解。
(强调)决策树算法是一种监督学习算法,英文是 Decision tree。
决策树思想的来源非常朴素,试想每个人的大脑都有类似于 if-else 这样的逻
辑判断,这其中的if 表示的是条件,if 之后的 then 就是一种选择或决策。程序
设计中的条件分支结构就是if-then 结构,最早的决策树就是利用这类结构分割
数据的一种分类学习方法。
比如:你 母亲要给你介绍男朋友,是这么来对话的:
女儿:多大年纪了?
母亲:26。
女儿:长的帅不帅?
母亲:挺帅的。
女儿:收入高不?
母亲:不算很高,中等情况。
女儿:是公务员不?
母亲:是,在税务局上班呢。
女儿:那好,我去见见。
于是你在脑袋里面就有了下面这张图:
作为女孩的你在决策过程就是典型的分类树决策。相当于通过年龄、长相、
收入和是否公务员对将男人分为两个类别:见和不见。
有了上面这个认识,我们就通过之前比较熟悉电商例子开始了解决策树算
法。
2.首先从一个实例讲起:
在商业的数据挖掘中,不同的消费行为顾客特征的提炼和表述极为重要。
我们模拟前期大家做过的电商平台项目中,模拟顾客及其消费行为数据共
1024条,包括用户是否购买某种产品(0购买,1不购买),年龄(青年0,中
年1,老年2),收入(高0,中1,低2),学生(是1,否0),信誉(良0,
优1)。
我们模拟收集了如表1-1 的部分用户购买数据,建立了一张统一的调查表,
统计几个月的销售数据。我们这里模拟通过从电商平台中对下表中潜在的客户进
行分析,并根据得到的一些特征用于销售人员制定销售策略等工作。
总结为两个问题:
(1) 如何对客户进行分类?
(2) 如何根据分类的依据,给出销售人员的指导意见?
补充和解释:
分析一个机器学习问题:
1.首先搞清楚数据集的内容
2.数据集:行--样本(15)、列---特征个数(4)
3.特征:(4)
年龄---青年、中年、老年
收入----高、中、低
学生----是 or 否
信誉----优 良
4.类标签:(1)
最后一列:买 or 不买 (二分类问题)
5.训练集(训练模型) + 测试集(测试模型的优劣)
问题:
1.如何对客户进行分类?
答:根据数据集中收集的用户的特征信息
2.如何根据分类依据,给出销售指导意见呢?
答:给出这样的销售意见:
中年人通常会无条件购买
青年人中如果是学生一般会购买
老年人中信誉好的常常会购买
表1-1 用户购买统计表
统计用户计数 年龄 收入 学生 信誉 是否购买
64 青 高 否 良 不买
64 青 高 否 优 不买
128 中 高 否 良 买
60 老 中 否 良 买
64 老 低 是 良 买
64 老 低 是 优 不买
64 中 低 是 优 买
128 青 中 否 良 不买
64 青 低 是 良 买
132 老 中 是 良 买
64 青 中 是 优 买
32 中 中 否 优 买
32 中 高 是 良 买
64 老 中 否 优 不买
(1)对表格数据的分析
从第一列中可以看到这张表格,共15行,每行表示列特征不同取值的统计
人数。 第二列是年龄特征,取值有三个:老、中、青。 第三列是收入:取值是高、
中、低。 第四列是学生,取值有是获否。 第五列为信誉,取值有两个,为优和良。
最后一列为 销售的结果,也就是分类标签,取值为买或不买。
(2)问题分析:
那么对于任意给定特征值的一个客户(也就是测试样例),算法需要帮助公
司将这位客户归类,即预测这位客户是属于“购买”商品的一类还是“不购买”商品
的一类并且给出判断依据。
(3)首先,我们根据示例 手工实现一颗决策树。
分析规则: ( 制定规则 )
a.既然是一棵树,肯定是由根节点、叶子结点和内部节点组成。
b.(根节点选取)如果从一颗空决策树开始,任意选择第一个特征就是根节点。
c.(叶子结点的判断)如果我们按照条件进行划分,若划分的到一个子集为空或子
集中所有样本已经归为同一类的别标签,则该子集就是叶子结点,否则这些子集
就对应于决策树中的内部节点。
d.(内部节点需要继续划分)如果是内部节点,就需要选择一个新的类别标签继续
对该子集进行划分,直到所有子集为叶子节点。
: 根据规则进行划分: 根据上述树的规则我们对示例数据集进行划分。
a. 我们选年龄为根节点,该特征值取值为:老、中、青。根据年龄特征将所有
样本进行划分,并作为决策树的第一层。
(1)年龄= 青,是否购买:不买、买
(2)年龄= 中,是否购买:买
(3)年龄=老,是否购买:不买、买
也就是当年龄为中年,是否购买都一致地变为买,此时的中年就成为决策树的叶
子节点。而当年龄为青年和老年时候,是否购买有两个选择,可以继续分解。
如下表1-2:按照年龄分开数据集:
统计用户计数 年龄 收入 学生 信誉 是否购买
64 青 高 否 良 不买
64 青 高 否 优 不买
128 青 中 否 良 不买
64 青 低 是 良 买
64 青 中 是 优 买
128 中 高 否 良 买
64 中 低 是 优 买
32 中 中 否 优 买
32 中 高 是 良 买
60 老 中 否 良 买
64 老 低 是 良 买
64 老 低 是 优 不买
132 老 中 是 良 买
64 老 中 否 优 不买
b. 接着,年龄为“青年”、“老年”需要接着划分。对数据集中“青年”选项的行数
据继续选择第二个特征,如:收入,根据收入得到如下表 1-3
统计用户计数 年龄 收入 学生 信誉 是否购买
64 青 高 否 良 不买
64 青 高 否 优 不买
128 青 中 否 良 不买
64 青 中 是 优 买
64 青 低 是 良 买
c. 根据上表分析,高收入和低收入的特征值只有一个类别标签---买,将其作为
叶子节点,然后继续划分中等以下收入的下一个特征---学生,如下表 1-4:根
据是学生将不会购买此商品,不是学生将会购买此商品。到此,年龄为“青年”
的全部归类。
统计用户计数 年龄 收入 学生 信誉 是否购买
128 青 中 否 良 不买
64 青 中 是 优 买
d. 青年划分完之后继续标签为老年的划分,如我们选择划分的顺序为信誉---收
入---学生----计数,如此,当选择信誉作为下一级划分数据集的特征时,一次
性就将信誉为优的类别标签划分为不买,信誉为良的类别标签划分为买。
统计用户计数 年龄 收入 学生 信誉 是否购买
60 老 中 否 良 买
64 老 低 是 良 买
64 老 中 是 良 买
132 老 低 是 优 不买
64 老 中 否 优 不买
根据以上几部,我们可以得到一颗完整的决策树,我们为了判断方便将所有
购买商品的叶子节点放在树的右侧,不购买商品的叶子结点放在树的左侧。
a.从定性的角度画出决策树:
b.从定量的角度画出决策树:(根据表格进行量化)
为什么需要从定量角度来分析呢?
答:这样会更精确的分析用户的特征信息,给出销售人员更准确的数据信息。
3.构建决策树的三个步骤
构建决策树包括三个步骤:
 特征选择:选取有较强分类能力的特征。
 决策树生成:典型的算法有 ID3 和 C4.5,它们生成决策树过程相似,ID3 是采用信
息增益作为特征选择度量,而 C4.5 采用信息增益比率。
 决策树剪枝:剪枝原因是决策树生成算法生成的树对训练数据的预测很准确,但是
对于未知数据分类很差,这就产生了过拟合的现象。
注意:决策树的构建直到没有特征可选或者信息增益很小时停止,这就导致了构建的决
策树模型过于复杂,而复杂的模型是在训练数据上建立的,所以对于测试集往往造成分类不
准确,这就是过拟合。
发生过拟合是由于决策树太复杂,解决办法是控制模型的复杂度,对于决策树来说就是
简化模型,称为“剪枝”。
决策树剪枝的过程就是从已生成的决策树上裁掉一些子树或者叶节点。剪枝的目标是通
过极小化决策树的整体损失函数来实现的。
下面我们从决策树目标入手,讲一下如何构建决策树模型。
决 策 树 的 目 标 : 给 定 训 练 集 } ) , ).....( , ( ), , ( {
2 2 1 1 N N
y x y x y x D  , 其 中
 
) n ( ) 2 ( ) 1 (
... ,
i i i i
x x x x  为输入实例,n 为样本个数( 个特征 个样本的第 表示第 n k
) (n
k
x ),
} ..... 2 , 1 { K y i  为类标记,i=1,2.....N;N 为样本容量。构建决策树的目标是,根据给定的训
练数据集学习一个决策树模型。
构建决策树通常是递归地选择最优特征,并根据该特征对训练数据进行分割,步骤如下:
(1)构建根节点,所有的样本都位于根节点。
(2)选择一个最优的特征。通过该特征将训练数据集分割成子集,确保各个子集有最好的
分类,但要考虑以下两种情况:
 若子集能够被“较好地”分类,则构建叶节点,并将子集划分到对应的叶节点中去。
 若某个子集不能被“较好地”分类,则对该子集继续划分。
(3)递归直到所有训练样本都被很好的分类,或没有合适的特征为止。对于是否较好的分
类,我们借助“信息增益”、“信息增益率”、“基尼系数”、“分类错误率”等指标衡量。
通过上述步骤生成的决策树对训练样本有很好的分类能力,但是我们需要的是对未知
样本的分类能力。因此通常需要对已生成的决策树进行剪枝,从而使得决策树有很好的泛
化能力。剪枝的过程就是去掉过于细分的叶节点,从而提高泛化能力。
4.决策树的基本概念和算法
4.0 什么是决策树/ 判定树(decision tree)?
1.决策树是一个类似于流程图的树结构:其中,每个内部结点表示一个特征
或属性,而每个树叶结点代表一个分类。树的最顶层是根结点。使用决策树分类
时就是将实例分配到叶节点的类中。该叶节点所属的类就是该节点的分类。(通
过下图理解)
2.决策树是机器学习中分类方法中的一个重要算法
3.构造决策树的基本算法
(1)ID3 算法:使用信息增益进行特征选择
(2)C4.5 算法:使用信息增益率进行特征选择,克服了信息增益选择特
征的时候偏向于特征个数较多的不足。
(3)CART 算法:CART 全称为分类回归树,既可以用于分类,也可以用
于预测。利用CART 构建回归树用到树的 剪枝技术,用于防止树的过拟合。
通过以下表格,我们通过观察并得到了一颗决策树,那么我们如何根据ID3
算法得到我们优化过的决策树呢?这就需要 首先引入熵的概念。
表 1 用户购买统计表
统计用户计数 年龄 收入 学生 信誉 是否购买
64 青 高 否 良 不买
64 青 高 否 优 不买
128 中 高 否 良 买
60 老 中 否 良 买
64 老 低 是 良 买
64 老 低 是 优 不买
64 中 低 是 优 买
128 青 中 否 良 不买
64 青 低 是 良 买
132 老 中 是 良 买
64 青 中 是 优 买
32 中 中 否 优 买
32 中 高 是 良 买
64 老 中 否 优 不买
4.1 熵(entropy )概念:
(1) 信息如何度量?
1948年,香农提出了“信息熵(entropy)”的概念
一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常
不确定的事情,或者是我们一无所知的事情,需要了解大量信息==>(也就是说)
信息量的度量就等于不确定性的多少
(使用)比特(bit)来衡量信息的多少
例子:对一个有 32 支球队的世界杯争夺冠军,熵为?
H =− {p1 ∙ logp1+ p2 ∙ log p2 + ?p32 ∙ log p32 }
其中p1,p2……p32分别是32支球队争冠的概率。如果当 32 支球队夺冠概率
相同时,对应的熵是最大的,等于5bit。(分析如何得出 5 这个数值的。)
注意:实质上每个队夺冠的几率不是相等的。当概率不相等的时候算出的熵
都比5小。
( (2 )为什么要有“ 熵” 的概念?为什么是这样一个公式?
既然决策树有根节点、内部节点和叶子节点之分,那么究竟那个属性做根节
点,那个属性又做下一级分类的分支节点(内部节点)?
香农在他的<<信息论>>中借用德国物理学家发明的“熵”的概念提出了“信息
熵”的概念。在物理学中“熵”通常是指物体能量的分布更加均匀,而香农首先定
义了“信息”的概念:信息就是对不确定性的消除。因此,“信息熵”就表示事物不
确定性的度量标准,可以根据数学中的概率计算,出现的概率就大,出现的机会
就多,不确定性就小(信息熵小)。
通常多个独立事件所产生的不确定性等于各自不确定性之和,也就是每个事
件的发生与不发生是相互独立的,这在数学上称为可加性,而满足这样可加性的
函数就是我们在高中阶段所学习过的对数函数(log 函数)。由此得到第一个不确
定性函数I X 公式:
I X= log
1
?
=− log p ? 公式 1㱠
如果对一个随机事件有n种取值:X1,X2,X3…,对应的概率 p1,p2…..pn,则该
事件的不确定性应该是单个取值的不确定性的期望E,也叫作信息熵,即:
H X =−
?=1
?
? ? ?th? ? ? 公式 2㱠 ?
上述若对数的底数取值为2,就是我们平常所说的信息单位bit(比特)。
# 总结#变量的不确定性越大,熵也就越大。熵越小,信息的纯度越高。
有了以上基础之后,我们就可以学习 ID3 算法,从而构建我们的决策树,从
而达到分类目的。
4.2 法 决策树归纳算法 (ID3 )
 1970-1980, J.Ross. Quinlan, ID3 算法
 目的:选择属性判断结点
 引入“信息增益”:信息获取量(Information Gain):
Gain(A) = Info(D)-Info_A(D)
注:整个数据集信息熵与当前节点(划分节点)信息熵的差
 通过某一个节点来作为分支节点来分类获取了多少信息
( (1 )信息增益概念的含义和本质?
含义 :划分数据集前后信息发生的变化。
本质上是衡量给定属性能否更完美、没有误差地区分开训练数据集的能力。
我们使用信息增益来确定决策树分支的划分依据,它也是决策树分支上整个
数据集信息熵与当前节点(划分节点)信息熵的差值,通常用Gain(A)表示:
Gain A = I parent − E A ? 公式 3㱠
也就是当前节点信息熵E(A)越小,不确定性也越小,整体数据集的信息熵
(I(parent))一般是保持不变的,从而当前节点的信息增益就越大,因此通常选
择信息熵小的,信息增益大的值作为根节点。
( (2 )ID3 算法简介:
ID3 算法起源于 CLS 概念学习系统,以信息熵的下降速度为选取测试属性的
标准,即在每个节点选取尚未被用来划分的具有最高信息增益的属性作为划分标
准,继续这个过程,直到生成决策树能完美分类训练样例。
输入:样本的集合 S,属性集合 A
输出:ID3 决策树
A. 如果所有种类的属性都处理完毕,则返回。否则,执行步骤B.
B. 计算出 信息增益最大的属性 a,将该属性作为一个节点。如果仅凭借 a
就可以对样本分类,则返回。否则执行步骤C。
C. 对属性a 的每个可能取值 v 执行以下操作:
1.将v的样本作为s 的一个子集 Sv
2.生成剩余属性集合AT=A-{a}
3.以样本集合Sv 和属性集合 AT 为输入,递归执行 ID3 算法。
了解了信息熵和熵的计算之后,我们通过简单例子计算这两个重要的变量 。
4.3 信息熵和信息增益的计算示例(ID3 关键步骤)
有了以上理论基础我们可以接下来通过一个小例子完整计算信息熵和信息
增益,从而通过ID3 算法构造决策树。
注:整个数据集信息熵与当前节点(划分节点)信息熵的差,就是信息增益
类似,Gain(income) = 0.029, Gain(student) = 0.151, Gain(credit_rating)=0.048
所以,选择age 作为第一个根节点
重复上述过程。
算法步骤:( 和前面的算法步骤理解其一即可)
 树以代表训练样本的单个结点开始(步骤1)。
 如果样本都在同一个类,则该结点成为树叶,并用该类标号(步骤 2 和 3)。
 否则,算法使用称为 信息增益的基于熵的度量作为启发信息,选择能够最
好地将样本分类的属性(步骤 6)。该属性成为该结点的“测试”或“判定”属性(步
骤7)。在算法的该版本中,
 所有的属性都是分类的,即离散值。连续属性必须离散化。
 对测试属性的每个已知的值,创建一个分枝,并据此划分样本(步骤 8-10)。
 算法使用同样的过程,递归地形成每个划分上的样本判定树。一旦一个属
性出现在一个结点上,就不必在该结点的任何后代上考虑它(步骤13)。
 递归划分步骤仅当下列条件之一成立停止:
(a) 给定结点的所有样本属于同一类(步骤 2 和 3)。
(b) 没有剩余属性可以用来进一步划分样本(步骤 4)。在此情况下,使用
多数表决(步骤5)。
这涉及将给定的结点转换成树叶,并用样本中的多数所在的类标记它。
替换了可以存放结点样本的类分布。
(c) 分枝:test_attribute = a ,没有样本(步骤 11)。在这种情况下,
以samples 中的多数类创建一个树叶(步骤 12)
定义一个最大不纯度 ,于 如果最大不纯度下降小于 a 时 时 , 就将该节点看做是叶
子节点。( 或可理解为纯度达到阈值 a)
过 通过这个小例子大家了解了通过 ID3 算法构建树的过程,我们在后面还会
了 利用熵和信息熵计算我们电商的例子,接下来我们了解下除了 ID3 算法,还有
哪几种算法可以来构建决策树。
4.4 决策树的其他优化算法:
( (1 )C4.5: 1993 年 年 Quinlan
C4.5 算法
C4.5 和 ID3(1986 年 Quinlan 提出的)算法类似,只有在以下几个点作了改
进。
1.用 信息增益率来选择属性,克服用信息增益选择时候偏向选择取值多的属性
的不足。(了解)
征 特征A 对数据集 D 的信息增益:Gain(A) = Info(D)-Info_A(D)
信息增益率:Gain r (A) =Gain(A) /H(A) :其中 H(A)为A 的熵
理解:
由于在分类问题困难时候,也就是在训练数据集 经验熵( 总体的 Info(D) 值)
大的时候,信息增益值会偏大(Info(D)值偏大),如果训练数据集 经验熵小的时候,
信息增益会偏小,这时候也可以通过信息增益率来矫正这一问题。
经验熵( 就是前面提到的信息熵,也就是信息量的大小问题)
2.在树构造过程中进行剪支。
3.能够完成连续属性的离散化处理。
4.能够对不完整数据进行处理。
( (2 )CART
Classificationand Regression Trees (CART): (L. Breiman, J. Friedman, R.
Olshen, C.Stone)
共同点:都是贪心算法,自上而下(Top-down approach)
区别:属性选择度量方法不同
C4.5 (gain ratio),CART(gini index),ID3 (Information Gain)
贪心算法 :顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说
贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选
择。
无论哪种方法构建树,因为树的构建过程是递归形式的,所以有可能出现
树的过拟合情况,因此,我们对树过拟合情况有一种“ 树剪枝” 技术,避免树由
于过度生长而出现的过拟合现象。接下来我们讲解树的两种剪枝技术。
4.5 树剪枝叶( 避免 overfitting 过拟合)
问题1:什么是剪枝?
剪枝是指将一颗子树的子节点全部删掉,利用叶子节点替换子树(实质上是后剪枝技
术),也可以(假定当前对以 root为根的子树进行剪枝)只保留根节点本身而删除所有的叶
子,以下图为例:
问题2:为什么要进行树的剪枝?
决策树是充分考虑了所有的数据点而生成的复杂树,有可能出现过拟合的情
况,决策树越复杂,过拟合的程度会越高。
考虑极端的情况:如果我们令所有的叶子节点都只含有一个数据点,那么我
们能够保证所有的训练数据都能准确分类,但是很有可能得到高的预测误差,原
因是将训练数据中所有的噪声数据都”准确划分”了,强化了噪声数据的作用。
而剪枝修剪分裂前后分类误差相差不大的子树,能够降低决策树的复杂度,
降低过拟合出现的概率。
注意:(解释)
因为决策树的构建过程是一个递归的过层,所以必须确定停止条件,否则过
程将不会停止,树会不停生长。通过我们前面的例子我们可以当一个节点下面的
所有记录都属于同一类,或者当所有记录属性都具有相同的值时停止,但是这样
往往会使得树的节点过多,导致过度拟合的问题。
过度拟合是指直接生成的完全决策树对训练样本的特征描述的“过于精确”,
无法实现对新样本进行合理的分许,所以这种情况我们构建的树不是一颗最佳的
决策树。
所以,为了避免过拟合,我们引入剪枝技术。
除了剪枝技术我们还有一种解决方法:当前结点中的记录数低于一个最小阈
值就停止分裂,采用多数表决的方法决定叶节点的分类。
题 问题3 :怎样剪枝?
两种方案:先剪枝和后剪枝
先剪枝说白了就是提前结束决策树的增长,跟上述决策树停止生长的方法一样。
后剪枝是指在决策树生长完成之后再进行剪枝的过程。
接下来我们深入理解下这两种剪枝技术。
3.5.1 先剪枝(预剪枝)
先剪枝是对决策树停止标准的修改。
在 ID3 算法中,节点的分割一直到节点中的实例属于同一类别的时候才停
止。对于包含较少实例的节点,很有可能被分割为单一实例的节点。为了避免这
种情况,我们给出一个阈值,当一个节点分割导致的最大的不纯度下降小于 a 时,
就把该节点看作是叶子结点。该方法选择的阈值对决策树的构建有很大的影响。
(1)当阈值 a 选择的过大的时候,节点的不纯度依然很高就停止了分裂。
此时的树由于生长不足,导致决策树过小,分类的错误率过高。因此需要调整 a
参数的合理范围之内的值。
(2)当阈值 a 选择的过小的时候,比如 a 接近 0,节点的分割过程近似于
原始的分割过程。
由此可见,预剪枝方法虽然简单,但在实际应用中对 a 的选择存在很大的主
观性。精确的给出a 的值也是相当困难。
3.5.2 后剪枝
后剪枝是从一个充分生长的树中,按照自低向上的方式修剪掉多余的分支,
有两种方法:
(1)用新的叶子结点替换子树,该叶子结点的类标号由子树记录中的多数
类决定。
(2)用子树中最常用的分支替代子树。
通常计算前后预期分类错误率,如果修剪导致预期分类错误率变大,则放弃
修剪,保留相应的各个分支,否则就将相应的节点分支修剪删除。
通常采用后剪枝技术是最小的错误剪枝(MEP)技术,即在产生一系列的经过
修剪后的决策树候选之后,利用一个独立的测试数据集,对这些经过修剪之后的
决策树的分类准确性进行评价,保留下预期分类错误率最小的(修剪后)决策树。
除了最小错误剪枝技术外,还有悲观错误剪枝(MEP)和代价复杂度剪枝
(CCP)
3.5.3 剪枝技术对比
预剪枝使得决策树的很多分支没有展开,这不仅仅降低了过拟合的风险,还显著减少了
决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化
性能,甚至会导致泛化性能降低,但在其基础上进行的后续划分却有可能导致性能的显著提
高。同时,预见值决策树也带来了欠拟合的风险。
后剪枝的决策树通常比预剪枝的决策树保留了更多的分支。一般情况下,后剪枝决策树
的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之
后进行的,并且要自底向上地对树中所有非叶子节点进行逐一考察,因此在训练时间开销比
未剪枝的决策树和预剪枝的决策树都要大得多。
接下来对决策树算法的特点进行总结:
3.5.4 剪枝算法的数学原理(了解)
剪枝总体思路:
由完全树 T0 开始,剪枝部分节点得到 T1,再次剪枝部分节点得到 T2...直到仅剩树根的
树 Tk;在验证数据集上对这 K 个树分别评价,选择损失函数最小的树的树 Ta。
1 3.5.4.1 剪枝系数
根据原损失函数:


 
leaf
t
t H N T C
t
) ( ) (
是叶子节点的熵
是叶子节点的个数
) (t H
N t
叶节点越多,决策树越复杂,损失越大,修正:
| T | ) ( ) (
leaf
  

T C T C
当 0   时,未剪枝的决策树损失最小(全树);
当    时,单根结点的决策树损失最小(单根)
参考回归问题损失函数定义理解:
| w | ) ( f - y
1
) , w (
N
1
i
  



i
i
x
N
d L ) (
现在考虑以 r 为根的子树剪枝,且剪枝后只保留 r 本身而删掉所有的叶子:
剪枝后的损失函数:   

) ( ) r ( r C C
剪枝前的损失函数: | R | ) ( ) (
leaf
  

R C R C
剪枝前后要求损失函数下降或至少相等,这里取剪枝前后相等得到剪枝系数 a:
1
) ( ) (
  

 

leaf
R
R C r C
2 3.5.4.2 剪枝算法
对于给定的决策树 T 0
 计算所有内部节点的剪枝系数 a
 (a 越大,表示单根,就会越安全,a 越小表示未剪枝)
 查找最小剪枝系数 a 的结点,剪枝得决策树 T k
 重复以上步骤,直到决策树 T K 只有 1 个结点
 得到决策树序列 T 0、 T 1、 T 2、 T 3.............. T k
 使用验证样本集选择最优子树,可以使用损失函数作为评价最优子树的标准


 
leaf
t
t H N T C
t
) ( ) (
4.6 决策树算法的特点
(1) 决策树的优点:
 直观,便于理解,小规模数据集有效
 执行效率高,执行只需要一次构建,可反复使用
(2)决策树的缺点:
 处理连续变量不好,较难预测连续字段
 类别较多时,错误增加的比较快
 对于时间序列数据需要做很多的预处理
 可规模性一般
 实际分类的时候只能根据一个字段进行
4.7 决策树算法 处理连续值
连续值的处理:由于连续属性的可取值数目不在有限,因此,不能直接根据连续属性的
取值对结点进行划分。此时,我们采用连续值离散化的技术,最简单的是采用二分法(将样
本的属性取值从大到小排序,找一个划分点将样本集分成两个子集,大于划分点的集合是决
策树的一个分支,小于划分点的是决策树的一个分支)对连续属性进行处理,这也是 C4.5
算法采用的策略。
5.电商实例 ID3 算法详解
表 1-2:按照年龄分开数据集:
统计用户计数 年龄 收入 学生 信誉 是否购买
64 青 高 否 良 不买
64 青 高 否 优 不买
128 青 中 否 良 不买
64 青 低 是 良 买
64 青 中 是 优 买
128 中 高 否 良 买
64 中 低 是 优 买
32 中 中 否 优 买
32 中 高 是 良 买
60 老 中 否 良 买
64 老 低 是 良 买
64 老 低 是 优 不买
132 老 中 是 良 买
64 老 中 否 优 不买
5.1.ID3 算法步骤演示
有了上面的基础之后,通过最上面的例子实现ID3 算法的生成过程。
(1)计算对给定样本分类所需的信息熵
类别标签S 被分为两类:买 or 不买。其中:
S1(买)=640;S2(不买)=384;S=S1+S2=1024;
S1 的概率 p1=640/1024=0.625; S2 的概率 p2=384/1024=0.375
I(S1,S2)=I(640,384)=-p1log(p1)-p2log(p2)=0.9544
(2)计算每个特征的信息熵及信息增益
1.计算“年龄”特征的信息熵
年龄分为三组:青年(0)、中年(1)、老年(2)
1.1 青年占总样本的概率
P(0)=384/1024=0.375
S1(买)=128 p1=128/384
S2(不买)=256 p2=256/384
I1(S1,S2)=I(128,256)=-p1log(p1)-p2log(p2)=0.9183
1.2 中年占总样本的概率
P(1)=256/1024=0.25
S1(买)=256 p1=256/256=1
S2(不买)=0 p2=0/384=0
I2(S1,S2)=I(256,0)=-p1log(p1)-p2log(p2)=0
1.3 老年占总样本的概率
P(2)=384/1024=0.375
S1(买)=257 p1=257/384
S2(不买)=127 p2=127/384
I3(S1,S2)=I(257,127)=-p1log(p1)-p2log(p2)=0.9157
则年龄的信息熵为:
E(年龄)= P(0)* I1(S1,S2)+ P(1)* I2(S1,S2)+ P(2)* I3(S1,S2)
=0.375*0.9183+0.25*0+0375*0.9157 =0.6877
则年龄的信息增益为:
G(年龄)=0.9544-0.6877=0.2667
2.计算“学生”特征的信息熵
E(学生)=0.7811
G(学生)=0.9544-0.7811=0.1733
3.计算“收入”“特征的熵
E(收入)=0.9361
G(收入)=0.9544-0.9361=0.0183
4.计算“信誉”“特征的熵
E(信誉)=0.9048
G(信誉)=0.9544-0.9048=0.0496
(3)从所有列的特征中选出信息增益最大的那个作为根节点或内部节点
根据上述信息增益的大小,选定年龄列G=0.2667 来划分数据集。
(4)根据节点的不同取值将数据集拆分为若干子集,删除当前的特征列,在计
算剩余列的特征信息熵。如果有信息增益,就重复第二步直至划分结束。
 首次划分后,青年和老年内含有多个标签,所以可以继续划分,中年选
项就剩下一个标签就称作为叶子结点。
(5)划分结束标志为:子集中只有一个类别标签,停止划分。
根据信息增益,选择出根节点,依次划分得到一颗决策树,大家可以对比下
这颗决策树和之前的决策树的差别在哪里?
之前的决策树如下:
5.2. 按照 ID3 得到的决策树
按照上述结果产生一个决策树如下图:
( 解释 )这张图明显是比我们根据规则手画的决策树优化了,根据年龄判断
了直接就看是否为学生就可以达到分类目的。无需根据年龄收入学生-是
否购买来判断。
(总结)根据信息熵和信息增益得到的决策树和之前利用自己制定规则得到的决策树,
有明显的不同,因此,利用信息熵和信息增益可以得到分类效果更优的决策树。
6.决策树解决泰坦尼克号问题
简记:泰坦尼克号:1500 多人,如今通过计算机模拟和分析找出潜在数据背后的生还
逻辑。
大家都看过电影泰坦尼克号,是历史上一件家喻户晓的灾难性事件;泰坦尼克号沉船事
故,1912 年,当时属于英国的世界级豪华客轮泰坦尼克号,因在处女航行中不幸撞上北大
西洋冰山而沉没。这场事故使得 1500 多名乘客患难。后来,这场震惊世界的惨剧被详细地
调查,而且遇难乘客的信息也逐渐被披露。在当时救援条件下,无法短时间内确认每位乘客
生还的可能性。而今,许多科学家视图通过计算机模拟和分析找出潜藏在数据背后的生还逻
辑。我们也尝试通过代码,揭开尘封了 100 多年的数据的面纱。
数据示例:
http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
字段信息的备注:
机器学习任务:预测泰坦尼克号乘客能否存活 预测模型 分类问题
1 6.1 数据导入
2 6.2 数据分析和预处理
#### 注:该数据共有 1313 条乘客信息,并且有些特征数据是完整的,比如 name 和 pclass,
有些是缺失的;有些是数值型的,有些是字符串型的
#### 由于数据比较久远,难免会有信息的丢失和不完整,也有一些数据没有量化。因此,
在使用决策树模型之前,需要对数据做一些预处理和分析工作。
3 6.3 数据切分
4 6.4 数据特征转换
注:one-hot 编码
5 6.5 使用决策树模型进行预测
6 6.6 决策树模型对泰坦尼克号乘客是否生还的预测性能
总结:决策树模型总体在测试集上的预测性能约为 78.12%,大家观察能看到模型对于预
测遇难者方面的性能达到了 91%,但是识别生还者的精确率只有 58%,这也是需要提高的地
方。
7 6.7 决策树可视化
Graphviz 是贝尔实验室开发的一个开源的工具包,用于绘制结构化的图形网
络,支持多种输出格式,如常见的图片格式,SVG,PDF 等,且支持 Linux 和
windows 平台。
通过Graphviz 的地址下载该软件:http://www.graphviz.org/
配置本地环境变量,通过命令 dot -Tpng iris.dot -o output.png 将 dot 文件转化
至png图片可视化决策树。
安装的过程:
(1)http://www.graphviz.org/Download_windows.php 安装
(2)配置环境变量并在 Dos 中输入命令即可完成将 dot 文件转化为 png 文件。
(3)查看图片内容
总结:
相比其他学习模型,决策树在模型描述上有巨大的优势,决策树的逻辑推断非常直观,
具有清晰的可解释性,也有很方便的模型的可视化。在决策树的使用中,无需考虑对数据量
化和标准化,就能达到比较好的识别率。
7.决策树算法的两个经典案例
在刚讲决策树之前,我们引入了相亲的例子,接下来我们就利用模拟的一些
数据,并将数据的某些字段转化为算法或程序能处理的数值,利用决策树来进行
分类。
表 5-1 相亲数据
序号 身高 房子 车子 长相 工作 约否
1 1.8 有 无 6.5 Fact 约
2 1.62 有 无 5.5 IT 约
3 1.71 无 无 8.5 Bank 约
4 1.58 有 有 6.3 Bank 约
5 1.68 无 有 5.1 IT 不约
6 1.63 有 无 5.3 Bank 不约
7 1.78 无 无 4.5 It 不约
8 1.64 无 无 7.8 Fact 不约
9 1.65 有 有 6.6 bank 约吗?
转化为可处理的数据:
9
数据集如下:
接下来通过scikit-learn 实现上述分类需求。
7.1.Scikit-Learn 库实现 相亲约会 的 例子
1.导包并加载数据
2.划分数据集为训练集和测试集
3.使用决策树进行模型训练
4.决策树模型可视化
可视化结果如下:
5.对上述示例的决策树过程进行分析
51 .1 通过 n scikit-learn 中提供的 z export_graphviz 将决策树可视化
在实验环境中添加如下代码:
from sklearn.tree import export_graphviz
export_graphviz(model.tree_,out_file='tree.dot',
feature_names=df.columns,
max_depth=None,
class_names=["is_date:no","is_date:yes"],
rounded=True,
filled=True,)
52 .2 执行上述代码将会生成 t tree.dot 文件,里面包含了建立树所需要
的信息
53 .3 在本地安装 Graphviz
通过Graphviz 的地址下载该软件:http://www.graphviz.org/
配置本地环境变量,通过命令 dot -Tpdf iris.dot -ooutpu.pdf 将 dot 文件转化至
pdf 可视化决策树。
在本地会产生一个pdf 文件,包含了回执的图示,如下图
54 .4 分析图
s class_names : : t list f of , strings, l bool r or , None, l optional (default=None)
s Names f of h each f of e the t target s classes n in g ascending l numerical order.
y Only t relevant r for n classification d and t not d supported r for multi-output.
f If , ``True``, s shows a a c symbolic n representation f of e the s class name.
class_names=["is_date:no","is_date:yes"],这里为什么指定 no 代表 0,yes 代表 1 呢?这是因为在 c
lass_names中默认以数值递增的顺序进行对应,也是就是 0对应 is_date:no.
注:对上述图像解析几点如下:
第一行为决策条件(非叶子节点),比如根节点 handsome《5.4 条件为真走
左边,为假走右边。
 Impurity表示当前数据集的基尼不纯度
 Sample表示当前数据集的样本数
 Value 表示当前数据集中各个类别(按类别顺序从小到大排序,第 0
类,第 1 类…)的数量,如果 value 中的值相等,当前节点没有作色,
也就是白色。
 Class 表示当前数据中的多数类别,如果 value 中各个值相等,则按顺
序取值
55 .5 分析图中的逻辑
长相小于或等于5.4的,一定不约
不满足前面条件,但有房子的,一定约
不满足前面条件,但有车,约,没有车的,不约
2.6对于待测数据
长相大于5.4,不满则规则1,则继续下一条。
没有房子,不满足第二条规则2,继续吓一跳
有车,符合第三条规则,最后的结果为约,也就是上述的结果1
7.2Iris 数据集的例子
数据集简介:iris 以鸢尾花的特征作为数据来源,数据集包含 150 个数据集,分为 3 类,
每类 50 个数据,每个数据包含 4 个属性,是在数据挖掘、数据分类中非常常用的测试集、
训练集。
三类分别为:setosa, versicolor, virginica
数据包含 4 个独立的属性,这些属性变量测量植物的花朵,比如萼片和花瓣的长度等。
机器学习的目的:预测 iris 数据集类别,预测模型,分类问题
(选讲)DecisionTreeClassifier是能够在数据集上执行多类分类的类。
与其他分类器一样,DecisionTreeClassifier 将输入两个数组:数组 X,稀疏或密集,大小
为[n_samples,n_features],保存训练样本,以及整数值的数组Y,大小[n_samples],持有类
标签训练样本。
1.导包和加载数据集
从 scikit 学习加载 Iris 数据集。 这里,第三列表示花瓣长度,第四列表示花样的花瓣宽
度。这些类已经转换为整数标签,其中 0 = Iris-Setosa,1 = Iris-Versicolor,2 = Iris-Virginica。
2.切分数据集
3.绘制决策区域函数
4.构建决策树
注意:hstack() Stack arrays in sequence horizontally (column wise).
vsplit () Split array into alist of multiple sub-arrays vertically.
5.决策树性能测试
预测准确率:
下面分别调用准确率、召回率和 f1 值的函数查看具体值,也可以直接调用
classification_report 函数,直接生成具体的测试值。代码如下:
6.决策树可视化
在 Dos 中执行命令生成 PNG 的图片格式。
图片显示如下:
通过观察 GraphViz 创建图像,可以很好地回溯决策树在训练集上对各个节点进行划分
的过程。最初,决策树根节点包含105 个样本,以花瓣宽度《0.75 厘米为界限,将其划分
为分别包含 34 和 71 个样本的两个子节点。 第一次划分后,可以看到:左子树的样本均来
自 Iris-Setosa 类(熵=0),已经无需再划分。在右子树上进一步划分,直到将 Iris-Versicolor
和 Iris-Virginica 两类分开。
8.分类决策树 SKlearn 的 API 实现
I 7.1API 介绍
介绍时候可以使用谷歌浏览器,将翻译的部分让同学们有一个大概的了解。
决策树文档:http://scikit-learn.org/stable/modules/tree.html#classification
决策树分类器的简介:
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.ht
ml#sklearn.tree.DecisionTreeClassifier
Class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None,
min_samples_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=None,
random_state=None,max_leaf_nodes=None,min_impurity_decrease=0.0,
min_impurity_split=None, class_weight=None, presort=False)[source]¶
接下来分别分析参数
I 7.2API 的参数详解
(1)criterion:一个字符串,指定切分质量的评价准则。可以为如下两个参数:
Gini:表示切分时评价准则时 Gini 系数。
Entropy:表示切分的时候评价准则是熵
(2)splitter:一个字符串,指定切分原则,可以为如下:
best:表示选择最优的切分
random:表示随机切分
(3)max_features:可以为整数、浮点、字符串或者 None,指定了寻找 best split 时考
虑的特征数量。
如果是整数,则每次切分只考虑 max_features 个特征。
如果是浮点数,则每次切分只考虑 max_features*n_features 个特征。
如果是字符串 auto 或者 sqrt,则max_features 等于 sqrt(n_feautures)
如果是字符串 log2,则 max_features等于 log2(n_features)
如果是 none,则 max_features 等于 n_features.
(4)max_depth:可以为整数或者 None,指定树的最大深度。
如果为 None,则表示树的深度不限(直到每个叶子都是纯的,即叶子结点中所有的样
本点都属于一个类,或者叶子中包含小于 min_samples_split 个样本点。
(5)min_samples_split:为整数,指定每个内部节点(非叶子节点)包含的最少样本数。
(6)min_samples_leaf 为整数,指定每个叶子节点包含的最少的样本数。
(7)min_weight_fraction_leaf:为浮点数,叶子结点中样本的最小权重系数。
(8)min_leaf_nodes:为整数或 None,指定最大的叶节点数量。
如果为 None,此时叶子节点数量不限制。
如果为非 None,则max_depth 被忽略。
(9)class_weight:为一个字典、字典的列表、字符串‘balanced’,或者 None,它指定了
分类的权重。权重的形式为:{class_label:weight}
如果是 None,则每个分类的权重都为1.
字符串 balanced 表示分类权重是样本中各分类出现频率的反比。
(10)random_state:一个整数或者一个 Randomstate 实例,或者 None。
如果为整数,则它指定了随机数生成器的种子。
如果为 Randomstate 实例,则指定了随机数生成器。
如果为 None,则使用默认的随机数生成器。
(11)presort:一个布尔值,指定是否提前排序数据,从而加速寻找最优切分的过程。
设置为 True时,对于大数据集会减慢总体的训练过程;但是对于一个小数据集或者设定了
最大深度的情况下,会加速训练过程。
I 7.3API 的属性详解
共 7 各属性:
(1)classes_:分类的标签值
(2)feature_importances_:给出了特征的重要程度。该值越高,则特征越重要(也称之为
Gini_importance)
(3)max_feature_:max_feature 的推断值。
(4)n_classes_:给出了分类的数量
(5)n_feautures_:执行 fit 之后特征的数量
(6)n_outputs_:执行 fit 之后输出的数量
(7)tree_:一个 Tree 对象,即底层的决策树。:
I 7.4API 的方法详解
共有五种方法:
(1)fit(X,y):训练模型
(2)predict(X,)用模型进行预测,返回预测值
(3)predict_log_proba(X):返回一个数组,数组的元素依次是 X 预测为各个类别的概率
的对数值。
(4)predict_proba(X):返回一个数组,数组的元素依次时 X 预测为各个类别的概率值。
(5)score(X,y):返回在(X,y)上预测的准确率(accurary)的平均值。
9.Python 原生实现代码:
9.1ID3 算法的 Python 实现
1.ID3 算法实现
ID3DTree.py
>>>#-*- coding: utf-8 -*-
from numpy import *
import math
import copy
import cPickleas pickle
class ID3DTree(object):
def __init__(self):
self.tree={}
self.dataSet=[]
self.labels=[]
def loadDataSet(self,path,labels):
recordlist = []
fp = open(path,"rb") # 读取文件内容
content = fp.read()
fp.close()
rowlist = content.splitlines() # 按行转换为一维表
recordlist=[row.split("\t") for row in rowlist if row.strip()]
self.dataSet =recordlist
self.labels = labels
def train(self):
labels = copy.deepcopy(self.labels)
self.tree = self.buildTree(self.dataSet,labels)
# 创建决策树主程序
def buildTree(self,dataSet,labels):
cateList = [data[-1] for data in dataSet] # 抽取源数据集的决策标签列
# 程序终止条件 1: 如果 classList 只有一种决策标签,停止划分,返回这个决策标签
if cateList.count(cateList[0]) ==len(cateList):
return cateList[0]
# 程序终止条件 2: 个 如果数据集的第一个决策标签只有一个 返回这个决策标签
if len(dataSet[0]) == 1:
return self.maxCate(cateList)
# 算法核心:
bestFeat =self.getBestFeat(dataSet) # 返回数据集的最优特征轴:
bestFeatLabel = labels[bestFeat]
tree= {bestFeatLabel:{}}
del(labels[bestFeat])
# 抽取最优特征轴的列向量
uniqueVals = set([data[bestFeat] for data in dataSet]) # 去重
for value in uniqueVals:
subLabels = labels[:] # 将删除后的特征类别集建立子类别集
splitDataset = self.splitDataSet(dataSet, bestFeat, value) # 按最优特征列和
值分割数据集
subTree = self.buildTree(splitDataset,subLabels) # 构建子树
tree[bestFeatLabel][value]= subTree
return tree
# 计算出现最多的列别标签
def maxCate(self,catelist): # 计算出现最多的类别标签
items = dict([(catelist.count(i), i) for i in catelist])
return items[max(items.keys())]
# 计算最优特征
def getBestFeat(self,dataSet):
# 计算特征向量维,其中最后一列用于类别标签,因此要减去
numFeatures = len(dataSet[0]) - 1 # 特征向量维数= 行向量维度-1
baseEntropy = self.computeEntropy(dataSet)# 基础熵:源数据的香农熵
bestInfoGain = 0.0; # 初始化最优的信息增益
bestFeature = -1 # 初始化最优的特征轴
# 外循环:遍历数据集各列, 计算最优特征轴
# i 围 为数据集列索引:取值范围 0~(numFeatures-1)
for i in xrange(numFeatures): # 抽取第 i 列的列向量
uniqueVals = set([data[i] for data in dataSet]) 
for value in uniqueVals: # 内循环:按列和唯一值计算香农熵 s
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * self.computeEntropy(subDataSet) infoGain =
if (infoGain > bestInfoGain): # 如果信息增益>0; 
# 用当前信息增益值替代之前的最优增益值 
return bestFeature
# 计算信息熵
def computeEntropy(self,dataSet): # 计算香农熵
datalen = float(len(dataSet))
cateList = [data[-1] for dataindataSet] # 从数据集中得到类别标签
items = dict([(i,cateList.count(i)) for i in cateList])
# 得到类别为 key ,出现次数 value 的字典
infoEntropy = 0.0 # 初始化香农熵 f
prob = float(items[key])/datalen
infoEntropy -= prob * math.log(prob,2) # 香农熵: := - p*log2(p) --infoEntropy
= -prob * log(prob,2)
return infoEntropy
# 分隔数据集:删除特征轴所在的数据列,返回剩余的数据集
# dataSet :数据集; axis :特征轴; value :特征轴的取值
def splitDataSet(self,dataSet, axis, value):
rtnList = []
for featVecindataSet:
if featVec[axis] == value:
rFeatVec = featVec[:axis]
# list 作 操作 取 提取 0~(axis-1) 的元素
rFeatVec.extend(featVec[axis+1:])
# list 作 操作 将特征轴(列)之后的元素加回
rtnList.append(rFeatVec)
return rtnList
# 决策树分类器代码
def predict(self,inputTree,featLabels,testVec): # 分类器
root = inputTree.keys()[0] # 树根节点
secondDict= inputTree[root] # value- 子树结构或分类标签
featIndex = featLabels.index(root) # 根节点在分类标签集中的位置
key = testVec[featIndex] # 测试集数组取值
valueOfFeat = secondDict[key] #
if isinstance(valueOfFeat, dict):
classLabel = self.predict(valueOfFeat, featLabels, testVec) # 递归分类
else: classLabel = valueOfFeat
return classLabel
# 存储树到文件
def storeTree(self,inputTree,filename):
fw = open(filename,'w')
pickle.dump(inputTree,fw)
fw.close()
# 从文件抓取树
def grabTree(self,filename):
fr = open(filename)
return pickle.load(fr)
2.构建数据集
builddataset.py
#-*-coding:utf-8 -*-
import sys
import os
from numpy import *
# 设置 utf-8 unicode 环境
reload(sys)
sys.setdefaultencoding('utf-8')
# 构建输入的数据集
labels=[" 年龄"," 收入"," 学生"," 信誉"]
dataset = [[0,0,0,0,"no"],[0,0,0,1,"no"],[0,1,0,0,"no"],[0,2,1,0,"yes"],[0,1,1,1,"yes"],
[1,0,0,0,"yes"],[1,2,1,1,"yes"], [1,1,0,1,"yes"],[1,0,1,0,"yes"],[2,1,0,0,"yes"],[2,2,1,0,"yes"],
[2,2,1,1,"no"],[2,1,1,0,"yes"],[2,1,0,1,"no"]]
numlist = [64 ,64 ,128,64 ,64 ,128,64 ,32 ,32 ,60 ,
64 ,64 ,132,64 ]
printmat(dataset).T
datalines=[]
for element,num in zip(dataset,numlist):
liststr =""
for cellinelement:
liststr += str(cell)+"\t"
liststr = liststr[:-1]
for i in xrange(num):
datalines.append(liststr)
fp = open("dataset.dat","w")
fp.write("\n".join(datalines))
3.训练的决策树的结构信息打印及字典转化为树状的显示
>>> # -*- coding: utf-8 -*-
from numpy import *
from math importlog
from ID3DTree import *
import copy
import treePlotter2
import matplotlib.pyplot as plt
dtree = ID3DTree()
dtree.loadDataSet("dataset.dat",["age","revenue","student","credit"])
# dtree.loadDataSet("lenses.txt",['age','prescript','astigmatic','tearRate'])
dtree.train()
print dtree.tree
treePlotter2.createPlot(dtree.tree)
4.持久化决策树
# -*- coding: utf-8 -*-
# Filename :07store_grab.py
from numpy import *
from math importlog
from ID3DTree import *
import copy
import treePlotter2
import matplotlib.pyplot as plt
dtree = ID3DTree()
dtree.loadDataSet("dataset.dat",["age","revenue","student","credit"])
dtree.train()
dtree.storeTree(dtree.tree,"data.tree")
mytree = dtree.grabTree("data.tree")
print mytree
5.测试ID3 算法
-*- coding: utf-8 -*-
from numpy import *
from math importlog
from ID3DTree import *
import copy
import treePlotter2
import matplotlib.pyplot as plt
dtree = ID3DTree()
labels =["age","revenue","student","credit"]
vector= ['0','1','0','0'] # ['0','1','0','0','no']
mytree = dtree.grabTree("data.tree")
print "真实输出 ","no","->","决策树输出",dtree.predict(mytree,labels,vector)
补充:基尼指数、误分类率及代码实战
(1)Gini 指数(基尼指数)
选择最佳划分的度量通常是根据划分后子女节点的不纯性的程度决定的。一般最佳划分
对应于产生最小 Gini 指标值得点。
公式(1-1):
Gini t = 1 −
1
?
? ? ?
2
? ?1− 1㱠
P(i|t)表示给定节点 t 中属于类 i 的记录所占的比例。
(2)错误率
Classfication error = 1− max p i t ?1− 2㱠
以 2分类问题为例计算信息熵、基尼不纯度和错误率
节点 计数
类=0 1
类=1 5
Gini=1-?1/6㱠 2 − ?5/6㱠 2 =0.278
Entropy=-(1/6)log(1/6)-(5/6)log(5/6)=0.650
Error=1-max[1/6,5/6]=0.167
(3)信息增益公式解读
∆ = I parent −
?=1
?
? ? ?
?
? ??? ? 㱠
??.㱠是给定节点的不纯性度量,N 是父节点上的记录总数,k是属性值的个数 ? ? ? 是与子
女节点 v相关联的记录个数,决策树归纳算法通常选择最大化增益 的测试条件,因为对所
有的测试条件来说,?是一个不变的值,所以最大化增益等价于最小化子女节点的不纯性度
量的的加权平均值。当选择熵作为不纯性度量时,熵的差就是所谓的信息增益。
补充:最大熵及交叉熵
 底数一般为 2 或 e
两点分布的熵
均匀分布的信息熵
定义概率:
计算熵:
最大熵
熵是随机变量不确定性度量,不确定越大,熵越大
若随机变量退化成定值,熵最小,为 0
若随机分布为均匀分布,熵最大
接下来考虑,给定期望和方差的前体下,最大熵模型的形式?
正态分布的概率密度函数:
对数正态分布:
该分布的对数是关于随机变量 x 的二次函数,根据计算过程的可逆性,如若对数分布能够
写成随机变量的二次形式,则该分布必然是正态分布。
给定方差的最大熵分布
建立目标函数:
使用方差公式化简方差:
带约束的极值问题使用拉格朗日乘子法:
根据上面的分析,P(x)的对数关于随机变量 x 的二次形式,所以,该分布 p(x)必然是正态
分布。
n Venn 图理解几个熵的概念
条件熵
条件熵的定义
根据互信息得到条件熵
两个随机变量 X,Y 的联合分布,可以形成联合熵 H(X,Y)表示,(X,Y)发生所包含的熵,
减去 X 单独发生的熵,就是在 X 发生前提下 Y 发生带来的熵即 H(X|Y)=H(X,Y)-H(X)
利用互信息得到条件熵
交叉熵(相对熵,L KL 散度)
设 p(x),q(x)是 X 中取值的两个概率分布,则 p 对 q 的相对熵是
 交叉熵可以度量两个随机变量之间的”距离“


互信息

推荐系统之决策树算法相关推荐

  1. 企业级用户画像:用户购物性别模型-USG和决策树算法

    絮叨两句: 博主是一名数据分析实习生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年易老 ...

  2. 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集

    各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...

  3. 【机器学习入门】(4) 决策树算法理论:算法原理、信息熵、信息增益、预剪枝、后剪枝、算法选择

    各位同学好,今天我向大家介绍一下python机器学习中的决策树算法的基本原理.内容主要有: (1) 概念理解:(2) 信息熵:(3) 信息增益:(4) 算法选择:(5) 预剪枝和后剪枝. python ...

  4. 决策树算法原理(ID3,C4.5)

    决策树算法原理(CART分类树) CART回归树 决策树的剪枝 决策树可以作为分类算法,也可以作为回归算法,同时特别适合集成学习比如随机森林. 1. 决策树ID3算法的信息论基础   1970年昆兰找 ...

  5. 每日一问 - 关于决策树算法

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 来源:Datawhale优秀回答者 将在留言区,Datawhale高校群 ...

  6. 最常用的决策树算法!Random Forest、Adaboost、GBDT 算法

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 本文主要介绍基于集成学习的决策树,其主要通过不同学习框架生产基学习器,并综合所有基学习 ...

  7. 决策树算法的原理(接地气版)

    ↑↑点击上方蓝字,N个G的惊喜 ❝ 决策树( )是一类很常见很经典的机器学习算法,既可以作为分类算法也可以作为回归算法.同时也适合许多集成算法,如 , ,以后会逐一介绍.本篇介绍一下决策树算法的原理. ...

  8. 决策树算法之特征工程-特征提取

    决策树算法之特征工程-特征提取 什么是特征提取呢?   [把数据转化为机器更加容易识别的数据] 1 特征提取 1.1 定义 将任意数据(如文本或图像)转换为可用于机器学习的数字特征 注:特征值化是为了 ...

  9. 决策树算法之cart剪枝

    决策树算法之cart剪枝 1 为什么要剪枝      [决策树容易发生过拟合] •横轴表示在决策树创建过程中树的结点总数,纵轴表示决策树的预测精度. •实线显示的是决策树在训练集上的精度,虚线显示的则 ...

最新文章

  1. sql 存储过程 分页
  2. 【干货】APP产品处理加载机制和刷新机制的交互方法解析
  3. 查看Linus中自带的jdk ,设置JAVA_HOME
  4. mysql行级视图与列级视图_[数据库]--DML、DDL、TCL语言
  5. nginx的root alias 指令
  6. Mongodb ruby driver API(中文)
  7. 洛谷P4239 【模板】多项式求逆(加强版)(多项式求逆)
  8. 树莓派 + Windows IoT Core 搭建环境监控系统
  9. navicat连接linux远程数据库,使用Navicat forMySql远程连接Linux 系统上的数据库
  10. 获取场景中指定类的实例
  11. 傅里叶变换滤波之生物信号滤波(笔记03)
  12. HTML的基本知识(三)
  13. JodaTime报时区异常错误
  14. 【Keil】分享Keil5修改为黑色炫酷主题的一种方法
  15. 大班如果我有机器人教案_大班科学机器人教案
  16. 墙裂推荐,Python开发者不容错过的7个VS Code扩展
  17. SAP BAPI_PRODORD_CREATE 参数带上销售订单号报 客户订单无CO对象 提示
  18. 徐荣谦《养好脾和肺 宝宝不积食不咳嗽长大个》【01】小儿常见病
  19. 当遗传学遇上Excel格式化,科学家们也只能认输
  20. 解决RStudio Warning message:文件名、目录名或卷标语法不正确

热门文章

  1. iphone新旧手机数据传输已取消_新iPhone上手指南,新老果粉必看教程
  2. ABAP DIALOG ALV
  3. 我开发了《联机桌游合集: UNO+斗地主+五子棋》,让你享受纯粹的游戏
  4. win7系统注册表开机启动项如何打开?
  5. 调试破解无限dubugger
  6. matlab doc(),matlab指令大全(Matlab instruction Daquan).doc
  7. mysql数据库损坏修复方法(适用window、Linux系统vps云主机)
  8. Nessus 数据库损坏解决方案
  9. 2020-0512-Game(博弈论/质因数)
  10. php怎么打我爱你,教你深情表白:用电影里的方式说“我爱你”