机器学习--决策树(ID3)算法及案例
决策树例题经典案例

决策树例题经典案例1. 引言决策树是一种常见且有用的机器学习算法,在许多实际问题中都得到了广泛应用。
它是一种基于树结构的分类模型,通过对数据的特征进行判断,构建出一个树状的决策过程。
本文将通过一个经典的案例,来介绍决策树的基本原理和应用。
2. 案例背景假设我们是一家电子商务平台的运营团队,我们最近推出了一种新产品,并希望根据用户的特征来预测他们是否会购买这个产品。
为了解决这个问题,我们决定使用决策树算法来构建一个分类模型。
3. 数据集介绍我们已经收集了一些用户的相关数据,包括年龄、性别、收入和是否购买产品。
数据集如下:用户ID年龄性别收入是否购买产品125男5000元以上是230女3000-5000元是335男3000-5000元否440男3000-5000元否535男3000-5000元是645女5000元以上是750男2000-3000元否860男3000-5000元是4. 构建决策树模型在构建决策树模型之前,我们需要对数据进行预处理。
首先,将年龄、性别和收入这些特征进行编码转换,方便计算机处理。
然后,将数据集分为训练集和测试集,训练集用于构建模型,测试集用于评估模型的性能。
接下来,我们使用Python中的scikit-learn库来构建决策树模型。
首先,导入相关的库和模块:from sklearn import treeimport pandas as pd然后,读取数据并进行特征编码:data = pd.read_csv('data.csv')# 特征编码data['年龄'] = data['年龄'].map({'25': 0, '30': 1, '35': 2, '40': 3, '45': 4, '50': 5, '60': 6}) data['性别'] = data['性别'].map({'男': 0, '女': 1}) data['收入'] = data['收入'].map({'5000元以上': 0, '3000-5000元': 1, '2000-3000元': 2})# 提取特征和标签X = data[['年龄', '性别', '收入']]y = data['是否购买产品']接着,创建决策树模型并训练:# 创建决策树模型model = tree.DecisionTreeClassifier()# 训练模型model.fit(X, y)最后,使用测试集评估模型的性能:```python # 读取测试集数据 test_data =pd.read_csv(’test_data.csv’)特征编码test_data[‘年龄’] = test_data[‘年龄’].map({’25’: 0, ‘30’: 1, ‘35’: 2, ‘40’: 3, ‘45’: 4, ‘50’: 5, ‘60’: 6}) test_data[‘性别’] = test_data[‘性别’].map({’男’: 0, ‘女’: 1}) test_data[‘收入’] = test_data[‘收入’].map({’5000元以上’: 0, ‘3000-5000元’: 1, ‘2000-3000元’: 2})提取特征和标签X_test = test_data[[‘年龄’, ‘性别’, ‘收入’]] y_test = test_data[‘是否购买产品’]预测结果y_pred = model.predict(X_test)计算准确率accuracy = (y_pred == y_test).mean() print(。
机器学习--决策树算法(ID3C4.5)

