决策树

基本介绍
决策树通过把数据样本分配到某个叶子结点来确定数据集中样本所属的分类。
决策树由决策结点分支叶子结点组成。

  • 决策结点表示在样本的一个属性上进行的划分;

  • 分支表示对于决策结点进行划分的输出;

  • 叶子节点代表经过分支到达的类。

从决策树根据节点出发,自顶向下移动,在每个决策结点都会进行次划分,通过划分的结果将样本进行分类,导致不同的分支,最后到达个 叶子结点,这个过程就是利用决策树进行分类的过程。

ID3算法原理

ID3算法是在每个结点处选取能获得最高信息增益的分支属性进行分裂。

在每个决策结点处划分分支,选取分支属性的目的就是将整个决策树的样本纯度提高。

衡量样本集合纯的指标则是熵(熵越大,所含有用信息就越少,不确定性就越大,在决策树中,熵指的是纯度,熵越小,纯度越高),设S为数量为n的样本集,其分支属性有m个取值用来定义m个不同分类Ci(i=1,2,3,…,m)那么熵为:

计算分支属性对于样本集分类好坏程度的度量——信息增益。
由于分裂后样本集的纯度提高,则样本集的熵降低,熵降低的值即为该分裂方法的信息增益:

ID3代码

  1. 第一步,创建数据和标签。
from math import log
import operator#用于函数操作def create_data():  # 构建数据和标签dataSet = [['short', 'long hair', 'thin', 'female'],['high', 'short hair', 'thin', 'male'],['short', 'long hair', 'fat', 'female'],['high', 'long hair', 'thin', 'female'],['short', 'short hair', 'fat', 'male'],['short', 'short hair', 'thin', 'female'],['high', 'short hair', 'fat', 'male'],['high', 'long hair', 'fat', 'male'],['short', 'short hair', 'thin', 'male'],['high', 'short hair', 'thin', 'female'],['short', 'long hair', 'fat', 'female']]labels = ['stature', 'hair', 'weight', 'gender']return dataSet, labels
  1. 使用ID3算法需计算信息熵,所以第二步创建cal_entropy方法来计算信息熵。
def cal_entropy(dataSet):num = len(dataSet)      #总共有多少行数据label_count = {}for fea in dataSet:     #遍历整个数据集,每次取一行current_label = fea[-1]  # 统计每条数据的类,取该行最后一列的值,即标签if current_label not in label_count.keys():     #判断在字典中标签是否存在label_count[current_label] = 0label_count[current_label] += 1  # 计算每个类中有多少数据entropy = 0.0           #初始化信息熵for i in label_count:  # 计算经验熵Pi = float(label_count[i]) / numentropy -= Pi * log(Pi, 2)return entropy      #返回信息熵
  1. 第三步,创建remove_feature方法来去除某个特征,对数据集进行分割。
def remove_feature(dataSet, axis, feature):  # 去除某个特征retdataset = []for featVec in dataSet:if featVec[axis] == feature:reducedata = featVec[:axis]  # 某个特征前数据reducedata.extend(featVec[axis + 1:])  # 某个特征后数据# 去掉了axisretdataset.append(reducedata)return retdataset
  1. 第四步,通过信息熵计算信息增益率来求出划分数据集的最优信息增益比。
def choose_best_feature(dataSet):entropy = cal_entropy(dataSet)feature_num = len(dataSet[0]) - 1      #获取当前数据集的特征个数,最后一列是分类标签max_mutual_info = 0best_feature = -1       #初始化最优特征for i in range(feature_num):feature_list = [example[i] for example in dataSet]  #获取数据集中当前特征下的所有值feature_class = set(feature_list)  # 得到该特征的所有可能取值conditional_entropy = 0for value in feature_class:retdataset = remove_feature(dataSet, i, value)  #去处某一特征,方便计算Pi = len(retdataset) / float(len(dataSet))conditional_entropy += Pi * cal_entropy(retdataset)  # 求条件熵mutual_info = entropy - conditional_entropy  # 互信息量if (mutual_info > max_mutual_info):#比较每个特征的信息增益比,只要最好的信息增益比max_mutual_info = mutual_infobest_feature = ireturn best_feature
  1. 创建一个majority_vote方法将传入的数据按出现的频率进行降序排列,并返回第一个键名。
def majority_vote(class_list):class_count = {}        #存各种分类出现的频率for vote in class_list:if vote not in class_count.keys():class_count[vote] = 0class_count[vote] += 1#对字典进行排序sort_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)# 排序来决定该节点的类return sort_class_count[0][0]
  1. 最后一步,根据得到的最优信息增益比生成决策树。
#生成决策树
def create_tree(dataSet, labels):class_list = [example[-1] for example in dataSet]#终止条件1:class_list是否纯净(纯净就是数据中所有特征都相等)if class_list.count(class_list[0]) == len(class_list):#当整个数据中的类别完全相同时类别已经纯净了,则停止继续划分,直接返回该类的标签return class_list[0]if len(dataSet[0]) == 1:# 节点已没有特征可以继续分解return majority_vote(class_list)best_feature = choose_best_feature(dataSet)#选择最好的分类特征索引best_feature_label = labels[best_feature]#获得该特征的名字#直接使用字典变量来存储树信息my_tree = {best_feature_label: {}}     #当前数据集选取最好的特征存储在best_feature中del (labels[best_feature])# 删掉已选择的特征feature = [example[best_feature] for example in dataSet]    #取出最优列的值feature_class = set(feature)#根据这个列的这个feature_class值来切分树的节点for value in feature_class:sublabels = labels[:]my_tree[best_feature_label][value] = create_tree(remove_feature(dataSet, best_feature, value), sublabels)# 迭代生成决策树return my_tree

