一:定义

决策树是一种迭代算法,先从第一个根节点选择变量进行拆分,直到所有变量都已经用尽,或者在某节点只能对等拆分(拆分后的两类包含的数据量相等)时,停止迭代。在每一个节点,都选择最大化信息增益的变量进行拆分。

决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每一个分支代表一个测试的输出,每个叶子节点代表一种类别
比如下面这张图中内部节点是下雨、距离远;分支是从下雨节点出来的是、否,从距离远出来的是、否;叶子节点是地铁、步行。

二:决策树功能

决策树是一种预测模型,它代表的是对象属性与对象值之间的一种映射关系。比如:我们要预测一个大学生今天会干嘛(假设他平常的生活由聚会、学习、去酒吧、看电视等构成),我们可以这样分析:首先看他今天有没有聚会,有聚会的话他就去参加聚会,否则再看他有没有作业要交;如果没有作业要交的话,他就会选择去酒吧,如果作业很紧急的话,他就会选择学习,如果不是特别紧急的话,他就会选择在家;如果他选择懒惰在家的话,他就会选择看电视,否则的话他就会选择学习。这就是一个决策树的分析和产生过程,下面让我们来把这个决策树画出来。

三:决策树的优缺点

通过上面的分析以及决策树的构建,我们发现决策树非常容易理解和实现,具有很好的解释性。但是一个决策树往往会过拟合。为了解决这个问题,可以采用’事后剪枝法’。也就是说,为了防止决策树过于复杂,在构建好完整的树之后,在树的某个节点将树剪短。剪短的决策树往往具有更好的外推扩展能力。另外,如果要使用决策树来预测连续性变量,我们则需要将连续性变量离散化,具体采用何种方式离散化则需要根据数据集来定。最后一点是当类别增多的时候,错误可能就会增加的比较快。

四:特征选择

特征选择就是我们选择用哪个特征来划分空间,它对模型的好坏往往有着直接的影响。通常一个数据集中会包含许多的冗余信息,我们需要在其中寻找到那些对我们划分空间影响非常大的特征。那么如何判断应该选择哪个特征呢?
通常是这样的,如果选择某个特征对数据集进行划分之后,划分得到的子集的分类效果比选择其他任何一个特征的分类效果都好,那么就应该选择这个特征了。

五:熵

在信息论中,熵用来表示一个特征变量所包含的信息量,其定义如下:
H ( X ) = − P ( X = 1 ) l o g 2 ( P ( X = 1 ) ) − P ( X = 0 ) l o g 2 ( P ( X = 0 ) ) H(X)=-P(X=1)log_2(P(X=1))-P(X=0)log_2(P(X=0)) H(X)=−P(X=1)log2​(P(X=1))−P(X=0)log2​(P(X=0))
H(X)代表变量X的熵值,当P(X=0)=1或P(X=1)=1时,X的熵H(X)=0,当P(X=0)=P(X=1)=0.5时,X的熵最大。如下图所示:

六:信息增益

信息增益的定义如下,对于变量X,在给定一个变量值a的情况下,X熵值的减少量:
I G ( X , a ) = H ( X ) − H ( X ∣ a ) IG(X,a)=H(X)-H(X|a) IG(X,a)=H(X)−H(X∣a)
H(X|a)代表X给定属性的条件熵。假设a0是属性a的实际值,那么H(X|a=a0)表示在该属性值给定条件下X的条件熵。
H ( X ∣ a = a 0 ) = − p ( X = 1 ∣ a = a 0 ) l o g 2 ( p ( X = 1 ∣ a = a 0 ) ) − p ( X = 0 ∣ a = a 0 ) l o g 2 ( p ( X = 0 ∣ a = a 0 ) ) H(X|a=a0)=-p(X=1|a=a_0)log_2(p(X=1|a=a_0))-p(X=0|a=a_0)log_2(p(X=0|a=a_0)) H(X∣a=a0)=−p(X=1∣a=a0​)log2​(p(X=1∣a=a0​))−p(X=0∣a=a0​)log2​(p(X=0∣a=a0​))
假设a有n个属性值,那么H(X|a)的计算公式为:
H ( X ∣ a ) = ∑ i = 1 n p ( a = a i ) H ( X ∣ a = a i ) H(X|a)=\sum_{i=1}^n p(a=a_i)H(X|a=a_i) H(X∣a)=i=1∑n​p(a=ai​)H(X∣a=ai​)
通俗的说,X给定属性a的条件熵指的是在知道属性a的取值之后,X熵值的减少量。因为熵代表了不确定性,也就是说,在知道a之后,我们对变量X有了新的认识,对它的不确定性减少了。从属性a的角度来说,就是它为我们进一步了解X所带来的额外信息量。

有了熵和信息增益的概念之后,我们就知道可以顺利的搭建决策树了:在摆放变量时,总是先摆放信息增益量最大的变量,因为它能够为我们了解X带来最大的信息量。

七:代码实现

