机器学习之ID3算法

     决策树方法在分类、预测、规则提取等领域有着广泛的应用。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    
SkyTemperatureHumidityWindHorseRide
CloudyWarmLowLowYes
RainyColdMediumLowNo
SunnyWarmMediumLowYes
SunnyHotHighHighNo
SnowColdLowHighNo
RainyWarmHighLowYes
从上表中可以看出来,总共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吗?动动手查一查吧。




  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值