一、决策树之ID3和C4.5简介

决策树(Decision Tree),每个分支都是需要通过条件判断进行划分的树,解决分类和回归问题的方法。决策树是最经常使用的数据挖掘算法,其核心是一个贪心算法,它采用自顶向下的递归方法构建决策树。

目前常用的决策树算法有ID3算法、改进的C4.5,C5.0算法和CART算法

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

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

C4.5的改进之处:
(1) 通过信息增益率选择属性
(2) 处理连续型数据的属性
(3) 能够进行剪枝操作
(4) 能够对空缺值进行处理

二、信息熵、信息增益、分离信息、信息增益率

设S是训练样本集,它包括n个类别的样本,这些方法用Ci表示,那么熵和信息增益用下面公式表示:
1. 信息熵:

其中pi表示Ci的概率
2. 样本熵:

其中Si表示根据属性A划分的S的第i个子集,S和Si表示样本数目

3. 信息增益:

ID3中样本分布越均匀,它的信息熵就越大,所以其原则就是样本熵越小越好,也就是信息增益越大越好。

4. 分离信息

5. 信息增益率

三、ID3决策树构造算法的Python实现

from math import log# 构造数据集
def create_dataset():dataset = [['youth', 'no', 'no', 'just so-so', 'no'],['youth', 'no', 'no', 'good', 'no'],['youth', 'yes', 'no', 'good', 'yes'],['youth', 'yes', 'yes', 'just so-so', 'yes'],['youth', 'no', 'no', 'just so-so', 'no'],['midlife', 'no', 'no', 'just so-so', 'no'],['midlife', 'no', 'no', 'good', 'no'],['midlife', 'yes', 'yes', 'good', 'yes'],['midlife', 'no', 'yes', 'great', 'yes'],['midlife', 'no', 'yes', 'great', 'yes'],['geriatric', 'no', 'yes', 'great', 'yes'],['geriatric', 'no', 'yes', 'good', 'yes'],['geriatric', 'yes', 'no', 'good', 'yes'],['geriatric', 'yes', 'no', 'great', 'yes'],['geriatric', 'no', 'no', 'just so-so', 'no']]features = ['age', 'work', 'house', 'credit']return dataset, features# 计算信息熵
def compute_entropy(dataset):# 求总样本数num_of_examples = len(dataset)labelCnt = {}# 遍历整个样本集合for example in dataset:# 当前样本的标签值是该列表的最后一个元素currentLabel = example[-1]# 统计每个标签各出现了几次if currentLabel not in labelCnt.keys():labelCnt[currentLabel] = 0labelCnt[currentLabel] += 1entropy = 0.0# 对于原样本集,labelCounts = {'no': 6, 'yes': 9}# 对应的初始shannonEnt = (-6/15 * log(6/15)) + (- 9/15 * log(9/15))for key in labelCnt:p = labelCnt[key] / num_of_examplesentropy -= p * log(p, 2)return entropy# 提取子集合
# 功能:从dataSet中先找到所有第axis个标签值 = value的样本
# 然后将这些样本删去第axis个标签值,再全部提取出来成为一个新的样本集
def create_sub_dataset(dataset, index, value):sub_dataset = []for example in dataset:current_list = []if example[index] == value:current_list = example[:index]current_list.extend(example[index + 1 :])sub_dataset.append(current_list)return sub_datasetdef choose_best_feature(dataset):num_of_features = len(dataset[0]) - 1# 计算当前数据集的信息熵current_entropy = compute_entropy(dataset)# 初始化信息增益率best_information_gain_ratio = 0.0# 初始化最佳特征的下标为-1index_of_best_feature = -1# 通过下标遍历整个特征列表for i in range(num_of_features):# 构造所有样本在当前特征的取值的列表values_of_current_feature = [example[i] for example in dataset]unique_values = set(values_of_current_feature)# 初始化新的信息熵new_entropy = 0.0# 初始化分离信息split_info = 0.0for value in unique_values:sub_dataset = create_sub_dataset(dataset, i, value)p = len(sub_dataset) / len(dataset)# 计算使用该特征进行样本划分后的新信息熵new_entropy += p * compute_entropy(sub_dataset)# 计算分离信息split_info -= p * log(p, 2)# 计算信息增益# information_gain = current_entropy - new_entropy# 计算信息增益率(Gain_Ratio = Gain / Split_Info)information_gain_ratio = (current_entropy - new_entropy) / split_info# 求出最大的信息增益及对应的特征下标if information_gain_ratio > best_information_gain_ratio:best_information_gain_ratio = information_gain_ratioindex_of_best_feature = i# 这里返回的是特征的下标return index_of_best_feature# 返回具有最多样本数的那个标签的值('yes' or 'no')
def find_label(classList):# 初始化统计各标签次数的字典# 键为各标签,对应的值为标签出现的次数labelCnt = {}for key in classList:if key not in labelCnt.keys():labelCnt[key] = 0labelCnt[key] += 1# 将classCount按值降序排列# 例如:sorted_labelCnt = {'yes': 9, 'no': 6}sorted_labelCnt = sorted(labelCnt.items(), key = lambda a:a[1], reverse = True)# 下面这种写法有问题# sortedClassCount = sorted(labelCnt.iteritems(), key=operator.itemgetter(1), reverse=True)# 取sorted_labelCnt中第一个元素中的第一个值,即为所求return sorted_labelCnt[0][0]def create_decision_tree(dataset, features):# 求出训练集所有样本的标签# 对于初始数据集,其label_list = ['no', 'no', 'yes', 'yes', 'no', 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no']label_list = [example[-1] for example in dataset]# 先写两个递归结束的情况:# 若当前集合的所有样本标签相等(即样本已被分“纯”)# 则直接返回该标签值作为一个叶子节点if label_list.count(label_list[0]) == len(label_list):return label_list[0]# 若训练集的所有特征都被使用完毕,当前无可用特征,但样本仍未被分“纯”# 则返回所含样本最多的标签作为结果if len(dataset[0]) == 1:return find_label(label_list)# 下面是正式建树的过程# 选取进行分支的最佳特征的下标index_of_best_feature = choose_best_feature(dataset)# 得到最佳特征best_feature = features[index_of_best_feature]# 初始化决策树decision_tree = {best_feature: {}}# 使用过当前最佳特征后将其删去del(features[index_of_best_feature])# 取出各样本在当前最佳特征上的取值列表values_of_best_feature = [example[index_of_best_feature] for example in dataset]# 用set()构造当前最佳特征取值的不重复集合unique_values = set(values_of_best_feature)# 对于uniqueVals中的每一个取值for value in unique_values:# 子特征 = 当前特征(因为刚才已经删去了用过的特征)sub_features = features[:]# 递归调用create_decision_tree去生成新节点decision_tree[best_feature][value] = create_decision_tree(create_sub_dataset(dataset, index_of_best_feature, value), sub_features)return decision_tree# 用上面训练好的决策树对新样本分类
def classify(decision_tree, features, test_example):# 根节点代表的属性first_feature = list(decision_tree.keys())[0]# second_dict是第一个分类属性的值(也是字典)second_dict = decision_tree[first_feature]# 树根代表的属性,所在属性标签中的位置,即第几个属性index_of_first_feature = features.index(first_feature)  # 对于second_dict中的每一个keyfor key in second_dict.keys():if test_example[index_of_first_feature] == key:# 若当前second_dict的key的value是一个字典if type(second_dict[key]).__name__ == 'dict':# 则需要递归查询classLabel = classify(second_dict[key], features, test_example)# 若当前second_dict的key的value是一个单独的值else:# 则就是要找的标签值classLabel = second_dict[key]return classLabelif __name__ == '__main__':dataset, features = create_dataset()decision_tree = create_decision_tree(dataset, features)# 打印生成的决策树print(decision_tree)# 对新样本进行分类测试features = ['age', 'work', 'house', 'credit']test_example = ['midlife', 'yes', 'no', 'great']print('\n',classify(decision_tree, features, test_example))