import math
import operatorclass DecisionTree:def __init__(self,trainData):self.trainData = trainData# 计算香农熵def calc_Shannon_Entropy(self,DataSet):''':param DataSet: 数据集:return: 当前数据集的香农熵'''# 标签集合,统计每个标签出现的次数label_count = {}for row in DataSet:feature = row[-1]if feature in label_count.keys():label_count[feature] += 1else:label_count[feature] = 1# 计算当前数据集的香农熵Shannon_Entropy = 0.0for key in label_count:p = float(label_count[key])/len(DataSet)Shannon_Entropy -= p * math.log(p,2)return Shannon_Entropy# 划分数据集def split_DataSet(self,DataSet,axis,value):''':param DataSet: 数据集:param axis: 划分的列号:param value: 划分的特征值:return: 划分后的子集'''split_dataset = []for row in DataSet:if row[axis] == value:reduce_data = row[:axis]reduce_data.extend(row[axis+1:])split_dataset.append(reduce_data)return split_dataset# 选择最优的划分方案def choose_best_feature_to_split(self,DataSet):''':param DataSet: 数据集:return: 和原数据集熵差最大的划分对应的特征列号'''# 特征个数feature_number = len(DataSet[0]) - 1# 原数据集的香农熵base_Entropy = self.calc_Shannon_Entropy(DataSet)# 暂存最大熵增量best_Shannon = 0# 最好的特征划分对应的列号best_feature_column = -1# 按列遍历数据集for i in range(feature_number):# 获取该列所有特征fea_List = [row[i] for row in DataSet]# 将其转化为集合fea_Set = set(fea_List)new_Entropy = 0.0# 计算该特征划分下所有划分子集的香农熵之和for value in fea_Set:sub_dataSet = self.split_DataSet(DataSet,i,value)p = len(sub_dataSet)/float(len(DataSet))new_Entropy += p * self.calc_Shannon_Entropy(sub_dataSet)# information_Gain 信息增益 = 当前数据集的熵 - 已知某个特征之后的条件熵information_Gain = base_Entropy - new_Entropyif information_Gain > best_Shannon:best_Shannon = information_Gainbest_feature_column = ireturn best_feature_column#采用多数表决的方式求出标签中出现次数最多的类标签def max_count_label(self,classify_list):''':param classify_list: 分类标签集:return: 出现次数最多的标签'''class_count = {}for vote in classify_list:if vote in class_count.keys():class_count[vote] += 1else:class_count[vote] = 1# 根据字典的值将字典排序(降序)sorted_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)return sorted_class_count[0][0]# 创建决策树def CreateTree(self,DataSet,labels):''':param DataSet: 数据集:param labels: 划分标签集(特征集):return: 决策树'''classify_list = [row[-1] for row in DataSet]# 如果数据集内所有分类一致if classify_list.count(classify_list[0]) == len(classify_list):return classify_list[0]# 如果所有特征都划分完毕elif len(DataSet[0]) == 1:return self.max_count_label(classify_list)else:best_feature = self.choose_best_feature_to_split(DataSet)           # 选择最佳划分特征best_feature_label = labels[best_feature]                           # 最佳划分对应的划分标签my_tree = {best_feature_label:{}}                                   # 构建字典空树del(labels[best_feature])                                           # 从划分标签中删除划分的标签feature_value = [row[best_feature] for row in DataSet]              # 获取最佳划分对应特征的所有特征值feature_value_set = set(feature_value)                              # 特征唯一化for value in feature_value_set:                         # 逐行遍历特征值集合# 保存所有划分标签信息并将其划分后的数据集传入,进行下一次递归sub_labels = labels[:]my_tree[best_feature_label][value] = self.CreateTree(self.split_DataSet(DataSet,best_feature,value),sub_labels)return my_treedef main():trainData = [[0, 0, 0, 0,'no'],[0, 0, 0, 1,'no'],[0, 1, 0, 1,'yes'],[0, 1, 1, 0,'yes'],[0, 0, 0, 0,'no'],[1, 0, 0, 0,'no'],[1, 0, 0, 1,'no'],[1, 1, 1, 1,'yes'],[1, 0, 1, 2,'yes'],[1, 0, 1, 2,'yes'],[2, 0, 1, 2,'yes'],[2, 0, 1, 1,'yes'],[2, 1, 0, 1,'yes'],[2, 1, 0, 2,'yes'],[2, 0, 0, 0,'no'],]labels = ['年龄', '有工作','有自己的房子','信贷情况']DCT = DecisionTree(trainData)print(DCT.CreateTree(trainData,labels))if __name__ == '__main__':main()

下面我们把这个表构建为决策树
这个表格反映了银行通过对一个人的评判,然后决定是否 给予其贷款

序号 年龄 有工作 有自己的房子 信贷情况 类别
0 青年 一般
1 青年
2 青年
3 青年 一般
4 青年 一般
5 中年 一般
6 中年
7 中年
8 中年 非常好
9 中年 非常好
10 老年 非常好
11 老年
12 老年
13 老年 非常好
14 老年 一般
  • 年龄列:0代表青年;1代表中年;2代表老年
  • 有工作列:0代表否;1代表是
  • 有自己的房子列:0代表否;1代表是
  • 信贷情况列:0代表一般;1代表好;2代表非常好

