我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在Python中使用决策树

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在Python中使用决策树

这期内容当中小编将会给大家带来有关如何在Python中使用决策树,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

python是什么意思

Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。

一、要求

如何在Python中使用决策树

二、原理

决策树是一种类似于流程图的结构,其中每个内部节点代表一个属性上的“测试”,每个分支代表测试的结果,每个叶节点代表一个测试结果。类标签(在计算所有属性后做出的决定)。从根到叶的路径代表分类规则。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树。因此如何构建决策树,是后续预测的关键!而构建决策树,就需要确定类标签判断的先后,其决定了构建的决策树的性能。决策树的分支节点应该尽可能的属于同一类别,即节点的“纯度”要越来越高,只有这样,才能最佳决策。

经典的属性划分方法:

  • 信息增益

  • 增益率

  • 基尼指数

本次实验采用了信息增益,因此下面只对信息增益进行介绍。

三、信息增益的计算方法

如何在Python中使用决策树

其中D为样本集合,a为样本集合中的属性,Dv表示D样本集合中a属性为v的样本集合。

Ent(x)函数是计算信息熵,表示的是样本集合的纯度信息,信息熵的计算方法如下:

如何在Python中使用决策树

其中pk表示样本中最终结果种类中其中一个类别所占的比例,比如有10个样本,其中5个好,5个不好,则其中p1 = 5/10, p2 = 5/10。

一般而言,信息增益越大,则意味着使用属性α来进行划分所获得的“纯度提升”越大,因此在选择属性节点的时候优先选择信息增益高的属性!

四、实现过程

本次设计用到了pandas和numpy库,主要利用它们来对数据进行快速的处理和使用。
首先将数据读入:

如何在Python中使用决策树

可以看到数据集的标签是瓜的不同的属性,而表格中的数据就是不同属性下的不同的值等。

if(len(set(D.好瓜)) == 1):        #标记返回         return D.好瓜.iloc[0]    elif((len(A) == 0) or Check(D, A[:-1])):        #选择D中结果最多的为标记        cnt = D.groupby('好瓜').size()        maxValue = cnt[cnt == cnt.max()].index[0]        return maxValue    else:        A1 = copy.deepcopy(A)        attr = Choose(D, A1[:-1])        tree = {attr:{}}        for value in set(D[attr]):            tree[attr][value] = TreeGen(D[D[attr] == value], A1)    return tree

TreeGen函数是生成树主函数,通过对它的递归调用,返回下一级树结构(字典)来完成生成决策树。

在生成树过程中,有二个终止迭代的条件,第一个就是当输入数据源D的所有情况结果都相同,那么将这个结果作为叶节点返回;第二个就是当没有属性可以再往下分,或者D中的样本在A所有属性下面的值都相同,那么就将D的所有情况中结果最多的作为叶节点返回。

其中Choose(D:pd.DataFrame, A:list)函数是选择标签的函数,其根据输入数据源和剩下的属性列表算出对应标签信息增益,选择能使信息增益最大的标签返回

def Choose(D:pd.DataFrame, A:list):    result = 0.0    resultAttr = ''    for attr in A:        tmpVal = CalcZengYi(D, attr)        if(tmpVal > result):            resultAttr = attr            result = tmpVal    A.remove(resultAttr)    return resultAttr

最后是结果:

如何在Python中使用决策树