机器学习--决策树算法(ID3C4.5)在⽣活中,“树”这⼀模型有很⼴泛的应⽤,事实证明,它在机器学习分类和回归领域也有着深刻⽽⼴泛的影响。
在决策分析中,决策树可以明确直观的展现出决策结果和决策过程。
如名所⽰,它使⽤树状决策模型。
它不仅仅是在数据挖掘中⽤户获取特定⽬标解的策略,同时也被⼴泛的应⽤于机器学习。
如何使⽤树来表⽰算法为此,我们考虑使⽤泰坦尼克号数据集的⽰例,以预测乘客是否会⽣存。
下⾯的模型使⽤数据集中的3个特征/属性/列,即性别,年龄和SIBSP(配偶或⼉童的数量)。
这是⼀棵体现了⼈性光辉的决策树。
树的形状是⼀棵上下颠倒的决策树,叶⼦节点在下,根节点在上。
在图像中,⿊⾊中的粗体⽂本表⽰条件/内部节点,基于树分成分⽀/边缘。
不再分裂的分⽀结束是决策/叶⼦,在这种情况下,乘客是否被死亡或幸存,分别表⽰为红⾊和绿⾊⽂本。
虽然,⼀个真实的数据集将有很多功能,这只是⼀个更⼤的树中的部分分⽀,但你不能忽略这种算法的简单性。
该特征重要性是明确的,可以轻易查看决策关系。
该⽅法更常见于来⾃数据的学习决策树,并且在树上被称为分类树,因为⽬标是将乘客分类为幸存或死亡,上⾯所展⽰的决策树就是分类树。
回归树以相同的⽅式表⽰,例如⽤于预测房⼦价格的连续价值。
通常,决策树算法被称为CART或分类和回归树。
那么,算法⽣成的背后发⽣了什么呢?如何⽣成⼀个决策树取决于选择什么特征和在何种情况下进⾏分裂,以及在什么时候停⽌。
因为⼀棵树通常是随意⽣长的,你需要修剪它,让它看起来漂亮(研究如何⽣成决策树)。
ID3算法ID3算法⽣成决策树ID3算法(Iterative Dichotomiser 3)是决策树⽣成算法的⼀种,基于奥卡姆剃⼑原理(简约原则) 1。
是Ross Quinlan发明的⼀种决策树算法,这个算法的基础就是上⾯提到的奥卡姆剃⼑原理,越是⼩型的决策树越优于⼤的决策树,尽管如此,也不总是⽣成最⼩的树型结构,⽽是⼀个启发式算法。
id3算法对天气-打球关系的决策树

ID3算法是一种用于构建决策树的经典机器学习算法,它可以根据给定的数据集,自动构建出一个决策树模型,用于对未知数据进行分类。
在实际应用中,ID3算法被广泛应用于各种领域,包括天气预测和决策制定。
本文将以天气和是否适合打球这一主题为例,具体介绍ID3算法对于天气-打球关系的决策树。
1. 背景介绍天气对于人们的日常生活有着重要的影响,尤其是对于室外活动,比如打球。
在实际生活中,人们往往会根据当天的天气情况来决定是否适合进行打球活动。
而要根据天气来进行决策,就需要建立一个天气-打球的决策模型。
而ID3算法正是用来构建这样的决策模型的利器。
2. 数据采集为了构建天气-打球的决策树模型,首先需要收集一定量的天气相关数据和打球相关数据。
可以记录每天的天气情况(如晴天、阴天、下雨)、温度、湿度等天气指标,以及当天是否适合进行打球活动(是/否)。
通过收集大量的这样的数据,就可以构建出一个合适的数据集。
3. 分析数据在收集到足够的数据后,就可以开始分析这些数据,寻找天气与打球之间的关系。
ID3算法的核心思想是选择最佳的属性来进行划分,以便对数据进行分类。
在本例中,可以将天气指标(如晴天、阴天、下雨)作为属性,将打球活动(是/否)作为分类结果,然后根据ID3算法来选择最佳的属性进行数据划分,从而构建出决策树模型。
4. 构建决策树在进行数据分析后,就可以利用ID3算法来构建天气-打球的决策树。
ID3算法通过计算信息增益来确定最佳的属性,然后进行递归地对数据进行划分,直到构建出完整的决策树模型。
在这个过程中,ID3算法会根据不同的属性值来确定最佳的决策点,从而使得对于未知天气情况的打球决策变得更加准确。
5. 评估和优化构建出决策树模型后,还需要对模型进行评估和优化。
可以利用交叉验证等方法来检验模型的准确性,并根据验证结果对模型进行调整和优化。
这一步骤是非常重要的,可以帮助进一步提高决策树模型的预测能力。
6. 应用和推广构建出决策树模型后,可以将其应用到实际的天气预测和打球决策中。
id3决策树算法python程序