运行结果

{'有自己的房子': {0: {'有工作': {0: 'no', 1: 'yes'}}, 1: 'yes'}}

我们将字典形式的树画成决策树来看看:

决策树算法分析与应用相关推荐

  1. 决策树算法分析天气、周末和促销活动对销量的影响

    决策树算法分析天气.周末和促销活动对销量的影响 作者:AOAIYI 作者简介:Python领域新星作者.多项比赛获奖者:AOAIYI首页

  2. AI驱动智能化日志分析 : 通过决策树给日志做聚类分析

    日志自动化.智能化分析对于AI需求 通常,我们分析日志,是为了两个目标: 对数据有个整体的概览,例如,生成一天内的报表. 对异常数据进行挖掘,例如,对特殊的日志进行告警. 日志分析,通常对分析者有这些 ...

  3. Python 决策树分类算法分析与实现

    决策树分类算法分析与实现 决策树分类算法是最为常见的一种分类算法,通过属性划分来建立一棵决策树,测试对象通过在树上由顶向下搜索确定所属的分类.决策树的构建主要需要解决两个问题: (1)树的每次成长,选 ...

  4. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. C4.5决策树生成算法完整版(Python),连续属性的离散化, 缺失样本的添加权重处理, 算法缺陷的修正, 代码等

    C4.5决策树生成算法完整版(Python) 转载请注明出处:©️ Sylvan Ding ID3算法实验 决策树从一组无次序.无规则的事例中推理出决策树表示的分类规则,采用自顶向下的递归方式,在决策 ...

  6. 决策树的三种常见算法

    决策树 用途&组成 构造算法 1. 特征选择 metric ID3:信息增益 定义 使用场景 例子 缺点 C4.5: 信息增益比 定义 连续数值特征的处理(转化为二分类寻找阈值的问题) 解决过 ...

  7. 【软考-软件设计师精华知识点笔记】第八章 算法分析设计

    前言 由于笔记复制到CSDN样式失效,没有精力再重新完整的检查并设置一遍样式,有积分的可以前往下载word.pdf.有道云笔记版本. 需要说明的是,下载的内容与本篇分享内容一致,只有样式的区别[比如重 ...

  8. 怎样读懂计算机论文算法,最新计算机算法分析论文参考文献 计算机算法分析专著类参考文献有哪些...

    [100个]最新计算机算法分析论文参考文献供您参考,希望能解决毕业生们的计算机算法分析专著类参考文献有哪些相关问题,整理好参考文献那就开始写计算机算法分析论文吧! 一.计算机算法分析论文参考文献范文 ...

  9. 【毕业设计_课程设计】基于大数据个性化音乐推荐算法分析

    文章目录 0 前言 1 研究目的 2 研究方法 2.1 传统推荐算法 2.2 基于LightGBM决策树模型的推荐算法 3 研究结论 4 最后 0 前言 基于大数据个性化音乐推荐算法分析 提示:适合用 ...

最新文章

  1. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)
  2. 机器学习成为未来趋势 北美未来将保持最大市场规模
  3. C 语言内存区域分配(进程的各个段)详解
  4. 通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端
  5. python怎么加图片_python怎么实现添加图片
  6. React之事件处理
  7. mysql 生明变量_mysql中变量的使用
  8. 【C语言】通过原子操作实现加减乘除功能Ⅰ
  9. 移动端webapp开发必备知识
  10. 674. zui长连续递增序列(JavaScript)
  11. java21天打卡-day14 日期时间
  12. pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=”files.pythonhosted.org“,
  13. 抽丝剥茧,在实践中深入学习QTP
  14. Python:导出QQ聊天记录-让我们看看逗比群友都在聊什么
  15. vscode+authorized_keys登录不上的原因
  16. 买云服务器推荐哪一个?国内知道有腾讯云、阿里云等,不知道如何选择,并且是否有优惠?
  17. 安徽农村信用社网银转账显示服务器无响应,农村信用社企业网银转账显示状态无效是怎么回事...
  18. 使用微信开发者工具的调试器
  19. 0521 HTML基础
  20. 如何做好互联网金融的英语翻译

热门文章

  1. 转载:看一遍就理解,图解单链表反转
  2. 贴片灯背光源的LED灯珠正负极反了怎么办?
  3. Centos7进入图形界面
  4. Libc堆管理机制及漏洞利用技术(一)
  5. Spring Boot 整合 MyBatis Plus实现多数据源的两种方式
  6. 基于LSTM-CNN的地铁短时客流量预测
  7. 一位父亲给儿女的九条人生忠告(看看吧,受用一生,适用于任何人)
  8. Hotsopt对象探秘
  9. “果粉的倒戈”与荣耀的较量
  10. 打开摄像头java程序_在Windows下使用java语言打开摄像头【JMF版】