决策树——依据水果特征分类

2023-11-03

一、获取数据集

水果中苹果和杨桃外部特征比较鲜明,例如下面两张苹果、杨桃图片,苹果颜色为红色、形状大致为椭圆形、表面光滑没有棱角、带叶子,杨桃则是黄色、五角星形、带有棱角、没叶子。
在这里插入图片描述
利用上述特征统计一些苹果和杨桃数据:

  • 颜色: 1-红色 0-黄色
  • 形状: 1-椭圆形 0-五角星形
  • 棱角: 1-有棱角 0-无棱角
  • 带叶: 1-带叶子 0-不带叶子

在这里插入图片描述

1、提取数据

利用CSV库将指定特征分类,将除去第一行的数据提取出来,作为本次实验的数据集
在这里插入图片描述
其中第一行就是决策树的每一个节点,存到lables中;再将特征对应每一种情况存到了labels中。
在这里插入图片描述

# 获取数据集
def createDataSet(filename):
    # 读取文件
    data = open(filename, 'rt', encoding='gbk')
    reader = csv.reader(data)
    # 获取标签列
    handlers = next(reader)
    lables = handlers[:-1]
    # 数据列表
    dataSet = []

    for row in reader:
        # 读取除第一行的数据
        dataSet.append(row[:])
        
    # 特征对应的所有可能的情况
    labels_full = {}
    for i in range(len(lables)):
        labelList = [example[i] for example in dataSet]
        uniqueLabel = set(labelList)
        labels_full[lables[i]] = uniqueLabel
    return dataSet, lables, labels_full

2、划分数据

dataSet输入的数据,axis是labels中对应坐标,value是对应属性下的属性值。

# 划分数据集  
def splitDataSet(dataSet, axis, value):
    retDataSet = []
    for featVec in dataSet:
        # 给定特征值等于想要的特征值
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            # 将该特征值后面的内容保存起来
            reducedFeatVec.extend(featVec[axis + 1:])
            retDataSet.append(reducedFeatVec)

    return retDataSet
print(splitDataSet(dataSet, 1, '0'))

利用majorityCnt方法获取一个集合中,出现次数最多的标签

# 获取出现次数最多的类别
def majorityCnt(classList):
    classCount = collections.defaultdict(int)
    # 遍历所有的类别
    for vote in classList:
        classCount[vote] += 1
    # 降序排序,第一行第一列就是最多的
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

二、计算信息增益

1、信息熵

首先获取全部数据长度,再创建一个字典,键值是最后一列数值。每个键值记录了当前类别出现的次数,最后算出所有类标签的发生评率计算类别出现的评率,最后计算熵值。

# 获取水果信息熵
def calcShannonEnt(dataSet):
    # 总数
    numEntries = len(dataSet)
    # 用来统计标签
    labelCounts = collections.defaultdict(int)
    # 循环整个数据集,得到数据的分类标签
    for featVec in dataSet:
        # 得到当前的标签
        currentLabel = featVec[-1]
        labelCounts[currentLabel] += 1
    # 计算信息熵
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries
        shannonEnt -= prob * log(prob, 2)
    return shannonEnt

2、计算信息增益

计算信息增益首先获取所有特征的种数,不包含最后水果分类;再计算每个特征对应信息熵;最后将分类的信息熵减去该特征的信息熵,就是对应特征的信息增益。获取到每个特征的信息增益之后,将最大值对应的标签下标返回,在构建决策树时作为数的根节点。
每个特征对应的信息增益,最后返回最大标签对应下标:
在这里插入图片描述

# 计算每个特征信息增益
def chooseBestFeatureToSplit(dataSet, labels):
    # 特征数 总的列数减去最后的一列
    numFeatures = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    # 对每个特征值进行求信息熵
    for i in range(numFeatures):
        # 得到数据集中所有的当前特征值列表
        featList = [example[i] for example in dataSet]
        # 当前特征值中共有多少种
        uniqueVals = set(featList)
        newEntropy = 0.0

        # 遍历现在有的特征的可能性
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet=dataSet, axis=i, value=value)
            prob = len(subDataSet) / float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy

        print( labels[i] + '信息增益值为:' + str(infoGain))
        # 找出最大的值
        if infoGain > bestInfoGain:
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature
print(chooseBestFeatureToSplit(dataSet, lables))

三、绘制决策树