id3决策树算法python程序关于ID3决策树算法的Python程序。
第一步:了解ID3决策树算法ID3决策树算法是一种常用的机器学习算法,用于解决分类问题。
它基于信息论的概念,通过选择最佳的特征来构建决策树模型。
ID3算法的核心是计算信息增益,即通过选择最能区分不同类别的特征来构建决策树。
第二步:导入需要的Python库和数据集在编写ID3决策树算法的Python程序之前,我们需要导入一些必要的Python库和准备好相关的数据集。
在本例中,我们将使用pandas库来处理数据集,并使用sklearn库的train_test_split函数来将数据集拆分为训练集和测试集。
pythonimport pandas as pdfrom sklearn.model_selection import train_test_split# 读取数据集data = pd.read_csv('dataset.csv')# 将数据集拆分为特征和标签X = data.drop('Class', axis=1)y = data['Class']# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) 第三步:实现ID3决策树算法的Python函数在此步骤中,我们将编写一个名为ID3DecisionTree的Python函数来实现ID3决策树算法。
该函数将递归地构建决策树,直到满足停止条件。
在每个递归步骤中,它将计算信息增益,并选择最佳特征作为当前节点的分裂依据。
pythonfrom math import log2from collections import Counterclass ID3DecisionTree:def __init__(self):self.tree = {}def calc_entropy(self, labels):label_counts = Counter(labels)entropy = 0for count in label_counts.values():p = count / len(labels)entropy -= p * log2(p)return entropydef calc_info_gain(self, data, labels, feature):feature_values = data[feature].unique()feature_entropy = 0for value in feature_values:subset_labels = labels[data[feature] == value]feature_entropy += len(subset_labels) / len(labels) * self.calc_entropy(subset_labels)return self.calc_entropy(labels) - feature_entropydef choose_best_feature(self, data, labels):best_info_gain = 0best_feature = Nonefor feature in data.columns:info_gain = self.calc_info_gain(data, labels, feature)if info_gain > best_info_gain:best_info_gain = info_gainbest_feature = featurereturn best_featuredef build_tree(self, data, labels):if len(set(labels)) == 1:return labels[0]elif len(data.columns) == 0:return Counter(labels).most_common(1)[0][0] else:best_feature = self.choose_best_feature(data, labels)sub_data = {}for value in data[best_feature].unique():subset = data[data[best_feature] == value].drop(best_feature, axis=1)sub_labels = labels[data[best_feature] == value]sub_data[value] = (subset, sub_labels)tree = {best_feature: {}}for value, (subset, sub_labels) in sub_data.items():tree[best_feature][value] = self.build_tree(subset, sub_labels)return treedef fit(self, data, labels):self.tree = self.build_tree(data, labels)def predict(self, data):predictions = []for _, row in data.iterrows():node = self.treewhile isinstance(node, dict):feature = list(node.keys())[0]value = row[feature]node = node[feature][value]predictions.append(node)return predictions第四步:使用ID3决策树模型进行训练和预测最后一步是使用我们实现的ID3DecisionTree类进行训练和预测。
仿照例题,使用id3算法生成决策树

标题:使用ID3算法生成决策树一、概述在机器学习领域,决策树是一种常见的分类和回归算法。
它基于一系列属性对数据进行划分,最终生成一棵树状图来表示数据的分类规则。
在本文中,我们将介绍ID3算法,一种经典的决策树生成算法,并演示如何使用ID3算法生成决策树。
二、ID3算法概述ID3算法是一种基于信息论的决策树生成算法,其全称为Iterative Dichotomiser 3。
它由Ross Quinlan于1986年提出,是C4.5算法的前身。
ID3算法的核心思想是在每个节点选择最佳的属性进行划分,使得各个子节点的纯度提高,从而最终生成一棵有效的决策树。
ID3算法的主要步骤包括计算信息增益、选择最佳属性、递归划分数据集等。
在这一过程中,算法会根据属性的信息增益来确定最佳的划分属性,直到满足停止条件为止。
三、使用ID3算法生成决策树的步骤使用ID3算法生成决策树的步骤如下:1. 收集数据集:需要收集一个包含多个样本的数据集,每个样本包含多个属性和一个类别标签。
2. 计算信息增益:对每个属性计算信息增益,信息增益越大表示该属性对分类的贡献越大。
3. 选择最佳属性:选择信息增益最大的属性作为当前节点的划分属性。
4. 划分数据集:根据选择的属性值将数据集划分成若干子集,每个子集对应属性的一个取值。
5. 递归生成子节点:对每个子集递归调用ID3算法,生成子节点,直到满足停止条件。
6. 生成决策树:将所有节点连接起来,生成一棵完整的决策树。
四、使用ID3算法生成决策树的示例为了更好地理解ID3算法的生成过程,我们以一个简单的示例来说明。
假设有一个包含天气、温度和湿度三个属性的数据集,我们希望使用ID3算法生成一个决策树来预测是否适合外出活动。
我们需要计算每个属性的信息增益。
然后选择信息增益最大的属性进行划分,将数据集划分成若干子集。
接着递归调用ID3算法,直到满足停止条件为止。
经过计算和递归划分,最终我们得到一棵决策树,可以根据天气、温度和湿度来预测是否适合外出活动。
(完整版)ID3算法