{‘纹理': {‘稍糊': {‘触感': {‘硬滑': ‘否', ‘软粘': ‘是'}}, ‘清晰': {‘根蒂': {‘硬挺': ‘否', ‘蜷缩': ‘是', ‘稍蜷': {‘色泽': {‘青绿': ‘是', ‘乌黑': {‘触感': {‘硬滑': ‘是', ‘软粘': ‘否'}}}}}}, ‘模糊': ‘否'}}

绘图如下:

如何在Python中使用决策树

五、程序

主程序

#!/usr/bin/python3# -*- encoding: utf-8 -*-'''@Description:决策树:@Date     :2021/04/25 15:57:14@Author      :willpower@version      :1.0'''import pandas as pdimport numpy as npimport treeplotimport copyimport math"""@description  :计算熵值---------@param  :输入为基本pandas类型dataFrame,其中输入最后一行为实际结果-------@Returns  :返回熵值,类型为浮点型-------"""def CalcShang(D:pd.DataFrame):    setCnt = D.shape[0]    result = 0.0    # for i in D.groupby(D.columns[-1]).size().index:    #遍历每一个值    for i in set(D[D.columns[-1]]):        #获取该属性下的某个值的次数        cnt = D.iloc[:,-1].value_counts()[i]        result = result + (cnt/setCnt)*math.log(cnt/setCnt, 2)    return (-1*result)"""@description  :计算增益---------@param  :输入为DataFrame数据源,然后是需要计算增益的属性值-------@Returns  :返回增益值,浮点型-------"""def CalcZengYi(D:pd.DataFrame, attr:str):    sumShang = CalcShang(D)    setCnt = D.shape[0]    result = 0.0    valus = D.groupby(attr).size()    for subVal in valus.index:        result = result + (valus[subVal]/setCnt)*CalcShang(D[D[attr] == subVal])    return sumShang - result"""@description  :选择最佳的属性---------@param  :输入为数据源,以及还剩下的属性列表-------@Returns  :返回最佳属性-------"""def Choose(D:pd.DataFrame, A:list):    result = 0.0    resultAttr = ''    for attr in A:        tmpVal = CalcZengYi(D, attr)        if(tmpVal > result):            resultAttr = attr            result = tmpVal    A.remove(resultAttr)    return resultAttr"""@description  :检查数据在每一个属性下面的值是否相同---------@param  :输入为DataFrame以及剩下的属性列表-------@Returns  :返回bool值,相同返回1,不同返回0-------"""def Check(D:pd.DataFrame, A:list):    for i in A:        if(len(set(D[i])) != 1):            return 0    return 1"""@description  :生成树主函数---------@param  :数据源DataFrame以及所有类型-------@Returns  :返回生成的字典树-------"""def TreeGen(D:pd.DataFrame, A:list):    if(len(set(D.好瓜)) == 1):        #标记返回         return D.好瓜.iloc[0]    elif((len(A) == 0) or Check(D, A[:-1])):        #选择D中结果最多的为标记        cnt = D.groupby('好瓜').size()        #找到结果最多的结果        maxValue = cnt[cnt == cnt.max()].index[0]        return maxValue    else:        A1 = copy.deepcopy(A)        attr = Choose(D, A1[:-1])        tree = {attr:{}}        for value in set(D[attr]):            tree[attr][value] = TreeGen(D[D[attr] == value], A1)    return tree"""@description  :验证集---------@param  :输入为待验证的数据(最后一列为真实结果)以及决策树模型-------@Returns  :无-------"""def Test(D:pd.DataFrame, model:dict):    for i in range(D.shape[0]):            data = D.iloc[i]            subModel = model            while(1):                attr = list(subModel)[0]                subModel = subModel[attr][data[attr]]                if(type(subModel).__name__ != 'dict'):                    print(subModel, end='')                    break    print('')name = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '好瓜']df = pd.read_csv('./savedata.txt', names=name)# CalcZengYi(df, '色泽')resultTree = TreeGen(df, name)print(resultTree)# print(df[name[:-1]])Test(df[name[:-1]], resultTree)treeplot.plot_model(resultTree,"resultTree.gv")

绘图程序

from graphviz import Digraphdef plot_model(tree, name):    g = Digraph("G", filename=name, format='png', strict=False)    first_label = list(tree.keys())[0]    g.node("0", first_label)    _sub_plot(g, tree, "0")    g.view()root = "0"def _sub_plot(g, tree, inc):    global root    first_label = list(tree.keys())[0]    ts = tree[first_label]    for i in ts.keys():        if isinstance(tree[first_label][i], dict):            root = str(int(root) + 1)            g.node(root, list(tree[first_label][i].keys())[0])            g.edge(inc, root, str(i))            _sub_plot(g, tree[first_label][i], root)        else:            root = str(int(root) + 1)            g.node(root, tree[first_label][i])            g.edge(inc, root, str(i))

./savedata.txt

青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
青绿,稍蜷,浊响,清晰,稍凹,软粘,是
乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
青绿,硬挺,清脆,清晰,平坦,软粘,否
浅白,硬挺,清脆,模糊,平坦,硬滑,否
浅白,蜷缩,浊响,模糊,平坦,软粘,否
青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
浅白,蜷缩,浊响,模糊,平坦,硬滑,否
青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否

六、遇到的问题

graphviz Not a directory: ‘dot'

解决办法

如何在Python中使用决策树

上述就是小编为大家分享的如何在Python中使用决策树了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在Python中使用决策树

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Python中使用决策树

这期内容当中小编将会给大家带来有关如何在Python中使用决策树,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语
2023-06-14

怎么在Python中实现决策树算法

怎么在Python中实现决策树算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.算法概述决策树算法是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大
2023-06-15

python如何实现决策树分类算法

今天小编给大家分享一下python如何实现决策树分类算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前置信息1、决策树决策
2023-07-02

如何使用c++从头开始实现决策树

小编给大家分享一下如何使用c++从头开始实现决策树,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Python已经成为数据科学的语言之王。大多数新的数据科学家和程序
2023-06-15

怎么使用python sklearn画出决策树并保存为PDF

本篇内容介绍了“怎么使用python sklearn画出决策树并保存为PDF”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!利用sklearn
2023-07-02

如何在AmazeUi 中使用树形结构

如何在AmazeUi 中使用树形结构?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一步:基本引入2023-06-09

如何在Python中实现avl树运算

Python执行avl树,代码详情:import sys#创建树节点class TreeNode(object):def __init__(self,key):self.key=keyself.left=Noneself.rig
如何在Python中实现avl树运算
2024-01-23

linspace如何在Python中使用

linspace如何在Python中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。linspace生成有序列表,重点在数据范围与数据个数上linspace(
2023-06-14

如何在python中使用pygame

如何在python中使用pygame?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、安装在 cmd 命令中输入: pip install pygame即可安装成功了二、第一个
2023-06-15

如何在Python中使用EasyGUI

这篇文章给大家介绍如何在Python中使用EasyGUI,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于
2023-06-14

如何在Python中使用类

如何在Python中使用类?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、类的定义和使用在C++中,类是“结构体”的衍生。在Python中,类作为一个完全独立
2023-06-15

如何在Python中使用DataFrame

如何在Python中使用DataFrame?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、方法说明df.values:返回一个 ndarray 类型的对象,包涵 DataFr
2023-06-15

sympy如何在python中使用

sympy如何在python中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyth
2023-06-14

Counter如何在python中使用

Counter如何在python中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录