机器学习之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    
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来分类,那么如下图:


机器学习之ID3算法_第1张图片

划分后,数据就分成四部分了,那么各个分支的信息熵计算如下:
那么划分后的信息熵就是:
     
那么信息增益是:
在本例中,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数据转换为可视化的格式,以下是转换后的图:

机器学习之ID3算法_第2张图片

这样我们就有了决策树了!
想知道怎么用Graphviz吗?动动手查一查吧。





你可能感兴趣的:(机器学习)