(2)用信息增益作为属性选择量存在一个假设, 即训 练例子集中的正, 反例的比例应与实际问题领域里正、 反例比例相同。一般情况不能保证相同, 这样计算训练 集的信息增益就有偏差。
(3)ID3在建树时, 每个节点仅含一个属性, 是一种单 变元的算法, 属性间的相关性强调不够。虽然它将多个 属性用一棵树连在一起, 但联系还是松散的。
该算法的计算时间是例子个数、属性个数、结点个数 之积的线性函数。对有4761个关于苯的质谱例子作了试验。 其中正例2361个, 反例2400个, 每个例子由500个属性描述, 每个属性取值数目为6, 得到一棵1514个结点的决策树。对 正、反例各100个测试例作了测试, 正例判对82个, 反例判对 80个, 总预测正确率81%, 效果是令人满意的。
J.R.Quinlan的工作主要是引进了信息论中的信息增益, 他将其称为信息增益(information gain), 作为属性 判别能力的度量, 设计了构造决策树的递归算法。
下面通过一个例子, 说明ID3算法的基本思想。
5
一、ID3基本思想
对于气候分类问题,属性为: 天气(A1) 取值为: 晴,多云,雨 气温(A2) 取值为: 冷 ,适中,热 湿度(A3) 取值为: 高 ,正常 风 (A4) 取值为: 有风, 无风
16
Gain(S, A1) Entropy(S) v晴,多云,雨
Sv S
Entropy(Sv )
Entropy(S
)
5 14
Entropy(S晴
)
4 14
Entropy(S多云
)
5 14
Entropy(S雨
)
而
Entropy(S晴 )
2 5
log
决策树id3算法例题

决策树id3算法例题决策树ID3算法是一种常用的分类算法,用于根据已知的一组特征和标签数据,构建一个决策树模型来进行分类预测。
下面我将以一个示例来介绍决策树ID3算法的基本步骤和过程。
假设我们想要构建一个决策树模型来帮助我们判断一个人是否会购买一款新的智能手机。
我们已经收集了一些关于个体的特征数据和对应的购买结果数据,包括性别、年龄、收入和是否购买。
首先,我们需要计算每个特征对于分类结果的信息增益。
信息增益是指通过使用某个特征来对数据进行分类,所能获得的关于数据的新的信息量。
计算信息增益的公式如下:信息增益 = 熵(D) - ∑(Dv/D) * 熵(Dv)其中,熵(D)表示数据集D的混乱程度,熵的计算公式为:熵(D) = - ∑(pi * log2(pi))Dv表示特征A的某个取值,D表示数据集D的标签集合,pi表示标签i在数据集D中的比例。
我们首先计算整个数据集的熵D,然后计算每个特征的条件熵,最后将它们相加得到信息增益。
选择信息增益最大的特征作为当前节点的划分特征。
接下来,我们根据选择的特征将数据集划分成不同的子集。
每个子集都对应一个特征值的取值,例如性别特征可能有男和女两个取值。
我们对每个子集重复上述过程,以递归的方式构建子树。
在每个子树中,我们需要选择一个特征进行划分。
如果所有的特征都已经使用完毕,或者剩余的数据集已经完全属于同一类别,那么我们停止划分,将当前节点标记为叶节点,并将最常见的类别作为该节点的预测结果。
否则,我们选择信息增益最大的特征作为当前节点的划分特征,并继续递归构建子树。
最终,我们得到了一个完整的决策树模型。
我们可以使用该模型来对新的个体进行分类预测。
从根节点开始,根据个体的特征值选择相应的子节点,直到到达叶节点,将叶节点的预测结果作为最终的分类结果。
在本示例中,决策树模型可能会根据最佳特征先根据性别划分,接着根据年龄划分,最后根据收入划分。
我们可以根据决策树模型将一个新的个体划分到某个叶节点,并预测其是否会购买手机。
id3决策树算法例题