结果:

四、C4.5决策树构造算法的Python实现

只要改动一下函数choose_best_feature,将里面的计算信息增益变为计算信息增益率即可。

ID3、C4.5决策树算法的Python实现(注释详细)相关推荐

  1. 决策树C4.5算法 c语言实现,数据挖掘十大经典算法(1) C4.5_决策树算法

    数据挖掘十大经典算法(1) C4.5_决策树算法 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...

  2. 决策树算法及Python 代码示例

    决策树是一种基于树形结构的算法,用于在一系列决策和结果之间建立模型.它通过对特征和目标变量之间的关系进行划分,来预测目标变量的值. 决策树算法示例: 假设我们有一组数据,其中包含天气,温度,湿度和是否 ...

  3. matlab粗集系统评估wine,C4.5 决策树算法对UCI wine数据集分类的实现(MATLAB)

    一.功能实现与样本分析 在数据挖掘领域,能够利用相应的算法对数据集进行训练,即对样本的特征进行分析,从而概括出相同类别的样本之间存在的内在特征联系,进一步对未知类别的样本进行预测,判断出该样本所属的类 ...

  4. C4.5 决策树算法对UCI wine数据集分类的实现(MATLAB)

    1.功能实现与样本分析 在数据挖掘领域,可以利用相应的算法对数据集进行训练,即对样本的特征进行分析,从而归纳出相同类别的样本之间存在的内在特征联系,进一步对未知类别的样本进行预测,判断出该样本所属的类 ...

  5. ID3决策树算法及其Python实现

    目录 一.决策树算法 基础理论 决策树的学习过程 ID3算法 二.实现针对西瓜数据集的ID3算法 实现代码 三.C4.5和CART的算法代码实现 C4.5算法 CART算法 总结 参考文章 一.决策树 ...

  6. 机器学习笔记(4)——ID3决策树算法及其Python实现

    决策树是一种基于树结构来进行决策的分类算法,我们希望从给定的训练数据集学得一个模型(即决策树),用该模型对新样本分类.决策树可以非常直观展现分类的过程和结果,一旦模型构建成功,对新样本的分类效率也相当 ...

  7. python决策树算法_决策树算法及python实现

    决策树算法是机器学习中的经典算法 1.决策树(decision tree) 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别. 假设小明去看 ...

  8. 决策树算法及Python实现

    1 什么是决策树 决策树(Decision Tree)是一种基本的分类与回归方法,本文主要讨论分类决策树.决策树模型呈树形结构,在分类问题中,表示基于特征对数据进行分类的过程.它可以认为是if-the ...

  9. 数据挖掘之C4.5决策树算法

    1.决策树算法实现的三个过程: 特征选择:选择哪些特征作为分类的标准是决策树算法的关键,因此需要一种衡量标准来进行特征的确定,不同的决策树衡量标准不同.例如C4.5决策树就是以信息增益率来作为衡量标准 ...

  10. c4.5决策树算法python_Python3实现机器学习经典算法(四)C4.5决策树

    一.C4.5决策树概述 C4.5决策树是ID3决策树的改进算法,它解决了ID3决策树无法处理连续型数据的问题以及ID3决策树在使用信息增益划分数据集的时候倾向于选择属性分支更多的属性的问题.它的大部分 ...

