决策树算法:ID3

article/2025/11/11 0:41:56

  决策树是最经常使用的数据挖掘算法,其核心是一个贪心算法,它采用自顶向下的递归方法构建决策树,下面是一个典型的决策树:
这里写图片描述
  目前常用的决策树算法有ID3算法、改进的C4.5,C5.0算法和CART算法

  ID3算法的核心是在决策树各级节点上选择属性时,用信息增益作为属性的选择标准,使得在每一个非节点进行测试时,能获得关于被测试记录最大的类别信息。

  1. ID3的特点
      优点:理论清晰,方法简单,学习能力较强
      缺点:
        (1) 信息增益的计算比较依赖于特征数目比较多的特征
        (2) ID3为非递增算法
        (3) ID3为单变量决策树
        (4) 抗糙性差

  2. 熵和信息增益
      设S是训练样本集,它包括n个类别的样本,这些方法用 C i {C_i} Ci表示,那么熵和信息增益用下面公式表示:
      信息熵:
    E ( S ) = − ∑ i = 0 n p i log ⁡ 2 p i E(S) = - \sum\limits_{i = 0}^n {{p_i}{{\log }_2}{p_i}} E(S)=i=0npilog2pi
        其中 p i {p_i} pi表示 C i {C_i} Ci的概率
      样本熵:
    E A ( S ) = − ∑ j = 1 m ∣ S j ∣ ∣ S ∣ E ( S j ) E{_A}(S) = - \sum\limits_{j = 1}^m {\frac{{|{S_j}|}}{{|S|}}E({S_j})} EA(S)=j=1mSSjE(Sj)
         其中 S i {S_i} Si表示根据属性A划分的 S {S} S的第 i {i} i个子集, S {S} S S i {S_i} Si表示样本数目
      信息增益:
    G a i n ( S , A ) = E ( S ) − E A ( S ) Gain(S,A) = E(S) - {E_A}(S) Gain(S,A)=E(S)EA(S)
      ID3中样本分布越均匀,它的信息熵就越大,所以其原则就是样本熵越小越好,也就是信息增益越大越好。

  3. 算法实例分析

outlooktemhumwindyplay
overcasthothighnotno
overcasthothighveryno
overcasthothighmediumno
sunnyhothighnotyes
sunnyhothighmediumyes
rainmildhighnotno
rainmildhighmediumno
rainhotnormalnotyes
raincoolnormalmediumno
rainhotnormalveryno
sunnycoolnormalveryyes
sunnycoolnormalmediumyes
overcastmildhighnotno
overcastmildhighmediumno
overcastcoolnormalnotyes
overcastcoolnormalmediumyes
rainmildnormalnotno
rainmildnormalmediumno
overcastmildnormalmediumyes
overcasthotnormalveryyes
sunnymildhighveryyes
sunnymildhighmediumyes
sunnyhotnormalnotyes
rainmildhighveryno

在上面的样本中,属于 y e s {yes} yes的结果有12个, n o {no} no有12个,于是根据上面的公式算出来训练集的熵为:
E ( S ) = − 12 24 log ⁡ 2 12 24 − 12 24 log ⁡ 2 12 24 = 1 E(S) = - \frac{12}{{24}}{\log _2}\frac{12}{{24}} - \frac{12}{{24}}{\log _2}\frac{12}{{24}} = 1 E(S)=2412log224122412log22412=1
下面对属性outlook 、tem 、hum 、windy 计算对应的信息增益。

在这里插入图片描述
outlook将S划成三个部分:sunny、rain、overcast,如果用 S v {S_v} Sv表示属性为 v {v} v的样本集,就有 ∣ S s u n n y ∣ = 7 |{S_{sunny}}| = 7 Ssunny=7 ∣ S o v e r c a s t ∣ = 9 |{S_{overcast}}| = 9 Sovercast=9 ∣ S r a i n ∣ = 8 |{S_{rain}}| = 8 Srain=8,而在 S s u n n y {S_{sunny}} Ssunny中,类 y e s {yes} yes的样本有7个,类 n o {no} no的样本有0个, S o v e r c a s t {S_{overcast}} Sovercast中,类 y e s {yes} yes的样本有4个,类 n o {no} no的样本有5个, S r a i n {S_{rain}} Srain中,类 y e s {yes} yes的样本有1个,类 n o {no} no的样本有7个,于是算出outlook的条件熵为:

E ( S , o u t l o o k ) = 7 24 ( − 7 7 log ⁡ 2 7 7 − 0 ) + 9 24 ( − 4 9 log ⁡ 2 4 9 − 5 9 log ⁡ 2 5 9 ) + 8 24 ( − 1 8 log ⁡ 2 1 8 − 7 8 log ⁡ 2 7 8 ) = 0.5528 E(S,outlook) = \frac{7}{{24}}( - \frac{7}{7}{\log _2}\frac{7}{7} - 0) + \frac{9}{{24}}( - \frac{4}{9}{\log _2}\frac{4}{9} - \frac{5}{9}{\log _2}\frac{5}{9}) + \frac{8}{{24}}( - \frac{1}{8}{\log _2}\frac{1}{8} - \frac{7}{8}{\log _2}\frac{7}{8}) = 0.5528 E(S,outlook)=247(77log2770)+249(94log29495log295)+248(81log28187log287)=0.5528
G a i n ( S , o u t l o o k ) = 1 − 0.5528 = 0.4472 Gain(S,outlook) = 1 - 0.5528= 0.4472 Gain(S,outlook)=10.5528=0.4472

同理:
E ( S , t e m ) = 0.8893 E(S,tem) =0.8893 E(S,tem)=0.8893
G a i n ( S , t e m ) = 0.1107 Gain(S,tem) = 0.1107 Gain(S,tem)=0.1107

E ( S , h u m ) = 0.9183 E(S,hum) =0.9183 E(S,hum)=0.9183
G a i n ( S , h u m ) = 0.0817 Gain(S,hum) = 0.0817 Gain(S,hum)=0.0817

E ( S , w i n d y ) = 1 E(S,windy) =1 E(S,windy)=1
G a i n ( S , w i n d y ) = 0 Gain(S,windy) = 0 Gain(S,windy)=0
从上面可以看出outlook的信息增益最大,所以选择outlook作为根节点的测试属性,windy的信息增益为0,不能做出任何分类信息,产生第一次决策树,然后对每个叶节点再次利用上面的过程,生成最终的决策树。

  1. 代码分析:
      了解了那么多理论,我们将上面根据天气打球的情况使用代码实现 (ID3)。
  • 收集数据
      利用 createDataSet() 函数输入数据,这里数据比较少,所以就不单独写个文件存放数据了。
def createDataSet():#outlook: 0 rain   1 overcast   2 sunny#tem:     0 cool   1 mild       2 hot#hum:     0 normal 1 high#windy    0 not    1 medium     2 very dataSet = [[1, 2, 1, 0, 'no'],[1, 2, 1, 2, 'no'],[1, 2, 1, 1, 'no'],[2, 2, 1, 0, 'yes'],[2, 2, 1, 1, 'yes'],[0, 1, 1, 0, 'no'],[0, 1, 1, 1, 'no'],[0, 2, 0, 0, 'yes'],[0, 0, 0, 1, 'no'],[0, 2, 0, 2, 'no'],[2, 0, 0, 2, 'yes'],[2, 0, 0, 1, 'yes'],[1, 1, 1, 0, 'no'],[1, 1, 1, 1, 'no'],[1, 0, 0, 0, 'yes'],[1, 0, 0, 1, 'yes'],[0, 1, 0, 0, 'no'],[0, 1, 0, 1, 'no'],[1, 1, 0, 1, 'yes'],[1, 2, 0, 2, 'yes'],[2, 1, 1, 2, 'yes'],[2, 1, 1, 1, 'yes'],[2, 2, 0, 0, 'yes'],[0, 1, 1, 2, 'no'],]return dataSet
  • 分析数据
      计算数据集的香农熵的函数