ID3决策树算法例题简介决策树是一种常见的机器学习算法,用于解决分类和回归问题。
其中,ID3(Iterative Dichotomiser 3)决策树算法是最早被提出的决策树算法之一。
本文将以一个例题为例,深入探讨ID3决策树算法的原理和应用。
例题描述假设我们要根据以下特征来判断一个水果是苹果还是橘子: 1. 颜色:红、橙 2. 直径:大、中等、小 3. 纹理:平滑、凹凸我们已经收集到了一些水果的样本数据,如下所示:编号颜色直径纹理类别1 红大平滑苹果2 红大凹凸苹果3 橙大平滑橘子4 橙小平滑橘子5 红中等平滑苹果我们希望构建一个决策树模型,通过输入颜色、直径和纹理这3个特征,能够预测水果的类别。
ID3决策树算法原理ID3决策树算法的核心思想是选择每次划分时信息增益最大的特征作为决策节点。
它采用自顶向下的贪心策略,递归地构建决策树。
下面详细介绍ID3算法的原理。
1. 计算信息熵首先,我们需要计算每个特征的信息熵,以此来衡量特征对分类结果的纯度影响。
信息熵的计算公式如下:H (D )=−∑p i Ni=1log 2p i其中,H (D )表示数据集D 的信息熵,N 表示类别的个数,p i 表示类别i 在数据集D 中的比例。
2. 计算信息增益接下来,对于每个特征A ,我们需要计算其信息增益Gain (D,A )。
信息增益是指特征A 对于数据集D 的纯度提升程度,计算公式如下:Gain (D,A )=H (D )−∑|D v ||D |Vv=1H (D v ) 其中,V 表示特征A 的取值个数,D v 表示特征A 取值为v 的样本子集。
3. 选择最佳划分特征根据计算得到的信息增益,选择信息增益最大的特征作为决策节点。
4. 递归构建决策树将选择的特征作为决策节点,以该特征的不同取值作为分支,递归地构建决策树。
计算步骤根据上面的原理,我们来逐步计算示例中的决策树。
1. 计算初始数据集的信息熵H (D )根据表格中的数据,我们可以计算出初始数据集的信息熵H (D ),其中苹果出现的概率为35,橘子出现的概率为25。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器学习--决策树(ID3)算法及案例1基本原理决策树是一个预测模型。
它代表的是对象属性与对象值之间的一种映射关系。
树中每个节点表示某个对象,每个分支路径代表某个可能的属性值,每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
一般情况下,决策树由决策结点、分支路径和叶结点组成。
在选择哪个属性作为结点的时候,采用信息论原理,计算信息增益,获得最大信息增益的属性就是最好的选择。
信息增益是指原有数据集的熵减去按某个属性分类后数据集的熵所得的差值。
然后采用递归的原则处理数据集,并得到了我们需要的决策树。
2算法流程检测数据集中的每个子项是否属于同一分类:If 是,则返回类别标签;Else计算信息增益,寻找划分数据集的最好特征划分数据数据集创建分支节点(叶结点或决策结点)for 每个划分的子集递归调用,并增加返回结果到分支节点中return 分支结点算法的基本思想可以概括为:1)树以代表训练样本的根结点开始。
2)如果样本都在同一个类.则该结点成为树叶,并记录该类。
3)否则,算法选择最有分类能力的属性作为决策树的当前结点.4 )根据当前决策结点属性取值的不同,将训练样本根据该属性的值分为若干子集,每个取值形成一个分枝,有几个取值形成几个分枝。
匀针对上一步得到的一个子集,重复进行先前步骤,递归形成每个划分样本上的决策树。
一旦一个属性只出现在一个结点上,就不必在该结点的任何后代考虑它,直接标记类别。
5)递归划分步骤仅当下列条件之一成立时停止:①给定结点的所有样本属于同一类。
②没有剩余属性可以用来进一步划分样本.在这种情况下.使用多数表决,将给定的结点转换成树叶,并以样本中元组个数最多的类别作为类别标记,同时也可以存放该结点样本的类别分布[这个主要可以用来剪枝]。
③如果某一分枝tc,没有满足该分支中已有分类的样本,则以样本的多数类生成叶子节点。
算法中2)步所指的最优分类能力的属性。
这个属性的选择是本算法种的关键点,分裂属性的选择直接关系到此算法的优劣。
一般来说可以用比较信息增益和信息增益率的方式来进行。
其中信息增益的概念又会牵扯出熵的概念。
熵的概念是香农在研究信息量方面的提出的。
它的计算公式是:Info(D)=-p1log(p1)/log(2.0)-p2log(p2)/log(2.0)-p3log(p3)/log(2.0)+...-pNlog(pN) /log(2.0) (其中N表示所有的不同类别)而信息增益为:Gain(A)=Info(D)-Info(Da) 其中Info(Da)数据集在属性A的情况下的信息量(熵)。
3算法的特点优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能会产生过度匹配问题适用数据范围:数值型和标称型。
4python代码实现1、创建初始数据集,用于测试#######################################功能:创建数据集#输入变量:空#输出变量:data_set, labels 数据集,标签######################################def create_data_set():data_set = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']] # 数据集最后一列表示叶结点,也称类别标签labels = ['no surfacing', 'flippers'] # 表示决策结点,也称特征标签return data_set, labels2、计算给定数据集的信息熵##############################功能:计算信息熵#输入变量:data_set 数据集#输出变量:shannon_ent 信息熵#############################def calc_shannon_ent(data_set):num_entries = len(data_set)label_counts = {}for feat_vec in data_set:current_label = feat_vec[-1]# get相当于一条if...else...语句# 如果参数current_label不在字典中则返回参数0,# 如果current_label在字典中则返回current_label对应的value值label_counts[current_label] = label_counts.get(current_label, 0) + 1 shannon_ent = 0.0for key in label_counts:prob = float(label_counts[key])/num_entriesshannon_ent -= prob*log(prob, 2)return shannon_ent3、按照给定特征划分数据集。
分类算法除了需要测量信息熵,还需要划分数据集,这就需要对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式。
##################################功能:划分数据集#输入变量:data_set, axis, value# 数据集,数据集的特征,特征的值#输出变量:ret_data_set, 划分后的数据集#################################def split_data_set(data_set, axis, value):ret_data_set = []for feat_vec in data_set:if feat_vec[axis] == value:# 把axis特征位置之前和之后的特征值切出来# 没有使用del函数的原因是,del会改变原始数据reduced_feat_vec = feat_vec[:axis]reduced_feat_vec.extend(feat_vec[axis+1:])ret_data_set.append(reduced_feat_vec)return ret_data_set4、遍历整个数据集,循环划分数据并计算信息熵,通过计算最大信息增益来找到最好的特征划分方式。
具体做法是,遍历当前特征中的所有唯一属性值,对每个特征划分一次数据集,然后计算数据集的新熵值,并对所有唯一特征值得到的熵求和。
最后用所求的和值与原始信息熵相减,计算寻找最大信息增益。
#######################################功能:选择最好的数据集划分方式#输入变量:data_set 待划分的数据集#输出变量:best_feature 计算得出最好的划分数据集的特征######################################def choose_best_feature_to_split(data_set):num_features = len(data_set[0]) - 1 # 最后一个是类别标签,所以特征属性长度为总长度减1base_entropy = calc_shannon_ent(data_set) # 计算数据集原始信息熵best_info_gain = 0.0best_feature = -1for i in xrange(num_features):# feat_vec[i]代表第i列的特征值,在for循环获取这一列的所有值feat_list = [feat_vec[i] for feat_vec in data_set]unique_vals = set(feat_list) # set函数得到的是一个无序不重复数据集new_entropy = 0.0# 计算每种划分方式的信息熵for value in unique_vals:sub_data_set = split_data_set(data_set, i, value)prob = len(sub_data_set)/float(len(data_set))new_entropy += prob*calc_shannon_ent(sub_data_set)info_gain = base_entropy - new_entropyif info_gain > best_info_gain:best_info_gain = info_gainbest_feature = ireturn best_feature5递归构建决策树工作原理:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。
第一次划分之后,数据将被向下传递到树分支的下一个节点,在这个节点上,我们可以再次划分数据。
因此我们可以采用递归的原则处理数据集。
递归结束条件是:第一、所有的类别标签(叶结点)完全相同。
第二、使用完了所有的特征,仍然不能将数据集划分成仅包含唯一类别的分组,则挑选出次数最多的类别作为返回值。
#######################################功能:多数表决分类#输入变量:class_list 所有数据的标签数组#输出变量:sorted_class_count[0][0] 出现次数最多的分类名称######################################def majority_vote_sort(class_list):class_count = {}for vote in class_list:class_count[vote] = class_count.get(vote, 0) + 1# items以列表方式返回字典中的键值对,iteritems以迭代器对象返回键值对,而键值对以元组方式存储,即这种方式[(), ()]# operator.itemgetter(0)获取对象的第0个域的值,即返回的是key值# operator.itemgetter(1)获取对象的第1个域的值,即返回的是value 值# operator.itemgetter定义了一个函数,通过该函数作用到对象上才能获取值# reverse=True是按降序排序sorted_class_count = sorted(class_count.iteritems(),key=operator.itemgetter(1), reverse=True)return sorted_class_count[0][0]#######################################功能:创建数#输入变量:data_set, labels 待分类数据集,标签#输出变量:my_tree 决策树######################################def create_tree(data_set, labels):class_list = [example[-1] for example in data_set]# 判断类别标签是否完全相同# count()是列表内置的方法,可以统计某个元素在列表中出现的次数if class_list.count(class_list[0]) == len(class_list):return class_list[0]# 遍历完所有特征时返回出现次数最多的if len(data_set[0]) == 1:return majority_vote_sort(class_list)best_feat = choose_best_feature_to_split(data_set)best_feat_label = labels[best_feat]my_tree = {best_feat_label: {}}del(labels[best_feat])# 得到列表包含的所有属性值feat_values = [example[best_feat] for example in data_set]unique_vals = set(feat_values)for value in unique_vals:sub_labels = labels[:] # :复制特征标签,为了保证循环调用函数create_tree()不改变原始的内容ret_data_set = split_data_set(data_set, best_feat, value)my_tree[best_feat_label][value] = create_tree(ret_data_set, sub_labels) return my_tree6测试代码def main():my_data, my_labels = create_data_set()#my_data[0][-1] = 'maybe'print 'my_data=', my_dataprint 'my_labels=', my_labelsshannon_ent = calc_shannon_ent(my_data)print 'shannon_ent=', shannon_entret_data_set = split_data_set(my_data, 1, 1) # 由第1个特征且特征值为1的数据集划分出来print 'ret_data_set=', ret_data_setbest_feature = choose_best_feature_to_split(my_data)print 'best_feature=', best_featuremy_tree = create_tree(my_data, my_labels)print 'my_tree=', my_treeif __name__ == '__main__':main()在进行案例分析前,先对决策树算法的分类函数进行测试。