最新文章

  1. 使用postman传递参数时报错:Content type ‘multipart/form-data;boundary=--(略)
  2. 说说对npm的开发模式和生产模式的理解
  3. 比较两个引用的几种方法
  4. Android热更新方案Robust
  5. MySql采用range分区可提升查询效率
  6. Mybatis接口注解开发
  7. qt4.8创建.pri_注意Java 8的[Pri​​mitive] Stream.iterate()中的递归
  8. python运行外部程序_在Python中运行外部程序(可执行文件)?
  9. 卷积神经网络CNN是靠什么线索学习到深度信息的?
  10. Oracle分页查询
  11. 前端面试自我介绍话术
  12. 2022T电梯修理考试题库模拟考试平台操作
  13. 计算机网络之物联网的特点及其主要应用领域
  14. 开源实时数据库_实时应用程序的开源数据库
  15. 服务器网站出现403 forbidden,谷歌浏览器出现403 forbidden怎么回事_谷歌浏览器出现403 forbidden如何解决...
  16. 计算机域名(domain name)
  17. 5G时代下的光模块:腾讯云计算技术投资5000亿元(附下载)
  18. 如何设置Mac电脑的DNS
  19. 如何在未越狱的ios系统安装ipa文件
  20. 谁发明了世界上第一台电子计算机

热门文章

  1. vs2012窗体嵌入表格_2012年电子表格日
  2. 医院信息化系统大全?
  3. Mysql中的lpad,rpad函数
  4. 路由器与交换机基本原理
  5. plc梯形图如何转c语言,梯形图和指令怎么转换?plc梯形图转换指令表
  6. python:游戏倒计时器
  7. php验证电子邮箱格式正确,php判断电子邮件是否正确方法
  8. dd 命令用来测试硬盘及网络带宽读写速度
  9. win8.1安装密钥
  10. 国际贸易术语_Incoterm