初识分类算法(2)------决策树ID3算法

例子:分类:play or not ?(是/否)

           

目的:根据训练样本集S构建出一个决策树,然后未知分类样本通过决策树就得出分类。

问题:怎么构建决策树,从哪个节点开始(选择划分属性的问题)

方法:ID3(信息增益),C4.5(信息增益率),它们都是用来衡量给定属性区分训练样例的能力。

1. 为了理解信息增益,先来理解熵Entropy。熵是来度量样本的均一性的,即样本的纯度。样本的熵越大,代表信息的不确定性越大,信息就越混杂。

训练样本S:    

S相对与目标分类的熵为:

(p1,p2,…,pn)=–p1log2(p1)–p2log2(p2)–…–pnlog2(pn

2. 计算数据集由属性A(outlook)划分数据集后,数据集的熵。

3. 因此,由属性A划分之后的S相比于原始的S,信息增益GAIN(A)为

4.同理算出其余3个属性的划分之后的S相比于原始S的信息增益,谁的信息增益最大,就说明使用某个属性划分S之后,S的信息的确定性增加最多,同时熵减少的越多。

5.上例选择了outlook作为决策树的根节点,然后分别对outlook的3个属性,重复上面的操作,最终得出一颗完整的决策树。

6. 那么下面来看信息增益存在的一个问题:假设某个属性存在大量的不同值,如ID编号(在上面例子中加一列为ID,编号为a~n),在划分时将每个值成为一个结点,如下:

那么S由属性ID划分之后的熵为0,因为信息已经确定了。因此S由属性ID划分之后相比于之前的S信息增益为max,因此在选择树节点的时候肯定会选择ID. 这样决策树在选择属性时,将偏向于选择该属性,但这肯定是不正确(导致过拟合)的。

7.因此C4.5算法采用信息增益率GainRation作为选择树节点的依据。

IntrinsicInfo(A)=-5/14*log(-5/14)-4/14*log(-4/14)-5/14*log(-5/14)

信息增益率作为一种补偿(Compensate)措施来解决信息增益所存在的问题,但是它也有可能导致过分补偿,而选择那些内在信息很小的属性,这一点可以尝试:首先,仅考虑那些信息增益超过平均值的属性,其次再比较信息增益。

8.python  实现

8.1 计算熵的函数

 1 def calcShannonEnt(dataSet):
 2     numEntropy = len(dataSet)
 3     labelCounts = {}
 4     for  exam in dataSet: #the the number of unique elements and their occurance
 5         currentLabel = exam[-1] #输出结果yes or no
 6         #print currentLabel
 7         if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
 8         labelCounts[currentLabel] += 1
 9     #print labelCounts      --{‘Yes‘: 9, ‘No‘: 5}
10     shannonEnt = 0.0
11     for key in labelCounts:
12         #print labelCounts[key]
13         prob = float(labelCounts[key])/numEntropy
14         shannonEnt -= prob * log(prob,2) #log base 2
15     return shannonEnt

entropy 计算函数

8.2 选择信息增益最大的属性划分数据集

 1 def splitDataSet(dataSet, axis, value):
 2     retDataSet = []
 3     for featVec in dataSet:
 4         #print featVec[axis],value
 5         if featVec[axis] == value:
 6             reducedFeatVec = featVec[:axis]     #chop out axis used for splitting
 7             #print reducedFeatVec
 8             reducedFeatVec.extend(featVec[axis+1:])
 9             #print reducedFeatVec
10             retDataSet.append(reducedFeatVec)
11     return retDataSet
12 def chooseBestFeatureToSplit(dataSet):
13     numFeatures = len(dataSet[0]) - 1      #the last column is used for the labels
14 #    print dataSet[0],numFeatures
15     baseEntropy = calcShannonEnt(dataSet)
16 #    print baseEntropy
17     bestInfoGain = 0.0; bestFeature = -1
18     for i in range(numFeatures):        #iterate over all the features
19         #print range(numFeatures)
20         featList = [example[i] for example in dataSet]#create a list of all the examples of this feature
21         #print example,example[i],featList
22         uniqueVals = set(featList)       #get a set of unique values  得到唯一值
23         #print uniqueVals
24         newEntropy = 0.0
25         for value in uniqueVals:
26             #print value
27             subDataSet = splitDataSet(dataSet, i, value)
28             #print subDataSet
29             prob = len(subDataSet)/float(len(dataSet))
30             #print len(subDataSet),len(dataSet),prob
31             newEntropy += prob * calcShannonEnt(subDataSet)
32             print  calcShannonEnt(subDataSet),newEntropy
33         infoGain = baseEntropy - newEntropy     #calculate the info gain; ie reduction in entropy
34         print infoGain
35         if (infoGain > bestInfoGain):       #compare this to the best gain so far
36             bestInfoGain = infoGain         #if better than current best, set to best
37             bestFeature = i
38     return bestFeature                      #returns an integer
39 mydata,labels=createDataSet()
40 #print mydata
41 calcShannonEnt(mydata)
42 chooseBestFeatureToSplit(mydata)

chooseBestFeatureToSplit(dataSet)

8.3 可视化展示决策树

 1 def createTree(dataSet,labels):
 2     classList = [example[-1] for example in dataSet]
 3     if classList.count(classList[0]) == len(classList):
 4         return classList[0]#stop splitting when all of the classes are equal
 5     if len(dataSet[0]) == 1: #stop splitting when there are no more features in dataSet
 6         return majorityCnt(classList)
 7     bestFeat = chooseBestFeatureToSplit(dataSet)
 8     bestFeatLabel = labels[bestFeat]
 9     myTree = {bestFeatLabel:{}}
10     del(labels[bestFeat])
11     featValues = [example[bestFeat] for example in dataSet]
12     uniqueVals = set(featValues)
13     for value in uniqueVals:
14         subLabels = labels[:]       #copy all of labels, so trees don‘t mess up existing labels
15         myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
16     return myTree
17 tree=createTree(mydata,labels)
18 treePlotter.createPlot(tree)

plot

时间: 2024-10-09 10:15:55

初识分类算法(2)------决策树ID3算法的相关文章

决策树ID3算法[分类算法]

ID3分类算法的编码实现 1 <?php 2 /* 3 *决策树ID3算法(分类算法的实现) 4 */ 5 6 /* 7 *把.txt中的内容读到数组中保存 8 *$filename:文件名称 9 */ 10 11 //-------------------------------------------------------------------- 12 function gerFileContent($filename) 13 { 14 $array = array(NULL); 15

决策树---ID3算法(介绍及Python实现)

决策树---ID3算法   决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no sunny 80 90 TRUE no overcast 83 86 FALSE yes rainy 70 96 FALSE yes rainy 68 80 FALSE yes rainy 65 70 TRUE no overcast 64 65 TRUE yes sunny 72 95 FALSE

数据挖掘之决策树ID3算法(C#实现)

决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般来说陆生动物是没有鳃的(记得应该是这样的,如有错误欢迎指正).所以玩这种游戏,提问的顺序很重要,争取每次都能够获得尽可能多的信息量. AllElectronics顾客数据库标记类的训练元组 RID age income student credit_rating Class: buys_comput

决策树 -- ID3算法小结

ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归纳: 1.使用所有没有使用的属性并计算与之相关的样本熵值: 2.选取其中熵值最小的属性 3.生成包含该属性的节点 4.使用新的分支表继续前面步骤 ID3算法以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类:所以归根结底,是为了从一堆数据中生成决策树而采取的一种归纳方式: 具体介绍: 1.信

决策树ID3算法的java实现

决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳嗽等症状细分你是否为病毒性感冒等等.决策树的过程其实也是基于极大似然估计.那么我们用一个什么标准来衡量某个特征是权重最大的呢,这里有信息增益和基尼系数两个.ID3算法采用的是信息增益这个量. 根据<统计学习方法>中的描述,G(D,A)表示数据集D在特征A的划分下的信息增益.具体公式: G(D,A)

决策树ID3算法实现,详细分步实现,参考机器学习实战

一.编写计算历史数据的经验熵函数 In [1]: from math import log def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCounts = {} for elem in dataSet: #遍历数据集中每条样本的类别标签,统计每类标签的数量 currentLabel = elem[-1] if currentLabel not in labelCounts.keys(): #如果当前标签不在字典的key值中

决策树ID3算法预测隐形眼睛类型--python实现

本节讲解如何预测患者需要佩戴的隐形眼镜类型. 1.使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3)分析数据:快速检查数据,确保正确地解析数据内容,使用createPlot()函数绘制最终的树形图 (4)训练算法:createTree()函数 (5)测试算法:编写测试函数验证决策树可以正确分类给定的数据实例 (6)使用算法:存储数的数据结构,以使下次使用时无需重新构造树 trees.py如下: #!/u

决策树ID3算法的java实现(基本试用所有的ID3)

已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1) 高(1) 是(1) 3 是(1) 是(1) 很高(2) 是(1) 4 否(0) 是(1) 正常(0) 否(0) 5 否(0) 否(0) 高(1) 否(0) 6 否(0) 是(1) 很高(2) 是(1) 7 是(1) 否(0) 高(1) 是(1) 原理分析: 在决策树的每一个非叶子结点划分之前,先

机器学习—— 决策树(ID3算法)的分析与实现

KNN算法请参考:http://blog.csdn.net/gamer_gyt/article/details/47418223 一.简介         决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值.决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出. 数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用