输入数据集和标签数组,能够得到一个类似字典的决策树。
首先拿到所有数据集的分类标签,再统计第一个标签出现的次数,与总标签个数比较。计算第一行有多少个数据,如果只有一个的话说明所有的特征属性都遍历完了,剩下的一个就是类别标签,或者所有的样本在全部属性上都一致,然后利用majorityCnt返回剩下标签中出现次数较多的那个。在利用chooseBestFeatureToSplit选择最好的划分特征,得到该特征的下标,作为根节点。最后递归调用,将数据集中该特征等于当前特征值的所有数据划分到当前节点下,递归调用时需要先将当前的特征去除掉。

# 绘制决策树
def createTree(dataSet, labels):
    classList = [example[-1] for example in dataSet]
    print(classList)
    # 统计第一个标签出现的次数,与总标签个数比较
    if classList.count(classList[0]) == len(classList):
        return classList[0]

    if len(dataSet[0]) == 1 :
        # 返回剩下标签中出现次数较多的那个
        return majorityCnt(classList)

    bestFeat = chooseBestFeatureToSplit(dataSet=dataSet, labels=labels)
    bestFeatLabel = labels[bestFeat]

    myTree = {bestFeatLabel: {}}

    # 将本次划分的特征值从列表中删除掉
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)

    # 遍历所有的特征值
    for value in uniqueVals:
        subLabels = labels[:]
        subTree = createTree(splitDataSet(dataSet=dataSet, axis=bestFeat, value=value), subLabels)
        # 递归调用
        myTree[bestFeatLabel][value] = subTree
    return myTree
print(createTree(dataSet, lables))

获取一个字典形状的决策树:

{'带叶': 
    {'1': {'形状': 
            {'1': '苹果', 
            '0': {'棱角': 
                {'1': '杨桃', 
                 '0': '苹果'}}}}, 
     '0': {'棱角': 
            {'1': '杨桃', 
             '0': {'颜色': 
                {'1': {'形状': {'杨桃': '杨桃', '苹果': '苹果'}}, 
                 '0': {'形状': {'杨桃': '杨桃', '苹果': '苹果'}}}}}}}}

四、分类预测

分类预测也是一个递归函数,使用index方法查找当前列表中第一个匹配firstStr变量的元素。然后递归遍历整棵树,比较testVec变量中的值和树节点的值,若达到叶子节点就返回分类标签。

# 预测
def classify(inTree, featLabel, testVec):
    # 获取第一个节点
    firstStr = list(inTree.keys())[0]
    secondDict = inTree[firstStr]
    # 节点对应下标
    featIndex = featLabel.index(firstStr)
    for key in secondDict.keys():
        if testVec[featIndex] == key:
            # 递归判断
            if type(secondDict[key]).__name__ == 'dict':
                classLabel = classify(secondDict[key], featLabel, testVec)
            else: classLabel = secondDict[key]
    # 返回预测
    return classLabel

测试结果:
在这里插入图片描述

代码:
链接:https://pan.baidu.com/s/1gjbXKDworG7ejzS6cCTvgQ?pwd=kupj
提取码:kupj

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

决策树——依据水果特征分类 的相关文章