def calcShannonEnt(dataSet):numEntries = len(dataSet)	#获取数据的数目labelCounts = {}for featVec in dataSet:currentLable = featVec[-1] 	#取得最后一列数据,做为标签if currentLable not in labelCounts.keys(): 	#获取不同标签的数目labelCounts[currentLable] = 0labelCounts[currentLable] += 1#计算熵Ent = 0.0for key in labelCounts:prob = float(labelCounts[key]) / numEntriesEnt -= prob * log(prob, 2)#print ("信息熵: ", Ent)return Ent

  按照给定特征划分数据集

def splitDataSet(dataSet, axis, value):retDataSet = []  for featVec in dataSet:if featVec[axis] == value:      #每行中第axis个元素和value相等(去除第axis个数据)reducedFeatVec = featVec[:axis]reducedFeatVec.extend(featVec[axis+1:])  retDataSet.append(reducedFeatVec)return retDataSet  	#返回分类后的新矩阵

  选择最好的数据集划分方式

#根据香农熵,选择最优的划分方式    #根据某一属性划分后,类标签香农熵越低,效果越好
def chooseBestFeatureToSplit(dataSet):baseEntropy = calcShannonEnt(dataSet)   #计算数据集的香农熵numFeatures = len(dataSet[0]) - 1bestInfoGain = 0.0  			#最大信息增益bestFeature = 0    			#最优特征for i in range(0, numFeatures):featList = [example[i] for example in dataSet]  #所有子列表(每行)的第i个元素,组成一个新的列表uniqueVals = set(featList)newEntorpy = 0.0for value in uniqueVals:    #数据集根据第i个属性进行划分,计算划分后数据集的香农熵subDataSet = splitDataSet(dataSet, i, value)prob = len(subDataSet)/float(len(dataSet))newEntorpy += prob*calcShannonEnt(subDataSet)infoGain = baseEntropy-newEntorpy   #划分后的数据集,香农熵越小越好,即信息增益越大越好if(infoGain > bestInfoGain):bestInfoGain = infoGainbestFeature = ireturn bestFeature
  • 训练算法
#如果数据集已经处理了所有属性,但叶子结点中类标签依然不是唯一的,此时需要决定如何定义该叶子结点。这种情况下,采用多数表决方法,对该叶子结点进行分类
def majorityCnt(classList): classCount = {}for vote in classList:if vote not in classCount.keys():classCount[vote] = 0classCount[vote] += 1sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]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)bestFeat = chooseBestFeatureToSplit(dataSet)    #根据香农熵,选择最优的划分方式bestFeatLabel = labels[bestFeat]    #记录该属性标签myTree = {bestFeatLabel:{}} #树del(labels[bestFeat])   #在属性标签中删除该属性#根据最优属性构建树featValues = [example[bestFeat] for example in dataSet]uniqueVals = set(featValues)for value in uniqueVals:subLabels = labels[:]subDataSet = splitDataSet(dataSet, bestFeat, value)myTree[bestFeatLabel][value] = createTree(subDataSet, subLabels)print ("myTree:", myTree)return myTree
  • 分类
#测试算法:使用决策树,对待分类样本进行分类
def classify(inputTree, featLabels, testVec):   #传入参数:决策树,属性标签,待分类样本firstStr = list(inputTree.keys())[0]  #树根代表的属性secondDict = inputTree[firstStr]featIndex = featLabels.index(firstStr)  #树根代表的属性,所在属性标签中的位置,即第几个属性for key in secondDict.keys():if testVec[featIndex] == key:if type(secondDict[key]).__name__ == 'dict':classLabel = classify(secondDict[key], featLabels, testVec)else:classLabel = secondDict[key]return classLabel
  • 测试
if __name__ == '__main__':dataSet = createDataSet()labels = ['outlook', 'tem', 'hum', 'windy']labelsForCreateTree = labels[:]Tree = createTree(dataSet, labelsForCreateTree )testvec = [2, 2, 1, 0]print (classify(Tree, labels, testvec))

在这里插入图片描述

  最终产生的决策树为:
在这里插入图片描述 4. 算法实例分析
  决策树有分类和回归两种功能,分别调用下面的两个库函数,如下所示:

	from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifier  # 分类from sklearn.tree import DecisionTreeRegressor  # 回归iris = datasets.load_iris()  # 加载iris数据集X = iris.datay = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)clf = DecisionTreeClassifier()clf.fit(X_train, y_train)ans = clf.predict(X_test)# 计算准确率cnt = 0for i in range(len(y_test)):if ans[i] - y_test[i] < 1e-1:cnt += 1print("准确率: ", (cnt * 100.0 / len(y_test)),"%")

http://chatgpt.dhexx.cn/article/8UQ0xPuZ.shtml

相关文章

什么是决策树算法

1.1、什么是决策树 咱们直接切入正题。所谓决策树&#xff0c;顾名思义&#xff0c;是一种树&#xff0c;一种依托于策略抉择而建立起来的树。 机器学习中&#xff0c;决策树是一个预测模型&#xff1b;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象…

【机器学习】决策树算法解读

【机器学习】决策树算法解读 文章目录 【机器学习】决策树算法解读1. 介绍1.1 优缺点1.2 结构1.3 学习过程1.4 决策树与条件概率分布 2. 决策树学习过程2.1 训练策略2.2 特征选择2.2.1 信息增益和条件熵 2.3 决策树的生成2.3.1 ID32.3.2 C4.52.3.3 CART2.3.4 小结 2.4 决策树的…

详解决策树算法

决策树 1.1 决策树定义 何为决策树&#xff0c;顾名思义&#xff0c;就像树枝状的决策算法&#xff0c;通过各个节点的“决策”&#xff0c;实现对任务的精准分类或回归&#xff0c;决策树常用来处理分类问题&#xff0c;即使你以前没接触过决策树&#xff0c;你也可以通过下…

决策树算法及其实现

决策树算法及其实现 1 什么是决策树 决策树&#xff08;Decision Tree&#xff09;是一种基本的分类与回归方法&#xff0c;本文主要讨论分类决策树。决策树模型呈树形结构&#xff0c;在分类问题中&#xff0c;表示基于特征对数据进行分类的过程。它可以认为是if-then规则的…

决策树算法 (CART分类树)

