微信公众号:码农充电站pro
我的主页:https://codeshellme.github.iopython
决策树是一种机器学习算法,咱们可使用决策树来处理分类问题。决策树的决策(分类)过程能够用一个倒着的树形结构来形象的表达出来,所以得名决策树。git
好比咱们根据天气是否晴朗和是否刮风来决定是否去踢球?当天气晴朗而且不刮风的时候,咱们才去踢球。github
此时,就能够将这个决策过程用一个树形结构来表示,以下:算法
这就是一颗最简单的决策树,咱们能够用它来判断是否要去踢球。最上方是树的根节点,最下方是树的叶子节点。方框里是判断的过程,椭圆形中是决策的结果。shell
固然,实际的使用过程当中,判断条件并不会这么简单,也不会让咱们本身手动画图。实际应用中,咱们会让程序自动的,从一堆样本数据集中构造出这颗决策树,这个程序自动构建决策树的过程就是机器学习的过程。微信
最终构造出来的这棵决策树就是机器学习的结果,叫作模型。最后,咱们能够向模型中输入一些属性条件,让模型给出咱们判断结果。机器学习
好比咱们有以下数据集:函数
序号 | 条件:天气晴朗? | 条件:是否刮风? | 结果:去踢球吗? |
---|---|---|---|
1 | 是 | 否 | 去 |
2 | 是 | 是 | 不去 |
3 | 否 | 是 | 不去 |
4 | 否 | 否 | 不去 |
能够看到这个表格中有4 行(第一行表头不算),4 列数据。学习
通常在机器学习中,最后一列称为目标(target),前边的列都称为特征(features)。动画
咱们要根据这个数据集,来构建一颗决策树,那如何构建呢?
首先,须要肯定使用哪一个属性做为第一个判断条件,是先判断天气晴朗,仍是先判断是否刮风?也就是,让天气晴朗做为树的根节点,仍是让是否刮风做为树的根节点?
解决这个问题须要用到信息熵和信息纯度的概念,咱们先来看什么是信息熵。
1948 年,克劳德·香浓在他的论文“通讯的数学原理”中提到了信息熵(通常用H 表示),度量信息熵的单位是比特。
就是说,信息量的多少是能够量化的。一条信息量的多少与信息的不肯定性有关,能够认为,信息量就等于不肯定性的多少(信息的不肯定度)。
信息熵的计算公式以下:
该公式的含义是:
n
就是分类的数目。H(X)
表示熵,数学含义是,全部类别包含的信息指望值。-㏒p(Xì)
表示符号的信息值,p(Xì)
是选择该分类的几率。log
通常以2 为底。总之,就是要知道,信息量的多少是能够用数学公式计算出来的,用信息论中的专业术语就叫作信息熵。信息熵越大,信息量也就越大。
那么咱们就来计算一下上面表格数据的信息熵。咱们只关注“结果”那一列:
结果:去踢球吗? |
---|
去 |
不去 |
不去 |
不去 |
根据表格,咱们能够知道,全部的分类共有2 种,也就是“去” 和“不去”,“去”出现了1 次,“不去”出现了3 次。
分别计算“去” 和“不去” 出现的几率:
P(去) = 1 / 4 = 0.25
P(不去) = 3 / 4 = 0.75
而后,根据熵的计算公式来计算“去”和“不去” 的信息熵,其中log 以2 为底:
H(去) = 0.25 * log 0.25 = -0.5
H(不去) = 0.74 * log 0.75 = -0.31127812445913283
因此,整个表格含有的信息量就是:
H(表格) = -(H(去) + H(不去)) = 0.81127812445913283
将计算信息熵的过程用Python
代码实现,以下:
import math # 本函数用于计算一组数据的信息熵 # data_set 是一个列表,表明一组数据 # data_set 的元素data 也是一个列表 def calc_ent(data_set): labels = {} # 用于统计每一个label 的数量 for data in data_set: label = data[-1] # 只用最后一个元素作计算 if label not in labels: labels[label] = 0 labels[label] += 1 ent = 0 # 熵 n = len(data_set) # 数据条数 # 计算信息熵 for label in labels: prob = float(labels[label]) / n # label 的几率 ent -= prob * math.log(prob, 2) # 根据信息熵公式计算 return ent
下面用该函数来计算表格的信息熵:
# 将表格转化为 python 列表 # "yes" 表示"去" # "no" 表示"不去" data_set = [['yes'], ['no'], ['no'], ['no']] ent = calc_ent(data_set) print(ent) # 0.811278124459
可见,用代码计算出来的结果是 0.811278124459,跟咱们手算的结果 0.81127812445913283 是同样的(保留的小数位数不一样)。
信息的纯度与信息熵成反比:
经典的“不纯度”算法有三种,分别是:
ID3 算法
,Information Divergence
,该算法由 Ross Quinlan
于1975 年提出,可用于生成二叉树或多叉树。
C4.5 算法
,是 Ross Quinlan
在ID3 算法的基础上改进而来,可用于生成二叉树或多叉树。CART 算法
,Classification and Regression Trees
,中文为分类回归树。
CART 算法
会选择基尼系数最小的属性做为属性的划分。信息增益是其中最简单的一种算法,后二者都是由它衍生而来。本篇文章中,咱们只详细介绍信息增益。
基尼系数是经济学中用来衡量一个国家收入差距的经常使用指标。当基尼系数大于
0.4
的时候,说明财富差别较大。基尼系数在0.2-0.4
之间说明分配合理,财富差距不大。
信息增益就是,在根据某个属性划分数据集的先后,信息量发生的变化。
信息增益的计算公式以下:
该公式的含义:
G = H(父节点) - H(全部子节点)
信息增益的目的在于,将数据集划分以后带来的纯度提高,也就是信息熵的降低。若是数据集在根据某个属性划分以后,可以得到最大的信息增益,那么这个属性就是最好的选择。
因此,咱们想要找到根节点,就须要计算每一个属性做为根节点时的信息增益,那么得到信息增益最大的那个属性,就是根节点。
为了方便看,我将上面那个表格放在这里:
序号 | 条件:天气晴朗? | 条件:是否刮风? | 结果:去踢球吗? |
---|---|---|---|
1 | 是 | 否 | 去 |
2 | 是 | 是 | 不去 |
3 | 否 | 是 | 不去 |
4 | 否 | 否 | 不去 |
咱们已经知道了,信息增益等于按照某个属性划分先后的信息熵之差。
这个表格划分以前的信息熵咱们已经知道了,就是咱们在上面计算的结果:
H(表格) = 0.81127812445913283
。接下来,咱们计算按照“天气晴朗”划分的信息增益。按照“天气晴朗”划分后有两个表格。
表格1,“天气晴朗”的值为“是”:
序号 | 条件:天气晴朗? | 条件:是否刮风? | 结果:去踢球吗? |
---|---|---|---|
1 | 是 | 否 | 去 |
2 | 是 | 是 | 不去 |
分类共有2 种,也就是“去” 和“不去”,“去”出现了1 次,“不去”出现了1 次。
因此,“去” 和“不去” 出现的几率均为0.5:
P(去) = P(不去) = 1 / 2 = 0.5
而后,“去”和“不去” 的信息熵,其中log 以2 为底:
H(去) = H(不去) = 0.5 * log 0.5 = -0.5
因此,表格1 含有的信息量就是:
H(表格1) = -(H(去) + H(不去)) = 1
表格2,“天气晴朗”的值为“否”:
序号 | 条件:天气晴朗? | 条件:是否刮风? | 结果:去踢球吗? |
---|---|---|---|
3 | 否 | 是 | 不去 |
4 | 否 | 否 | 不去 |
全部的分类只有1 种,是“不去”。因此:
P(不去) = 1
而后,“不去” 的信息熵,其中log 以2 为底:
H(不去) = 1 * log 1 = 0
因此,表格2 含有的信息量就是:
H(表格2) = 0
总数据共有4 份:
因此,最终按照“天气晴朗”划分的信息增益为:
G(天气晴朗) = H(表格) - (0.5*H(表格1) + 0.5*H(表格2)) = H(表格) - 0.5 = 0.31127812445913283。
当咱们计算的信息增益多了,你会发现,ID3 算法倾向于选择取值比较多的属性做为(根)节点。
可是有的时候,某些属性并不会影响结果(或者对结果的影响不大),那此时使用ID3 选择的属性就不恰当了。
为了改进ID3 算法的这种缺点,C4.5 算法应运而生。
C4.5 算法对ID3 算法的改进点包括:
固然C4.5 算法也并非没有缺点,因为 C4.5算法须要对数据集进行屡次扫描,因此算法效率相对较低。这里再也不展开讨论C4.5 算法。
下篇会介绍如何用决策树来解决实际问题。
欢迎关注做者公众号,获取更多技术干货。