运行结果为:

此决策树共进行四次分类,分别是:“stature”,“hair”,“weight”,“gender”。
ID3算法是由根节点通过计算信息增益选取最合适的属性进行分裂,若新生成的结点的分类属性不唯一,则对新生成的结点继续进行分裂,不断重复此步骤,直到所有样本属于同一类,或者达到要求的分类条件为止。

使用ID3算法实现决策树相关推荐

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

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

  2. 决策树之ID3算法以及决策树挑西瓜代码实现

    决策树之ID3算法以及决策树挑西瓜代码实现 一.决策树 1. 决策树的基本认识 2. 决策树的构造过程 (1)特征选择 (2)决策树的生成 (3)决策树的裁剪 决策树的优缺点 二.决策树之ID3算法 ...

  3. python决策树id3算法_决策树ID3算法预测隐形眼睛类型--python实现

    标签: 本节讲解如何预测患者需要佩戴的隐形眼镜类型. 1.使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3 ...

  4. python决策树id3算法_Python3 决策树ID3算法实现

    1 #-*- coding: utf-8 -*- 2 """ 3 Created on Wed Jan 24 19:01:40 20184 5 @author: mark ...

  5. 【Machine Learning】决策树之ID3算法 (2)

    决策树之ID3算法 Content 1.ID3概念 2.信息熵 3.信息增益 Information Gain 4. ID3 bias 5. Python算法实现(待定) 一.ID3概念 ID3算法最 ...

  6. 决策树-熵计算-ID3算法(转)

    今天,我来讲解的是决策树.对于决策树来说,主要有两种算法:ID3算法和C4.5算法.C4.5算法是 对ID3算法的改进.今天主要先讲ID3算法,之后会讲C4.5算法和随机森林等. Contents   ...

  7. 决策树决策算法ID3算法、改进算法C4.5算法和CART算法代码实现

    决策树决策算法之ID3算法 ID3算法 在决策树各个节点上应用信息增益准则选择特征,每一次都选择是的信息增益最大的特征进行分裂,递归的构建决策树 具体计算可以参考 决策常用算法数学计算过程 ID3代码 ...

  8. 决策树的原理及构建(基于ID3算法)

    决策树原理 决策树(Decision Tree)是根据一系列规则对数据进行分类的过程.实际上决策树的生成过程就是使用满足划分准则的特征不断的将数据集划分为纯度更高,不确定性更小的子集的过程.对于当前数 ...

  9. 决策树(1)——ID3算法与C4.5算法的理论基础与python实现

    1.前言   决策树是一种常用的机器学习算法,既可以做分类任务也可以做回归任务,本文主要讨论用于分类任务的决策树.决策树与数据结构中的树相同,也是由一个根结点.若干个内部结点和若干个叶结点构成.这里我 ...

  10. 算法杂货铺——分类算法之决策树(Decision tree)

    算法杂货铺--分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 88978 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别 ...

最新文章

  1. Node.Js从零开始搭建数据管理后台 (一)
  2. 引入struts html标签,【学习】Struts标签之html标签
  3. mysql 加字段_MySQL8.0大表秒加字段,是真的吗?
  4. redis——新版复制
  5. eosio.cdt心得
  6. php 扫描仪对接,Mac_Mac怎么连接扫描仪?苹果电脑Mac添加扫描仪教程,  有很多的用户需要用到扫 - phpStudy...
  7. 练手:微博热搜小爬虫
  8. 华为系统里的计算机,一个屏幕操作两个系统 让你的手机装进华为MateBook 14电脑里...
  9. BUUCTF------相册
  10. 基于java的论文查重系统设计
  11. 国家海洋局事业单位公开招聘考试大纲2016
  12. FCPX插件 画笔记号标注工具 Pixel Film Studios PROPEN v1.0.3激活版
  13. Openwrt 镜像安装
  14. 在linux上通过yum安装JDK
  15. 可视化全埋点系列文章之功能介绍篇
  16. 如何全面欣赏一场时装秀?
  17. 安卓+ios系统--手机端页面自适应手机屏幕大小,禁止手动放大和缩小VUE
  18. ubuntu下耳机没有声音问题
  19. 2022应届校招面试总结
  20. 使用Neo4j+InteractiveGraph实现豆瓣电影知识图谱可视化

热门文章

  1. Uchome分页方法
  2. 思科CCNP认证介绍
  3. CSS border dashed 虚线调整
  4. SQL2008升级SQL2008R2完全教程
  5. 三核浏览器Lunascape新版发布
  6. Ubuntu的另类安装方法
  7. 通讯录管理系统的设计与实现
  8. 网站优化后如何降低阿里云国际版服务器成本
  9. Microsoft Internet Explorer浏览器包含最新版本的内置Adobe Flash Player的解决办法
  10. ssm框架体检管理系统源码+文档