决策树算法 (ID3&#xff0c;C4.5) CART回归树 决策树的后剪枝 在决策树算法原理(ID3&#xff0c;C4.5)中&#xff0c;提到C4.5的不足&#xff0c;比如模型是用较为复杂的熵来度量&#xff0c;使用了相对较为复杂的多叉树&#xff0c;只能处理分类不能处理回归。对这些问题&a…

决策树算法总结

决策树算法常用于解决分类问题&#xff0c;该方法的优势在于其数据形式非常容易理解。 概述 决策树&#xff08;decision tree&#xff09;是一类常见的机器学习方法&#xff0e;以二分类任务为例&#xff0c;我们希望从给定训练数据集学得一个模型用以对新示例进行分类&…

决策树算法原理简介

1,决策树概念简介 不同的算法模型适合于不同类型的数据。 首先&#xff0c;在了解树模型之前&#xff0c;自然想到树模型和线性模型有什么区别呢&#xff1f;其中最重要的是&#xff0c;树形模型是一个一个特征进行处理&#xff0c;之前线性模型是所有特征给予权重相加得到一个…

机器学习——决策树算法

文章目录 一、决策树介绍二、利用信息增益选择最优划分属性三、ID3代码实现1.jupyter下python实现2. 使用sklearn实现ID3 四、C4.5算法实现五、CART算法实现六、总结参考文献 一、决策树介绍 决策树是一种基于树结构来进行决策的分类算法&#xff0c;我们希望从给定的训练数据集…

机器学习算法:决策树算法

1.基本定义 决策树(Decision Tree)是一种基本的分类和回归算法。该算法模型呈树形结构&#xff0c;主要由结点和有向边组成。结点又分为两种类型&#xff1a;内部结点和叶子结点。内部结点表示在一个属性或特征上的测试&#xff0c;每一个结点分枝代表一个测试输出&#xff0c;…

决策树算法应用及结果解读

作者&#xff1a;林骥 来源&#xff1a;林骥 引言 本文是我写的人工智能系列的第 8 篇文章&#xff0c;文末有前面 7 篇文章的链接&#xff0c;推荐你阅读、分享和交流。 1. 决策树算法简介 决策树是一种应用非常广泛的算法&#xff0c;比如语音识别、人脸识别、医疗诊断、模式…

机器学习算法(3)之决策树算法

前言&#xff1a;首先&#xff0c;在了解树模型之前&#xff0c;自然想到树模型和线性模型有什么区别呢&#xff1f;其中最重要的是&#xff0c;树形模型是一个一个特征进行处理&#xff0c;之前线性模型是所有特征给予权重相加得到一个新的值。决策树与逻辑回归的分类区别也在…

机器学习基础 决策树算法

文章目录 一、决策树算法简介二、决策树分类原理1. 熵1.1 概念1.2 案例 2. 决策树的划分依据一----信息增益2.1 概念2.2 案例 3. 决策树的划分依据二----信息增益率3.1 概念3.2 案例3.2.1 案例一3.2.2 案例二 3.3 为什么使用C4.5要好 4. 决策树的划分依据三 ----基尼值和基尼指…

【机器学习常见算法】决策树算法(含示例代码)

决策树(Decision Tree)是一种非参数的有监督学习方法&#xff0c;它能够从一系列有特征和标签的数据中总结出决策规 则&#xff0c;并用树状图的结构来呈现这些规则&#xff0c;以解决分类和回归问题。决策树算法容易理解&#xff0c;适用各种数据&#xff0c;在解决各 种问题时…

【决策树】深入浅出讲解决策树算法(原理、构建)

本文收录于《深入浅出讲解自然语言处理》专栏&#xff0c;此专栏聚焦于自然语言处理领域的各大经典算法&#xff0c;将持续更新&#xff0c;欢迎大家订阅&#xff01;​个人主页&#xff1a;有梦想的程序星空​个人介绍&#xff1a;小编是人工智能领域硕士&#xff0c;全栈工程…

协方差矩阵推导

协方差定义&#xff1a;&#xff0c;其中分别为向量的均值。 设已知矩阵 则 样本自由度m-1&#xff0c;设&#xff0c;&#xff0c;则

协方差矩阵到底有什么用?

我们知道&#xff0c;线性代数&#xff0c;可以完成空间上的线性变换——旋转&#xff0c;缩放。对于协方差&#xff0c;我们隐约可以想到&#xff0c;它能解释一个随机变量&#xff0c;它在各个维度的变化程度。但是&#xff0c;这种认识其实还是处于比较浅层次的。数学嘛&…

22协方差矩阵 matlab,协方差协方差矩阵【matlab实例】

[今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~ 协方差矩阵 协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计…

透彻理解协方差矩阵

2018-12-30 11:27:05 协方差及协方差矩阵有着特别广泛的应用&#xff0c;在多元高斯分布、高斯过程、卡尔曼滤波等算法中多有用到&#xff0c;本文从协方差、协方差矩阵讲起&#xff0c;并重点讲解协方差矩阵在高斯分布中的用法及意义&#xff0c;也是讲解高斯过程、贝叶斯优化…

使用matlab编写协方差矩阵计算矩阵

Dr.Can在他的教学视频&#xff08;【卡尔曼滤波器】2_数学基础_数据融合_协方差矩阵_状态空间方程_观测器问题&#xff09;中使用了足球运动员的数据介绍了协方差矩阵的概念和计算方法&#xff0c;原始数据如下图&#xff0c;那么协方差矩阵到底是什么&#xff1f;他有什么用&a…

PCA与协方差矩阵

一、协方差矩阵 一个维度上方差的定义&#xff1a; 协方差的定义&#xff1a; &#xff08;a&#xff09; 协方差就是计算了两个维度之间的相关性&#xff0c;即这个样本的这两个维度之间有没有关系。 协方差为0&#xff0c;证明这两个维度之间没有关系&#xff0c;协方差为正&…