随机推荐

  • matlab绘制脑电地形图,脑电地形图的原理及其结果

    脑电地形图 brain electrical activity mapping BEAM 是将脑电信号输人电子计算机进行处理后转换为一种可定位和定量性分析 并用不同颜色的图像显示的检查技术 其优点是可将脑功能变化与形态定位结合 图像直观 形
  • 计算机视觉领域的一些牛人博客

    转载自 blog csdn net carson2005 以下链接是关于计算机视觉 ComputerVision CV 相关领域的网站链接 其中有CV牛人的主页 CV研究小组的主页 CV领域的paper 代码 CV领域的最新动态 国内的应用
  • Linux Select

    文章目录 1 函数原型 1 1 函数参数说明 1 2 返回值 2 相关数据结构与函数 2 1 struct timeval 2 2 fd set 3 编程模型 4 关于select的阻塞 4 select总结 5 Unix5中IO模型 5
  • 服务器不稳定怎么解决?常见的4种问题和6种处理方法

    一 常见的4种问题 1 机房或服务器问题 联系服务器提供商 要求协助排查故障并解决或者更换硬件 2 软件和硬件故障故障问题 要求服务商更换服务器 或者升级服务器 3 网站本身问题 通过优化网站结构 减少垃圾代码等方式来优化网站访问速度 4
  • flutter dart判断文件是否存在

    File txt File data data sms com smsexample files 2 txt var dir bool await txt exists 返回真假 if dirbool
  • css3 flex 实现常见页面布局

    css3 flex 实现常见页面布局 上中下布局 左中右三列布局 圣杯布局 Flex是Flexible Box的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为Flex布局 box display flex 行
  • 云服务器被ddos攻击了怎么办?甜甜来给您解答

    随着互联网科技的发展 网络安全问题日益突出 企业服务器被攻击的事件也越来越频繁 为此快快推出的增值服务高防ip 有效解决了中小企业DDOS攻击问题 同时快快高防ip支持大流量按天付费模式 可按不同业务需求配置弹性防护 成本可控 互联网服务器
  • ansible错误解决:UNREACHABLE Failed to connect to the host via ssh.

    执行过程是 ansible接收动态的hosts与本地的私钥 通过无密码登录方式运行一个playbook 但是运行后始终出现如下问题 PLAY 120 27 26 TASK setup 1 31mfatal 120 27 26 UNREACH
  • Win10系统BitLocker解锁后再次快速锁定办法

    谁都不愿意把自己电脑上资料完全公开 对资料选择性加密处理是唯一的办法 微软Windows7及以后的Windows系统自带磁盘分区BitLocker加密功能是一个不错的选择 BitLocker加密功能的优点之一是可以对磁盘分区进行快速加密 锁
  • jsp不能正常引入jquery($ is not defined)问题分析

    文章目录 1 idea中不能引入jquery step1 step2 2 路径导入问题 3 静态文件不能放在WEB INF下 4 finally jsp中不能正常引入jquery的原因有很多 让我们一步一步来排除 1 idea中不能引入jq
  • 华为面试题: 招聘(javascript)

    题目 某公司组织一场公开招聘活动 假设由于人数和场地的限制 每人每次面试的时长不等 并已经安排给定 用 S1 E1 S2 E2 Sj Ej Si lt Ei 均为非负整数 表示每场面试的开始和结束时间 面试采用一对一的方式 即一名面试官同时
  • 命令行说明中括号的含义

    内的内容表示可写可不写 至少选择大括号内的一个 lt gt 必写项
  • QT删除及创建文件夹

    bool DirMake const QString path QString full path GetFullPath path QDir dir full path if dir exists return true else ret
  • 2022-2023 通信工程专业毕业设计题目选题推荐 - 100例

    文章目录 1前言 2 如何选题 3 通信工程选题方向 2 1 移动通信方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 物联网方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 3 4 学长作品展示 4 最
  • 二维码PDF417简介及其解码实现(zxing-cpp)

    二维码PDF417是一种堆叠式二维条码 PDF417条码是由美国SYMBOL公司发明的 PDF Portable Data File 意思是 便携数据文件 组成条码的每一个条码字符由4个条和4个空共17个模块构成 故称为PDF417条码 P
  • 【C#学习笔记】数组使用

    using System namespace ConsoleApplication class Program static void Main string args int a new int 3 一维数组 int a new int
  • 如何通过cpolar内网穿透+VNC实现公网远程ubuntu

    文章目录 前言 1 ubuntu安装VNC 2 设置vnc开机启动 3 windows 安装VNC viewer连接工具 4 内网穿透 4 1 安装cpolar 支持使用一键脚本命令安装 4 2 创建隧道映射 4 3 测试公网远程访问 5
  • 毕业设计-基于协同过滤算法的电商平台推荐系统

    目录 前言 课题背景和意义 实现技术思路 一 文献综述 二 基于用户协同过滤推荐系统算法 三 实证分析 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计
  • mysql DATE_FORMAT导致索引失效

    最近在优化一个统计的接口 在几十万的数据统计下 接口处理的响应时间达到了20s 看了下代码逻辑 发现其中主要有三个主要的统计方法 在优化了其中一个方法的统计逻辑后 接口的响应时间下降到了3s内 还是没有达到期望的响应时间 1s内 看了下另外
  • 决策树——依据水果特征分类

    文章目录 一 获取数据集 1 提取数据 2 划分数据 二 计算信息增益 1 信息熵 2 计算信息增益 三 绘制决策树 四 分类预测 一 获取数据集 水果中苹果和杨桃外部特征比较鲜明 例如下面两张苹果 杨桃图片 苹果颜色为红色 形状大致为椭圆