ID3西瓜决策树python实现

  • 前言
  • 一、代码
    • 运行截图
    • 参考博客:https://blog.csdn.net/qq_45717425/article/details/120959148

前言

一、代码

代码如下(示例):

# coding=utf8from math import log# 构造数据集
def create_dataset():features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']dataset = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'],['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'],['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'],['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'],['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'],['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '否'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'],['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否']]return dataset, features# 计算信息熵
def compute_entropy(dataset):# 求总样本数num_of_example = 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_exampleentropy += p * log(p, 2)return -1*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_dataset# 选择最好的分裂特征
def choose_best_feature(dataset):num_of_features = len(dataset[0]) - 1# 计算当前数据的信息熵current_entropy = compute_entropy(dataset)# 初始化信息增益best_information_gain = 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)# 计算信息增益information_gain = current_entropy - new_entropyif information_gain > best_information_gain:best_information_gain = information_gainindex_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)# 取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)# 对于unique_values中的每一个取值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):classLabel = ''# 根节点代表的属性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.keys()for 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()# print(dataset,features)decision_tree = create_decision_tree(dataset, features)# 打印生成的决策树print("----")print(decision_tree)print("----")# 对新样本进行分类测试# features=['age','work','houes','credit']features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']# test_example=['midlife','yes','no','great']test_example = ['青绿', '稍蜷', '沉闷', '清晰', '稍凹', '硬滑']calssLabel=classify(decision_tree, features, test_example)if calssLabel == '':calssLabel="无法判断"print('\n',calssLabel )

运行截图

参考博客:https://blog.csdn.net/qq_45717425/article/details/120959148

ID3西瓜决策树python实现相关推荐

  1. id3决策树 鸢尾花 python_C4.5决策树Python代码实现

    C4.5决策树Python代码实现 我们知道C4.5决策树与ID3决策树最主要的区别就是C4.5使用信息增益率来划分最优属性.因为使用信息增益来划分属性的话会存在以下这些缺点:对可取属性多的特征有偏好 ...

  2. 决策树ID3代码(Python)

    决策树ID3代码(Python) 上一节介绍了决策树的递归算法框架(create),这一节将用Python语言实现一个小程序.代码和数据来源于<机器学习实战>Peter Harringto ...

  3. ID3决策树 Python实现 + sklearn库决策树模型的应用

    本文介绍机器学习中决策树算法的python实现过程 共介绍两类方法: (1)亲手实习Python ID3决策树经典算法 (2)利用sklearn库实现决策树算法 关于决策树的原理,指路:机器学习 第四 ...

  4. 机器学习(三)西瓜决策树

    文章目录 〇. ID3决策树算法原理 1. 纯度 purity 2. 信息熵 information ertropy 3. 信息增益 information gain 4. 增益率 gain rati ...

  5. 机器学习实验二---决策树python

    机器学习实验二---决策树python 一.了解一下决策树吧 决策树基本流程 信息增益 决策树的优缺点 二.数据处理 三.决策树的构建 计算给定数据集的香农熵 按照给定特征划分数据集 选择最好的数据划 ...

  6. 决策树ID3、决策树C4.5、决策树CART、CART树的生成、树的剪枝、从ID3到CART、从决策树生成规则、决策树优缺点

    决策树ID3.决策树C4.5.决策树CART.CART树的生成.树的剪枝.从ID3到CART.从决策树生成规则.决策树优缺点 目录

  7. 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:

    决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizerimport csvfrom ...

  8. python建模 决策_决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:...

    决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizer import csv fro ...

  9. 使用ID3算法构造决策树——python

    任务描述 本关任务:补充python代码,完成DecisionTree类中的fit和predict函数. 相关知识 为了完成本关任务,你需要掌握: ID3算法构造决策树的流程 如何使用构造好的决策树进 ...

最新文章

  1. Android签名机制之---签名验证过程详解
  2. PHP大文件分片上传
  3. VTK:网格之IdentifyHoles
  4. Unit testing Cmockery 简单使用
  5. python答疑的作用_不学Python之集中答疑(5)
  6. 第三节 DOM-Element对象
  7. Vue 中watch和computed 的用法及区别
  8. Android-利用LinearGradient实现文字一闪一闪
  9. MongoDB vs MySQL,哪个效率更高?
  10. oracle 使用imp,oracle imp命令行的使用
  11. 转帖自勉:一个猎头的自述
  12. 随心所欲b超工作站图像处理_第七讲随心所欲版医学影像工作站软件每周一题...
  13. EXCEL数据计算结果不对
  14. Android 从网页中跳转到APP
  15. 酒店智能门锁方案功能及其特点介绍
  16. HTML页面、CSS样式的以及js学习与介绍
  17. 一文读懂大唐杯所有名词解释
  18. excel中sumproduct()的用法
  19. c 语言loadimage方法吗,CBitmap, HBITMAP和LoadImage
  20. Python爬虫之爬取网络小说并在本地保存为txt文件

热门文章

  1. 超实用的油猴脚本推荐(持续更新)
  2. 马尔可夫过程(Markov Process)和马尔可夫链
  3. c--scanf()函数详解
  4. 如何解决Winfrom加载程序未能加载文件或程序集,抛出异常,
  5. vim插件之pathogen,NERDTree,Command-T,Powerline
  6. 那些你不知道的RK3288人脸识别方案
  7. Poster Design
  8. HtmlUnit 使用范例
  9. 单片机学习笔记9--常见的通信方式(基于百问网STM32F103系列教程)
  10. JQuery的iCheck插件使用方法