ID3算法
2015-12-05 10:32
232 查看
ID3算法是决策树算法中的一种,决策树的具体教程可以看这里/article/11268188.html
ID3算法的大致思路:从根节点开始,对接点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。
利用ID3算法创建的决策树,是只针对于分类属性的。
输出:决策树T
1. 若D中所有实例属于同一个类C,则T为单结点树,并将类C作为该结点的类标记,返回T
2. 若A=∅\varnothing,则T为单结点树,并将D中实例数最大的类C作为该结点的类标记,返回T
3. 否则,计算A中各特征对D的信息增益,选择信息增益最大的特征AkA_k
4. 如果AkA_k的信息增益小于阈值ee,则置T为单结点树,并将D中实例数最大的类C作为该结点的类标记,返回T
5. 否则,对AkA_k的每一个可能值aia_i,依Ak=aiA_k=a_i将D分割为若干非空子集DiD_i,将属性AkA_k作为一个结点,其每个属性值aia_i作为一个分支,分别构建子结点,由结点及其子结点构成树T,返回T
6. 对第i各子结点,以DiD_i为训练集,以A−{Ak}A-\{A_k\}为特征集,递归地调用步骤(1)~(5),得到子树TiT_i,返回TiT_i
ID3算法的大致思路:从根节点开始,对接点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。
利用ID3算法创建的决策树,是只针对于分类属性的。
具体算法步骤:
输入:训练数据集D,特征集A,阈值e输出:决策树T
1. 若D中所有实例属于同一个类C,则T为单结点树,并将类C作为该结点的类标记,返回T
2. 若A=∅\varnothing,则T为单结点树,并将D中实例数最大的类C作为该结点的类标记,返回T
3. 否则,计算A中各特征对D的信息增益,选择信息增益最大的特征AkA_k
4. 如果AkA_k的信息增益小于阈值ee,则置T为单结点树,并将D中实例数最大的类C作为该结点的类标记,返回T
5. 否则,对AkA_k的每一个可能值aia_i,依Ak=aiA_k=a_i将D分割为若干非空子集DiD_i,将属性AkA_k作为一个结点,其每个属性值aia_i作为一个分支,分别构建子结点,由结点及其子结点构成树T,返回T
6. 对第i各子结点,以DiD_i为训练集,以A−{Ak}A-\{A_k\}为特征集,递归地调用步骤(1)~(5),得到子树TiT_i,返回TiT_i
代码实现
# 加载数据 def loadDataSet(dataPath): dataset = [] with open(dataPath) as file: lines = file.readlines() for line in lines: values = line.strip().split(' ') dataset.append(values) return dataset # 数据集分割,返回属性axis的值为value的数据子集,子集中不包含axis属性 def splitDataSet(dataset, axis, value): retDataSet = [] for featVec in dataset: if featVec[axis] == value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) return retDataSet # 计算数据集的信息熵 def calShannonEnt(dataset): numEntries = len(dataset) * 1.0 labelCounts = dict() for featVec in dataset: currentLabel = featVec[-1] if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 shannonEnt = 0.0 for key in labelCounts: prob = labelCounts[key] / numEntries import math shannonEnt -= prob * math.log(prob, 2) return shannonEnt # 计算数据子集相较于原数据集的信息增益 def InfoGain(dataset, axis, baseShannonEnt): featList = [example[axis] for example in dataset] uniqueVals = set(featList) newShannonEnt = 0.0 numEntries = len(dataset) * 1.0 for value in uniqueVals: subDataSet = splitDataSet(dataset, axis, value) ent = calShannonEnt(subDataSet) prob = len(subDataSet) / numEntries newShannonEnt += prob * ent infoGain = baseShannonEnt - newShannonEnt return infoGain # 根据不同属性的信息增益,进行属性选择 def ChooseBestFeatureByInfoGain(dataset): numFeature = len(dataset[0]) - 1 baseShannonEnt = calShannonEnt(dataset) bestInfoGain = 0.0 bestFeature = -1 for i in range(numFeature): infoGain = InfoGain(dataset, i, baseShannonEnt) if infoGain > bestInfoGain: bestInfoGain = infoGain bestFeature = i return bestFeature # 递归地创建决策树 def createTree(dataset, labels): classList = [example[-1] for example in dataset] if classList.count(classList[0]) == len(classList): return classList[0] if len(dataset[0]) == 1: return majorityCnt(classList) bestFeature = ChooseBestFeatureByInfoGain(dataset) bestFeatureLabel = labels[bestFeature] myTree = {bestFeatureLabel:{}} del(labels[bestFeature]) featValues = [example[bestFeature] for example in dataset] uniqueVals = set(featValues) for value in uniqueVals: subLabels = labels[:] myTree[bestFeatureLabel][value] = \ createTree(splitDataSet(dataset, bestFeature, value), subLabels) return myTree
相关文章推荐
- 重载PostNcDestroy()函数做一些清理工作
- iOS设计模式——Category
- caused by android.system.errnoexception open failed eacces (permission denied)解决方案,安卓6.0(API23)权限问题
- Linux简单的shell脚本
- TCP建立连接和拆除连接的过程
- java -- 线程池例子ExecutorService
- 35 个 Java 代码性能优化总结
- 安装Hadoop系列 — 导入Hadoop源码项目
- iOS 开发者必不可少的 75 个工具
- java中转义字符
- 你的梦想
- SQL Server中DateTime与DateTime2的区别
- CCBPM关于工作流引擎取回审批的设计方案与实现过程
- interview collect
- Java获取当前时间、当前零点零分零秒、昨天这一时间
- <VCC笔记> Assumption
- RecyclerView介绍(一)----简单概述
- 融合通信(中移动)----微信的强力竞争者来了----阿冬专栏!!!
- php实现微信发红包
- 求子数组的最大和