决策树方法在分类、预测、规则提取等领域有着广泛的应用。ID3算法的提出后,决策树在机器学习和数据挖掘等领域得到了极大发展。所以ID3算法非常重要同时也非常基础。ID3算法的核心是在决策树的各级节点上,使用信息增益方法作为属性选择的标准,来帮助确定生成每个节点时所采用的合适属性。
Contents
1.信息熵
2.信息增益
3.ID3算法
3.1 算法步骤
3.2 伪代码
4.ID3算法Python代码实现
所以介绍决策树之前,我们先学习一下信息熵以及信息增益。
1.信息熵
熵这个概念最早起源于物理学,是用来度量一个热力学系统的无序程度。在信息学里面,熵是对不确定性的度量。1948年,
Shannon提出了信息熵,将其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。信息熵可以被认为是系统有序化程度的一个度量。
Shannon可是被认为是二十世纪最聪明的人之一,还有人认为Shannon和爱因斯坦相提并论,而且这样对Shannon是不公平的。想想他能有多厉害!
假如一个随机变量的取值为
,每一种取到的概率分别是
,那么
的熵定义为
意思是一个变量的变化情况可能越多,那么它携带的信息量就越大。
对于分类系统来说,类别是变量,它的取值是
,而每一个类别出现的概率分别是
而这里的就是类别的总数,此时分类系统的熵就可以表示为
接下来就是信息增益了:
2.信息增益
信息增益是针对一个一个特征而言的,就是看一个特征t,系统有它和没有它时的信息量各是多少,两者
的差值就是这个特征给系统带来的信息量,即信息增益。
接下来就以下面这个例子来说明, 学习的目标就是Horse Ride的Yes 或者 No
Sky | Temperature | Humidity | Wind | HorseRide |
Cloudy | Warm | Low | Low | Yes |
Rainy | Cold | Medium | Low | No |
Sunny | Warm | Medium | Low | Yes |
Sunny | Hot | High | High | No |
Snow | Cold | Low | High | No |
Rainy | Warm | High | Low | Yes |
从上表中可以看出来,总共6个样例,3个正样本,3个负样本,当前信息熵计算如下:
在决策树分类问题中,信息增益就是决策树在进行属性选择划分前和划分后信息的差值。假设利用属性SKY来分类,那么如下图:
划分后,数据就分成四部分了,那么各个分支的信息熵计算如下:
那么划分后的信息熵就是:
那么信息增益是:
在本例中,Gain(S)=1-2/3=1/3。
3.1 ID3算法步骤
1.使用数据集S计算每个属性的熵
2.将集合S分解成子集,使用所得到的熵(分割后)最小的属性(或等效地,信息增益最大)
3.制作包含该属性的决策树节点
4.使用剩余的属性来回收子集。
3.2 ID3伪代码
ID3(示例,目标属性,属性)
为树创建根节点
如果所有示例都是正数,返回单节点树;label标记为: +。
如果所有示例都为负数,则返回单节点树;其中label 标记为: - 。
如果预测属性数为空,则返回单个节点树;
标签=实例中目标属性的最常见值。
否则开始
A←最佳分类示例的属性。
根节点(Root) = A的决策树属性
对于A的每个可能值vi,
在根节点下方添加一个新的树枝,对应于测试A = vi。
让示例(vi)是A的值为vi的示例子集
如果示例(vi)为空
然后在这个新分支下方添加一个具有label =最常见目标值的叶子节点
在这个新分支下方添加子树ID3(示例(vi),目标属性,属性 - {A}) (这一部分就是递归)
结束
返回根节点
4.ID3算法Python代码
#-*- coding: utf-8 -*-
#使用ID3决策树算法预测销量高低
import pandas as pd
#参数初始化
inputfile = 'G:/code/data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序号') #导入数据
#类别标签‘好’,‘是’,‘高’ 赋值为1,其他为-1
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)#把数据中的前三列数据赋给x
y = data.iloc[:,3].as_matrix().astype(int)#目标数据赋给y
print(y)
print(x)
from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy') #建立基于信息熵的决策树模型
dtc.fit(x, y) #训练模型
#导入相关函数,可视化决策树
#导出dot文件,利用Graphviz转换为pdf或者png
from sklearn.tree import export_graphviz
x = pd.DataFrame(x)
from sklearn.externals.six import StringIO
x = pd.DataFrame(x)
with open("tree.dot", 'w') as f:
f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
最后,利用Graphviz可以把dot数据转换为可视化的格式,以下是转换后的图:
这样我们就有了决策树了!
想知道怎么用Graphviz吗?动动手查一查吧。