精华内容
下载资源
问答
  • 树木画局部信息分析和解读.doc
  • 本篇文章对赫夫曼编码的问题进行了分析说明,需要的朋友参考下
  • 决策的可视化解读

    千次阅读 多人点赞 2020-01-28 22:35:00
    浏览过网上的其他帖子,发现大多都是进行环境的配置,并没有对结果进行分析。故写此文(其他文章写过的内容,我就不赘述...使用工具Graphviz可视化决策后,可以得到如下所示的一个PDF文件: 与之对应的CSV表格如...

    浏览过网上的其他帖子,发现大多都是进行环境的配置,并没有对结果进行分析。故写此文(其他文章写过的内容,我就不赘述了)。

    环境:Python 3.6
    源代码:https://gitee.com/zhyantao/DeepLearning/tree/master/DecisionTree

    使用工具Graphviz可视化决策树后,可以得到如下所示的一个PDF文件:
    1604435-20200128224032626-23518615.png

    与之对应的CSV表格如下所示:

    RIDageincomestudentcredit_ratingclass_buys_computer
    1youthhighnofairno
    2youthhighnoexcellentno
    3middle_agedhighnofairyes
    4seniormediumnofairyes
    5seniorlowyesfairyes
    6seniorlowyesexcellentno
    7middle_agedlowyesexcellentyes
    8youthmediumnofairno
    9youthlowyesfairyes
    10seniormediumyesfairyes
    11youthmediumyesexcellentyes
    12middle_agedmediumnoexcellentyes
    13middle_agedhighyesfairyes
    14seniormediumnoexcellentno

    解析

    信息熵(entropy)作为不确定性的度量,其值越大,代表不确定性越强。因此当entropy=0时,表明结果是一个确定值。

    对于决策树,利用 sklearn 自带的方法,确定了 age 可作为根节点,

    下面分析这个树下面的各个参数都是什么意思:

    首先,看最容易的参数 samples:

    第一次分流,样本总数为 14 ,故 samples 等于 14。根据 age 属性是否等于 middle_aged 分成两类,等于 middle_aged 的样本总数为 4 ,不等于 middle_aged 的样本总数为 10 。因此左右子孩子的 samples 分别为 4 和 10 。

    第二次分流,首先删掉第一次分流中等于 middle_aged 的个体。然后根据 student 属性是否为 yes 分成两类,等于 yes 的个体为 5 ,等于 no 的个体为 5 。因此左右孩子的 samples 分别为 5 和 5 。

    然后,再分析 values 属性:

    看根节点,根据标签值,也就是 class_buys_computer 属性的取值, yes 的个数为 5 , no 的个数为 9 ,因此 values=[5, 9] 。
    同理,根节点的左孩子的标签值,yes 的个数为 5 , no 的个数为 5 ,因此 values=[5, 5] 。右孩子的标签值, 4个标签值全部都是 yes ,故 values=[0, 4]。

    然后,再分析 entropy 属性:

    对根节点来说,计算其信息熵,可以根据 values 中的两个值:

    下面的节点和根节点一样的计算方式。

     

    注解:为什么把 age 作为根节点?(详细步骤省略了,只给出计算方式)

    构造这个树,是根据信息增益来计算的。

    把信息增益最大的作为根节点, 所以,选择 age 作为第一个根节点 。

     

     

    展开全文
  • 数据描述 ...决策数据结构 class DecisionNode: '''决策节点 ''' def __init__(self,col=-1,value=None,results=None,tb=None,fb=None): '''初始化决策节点 args: col -- 按数据集的
  • 决策算法应用及结果解读

    千次阅读 多人点赞 2019-12-23 08:20:00
    作者:林骥 来源:林骥引言本文是我写的人工智能系列的第 8 篇文章,文末有前面 7 篇文章的链接,推荐你阅读、分享和交流。1. 决策算法简介决策是一种应用非常广泛的...

         作者:林骥

         来源:林骥

    引言

    本文是我写的人工智能系列的第 8 篇文章,文末有前面 7 篇文章的链接,推荐你阅读、分享和交流。

    1. 决策树算法简介

    决策树是一种应用非常广泛的算法,比如语音识别、人脸识别、医疗诊断、模式识别等。

    决策树算法既可以解决分类问题(对应的目标值是类别型的数据),也能解决回归问题(输出结果也可以是连续的数值)。

    相比其他算法,决策树有一个非常明显的优势,就是可以很直观地进行可视化,分类规则好理解,让非专业的人也容易看明白。

    比如某个周末,你根据天气等情况决定是否出门,如果降雨就不出门,否则看是否有雾霾……这个决策的过程,可以画成这样一颗树形图:

    下面我们以 sklearn 中的葡萄酒数据集为例,给定一些数据指标,比如酒精度等,利用决策树算法,可以判断出葡萄酒的类别。

    2. 加载数据

    为了方便利用图形进行可视化演示,我们只选取其中 2 个特征:第 1 个特征(酒精度)和第 7 个特征(黄酮量),并绘制出 3  类葡萄酒相应的散点图。

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    # 加载葡萄酒的数据集
    wine = datasets.load_wine()
    
    # 为了方便可视化,只选取 2 个特征
    X = wine.data[:, [0, 6]]
    y = wine.target
    
    # 绘制散点图
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.scatter(X[y==2, 0], X[y==2, 1])
    plt.show()

    在上面的散点图中,颜色代表葡萄酒的类别,横轴代表酒精度,纵轴代表黄酮量。

    3. 调用算法

    和调用其他算法的方法一样,我们先把数据集拆分为训练集和测试集,然后指定相关参数,这里我们指定决策树的最大深度等于 2,并对算法进行评分。

    from sklearn.model_selection import train_test_split
    from sklearn import tree
    
    # 拆分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
    
    # 调用决策树分类算法
    dtc = tree.DecisionTreeClassifier(max_depth=2)
    dtc.fit(X_train, y_train)
    
    # 算法评分
    print('训练得分:', dtc.score(X_train, y_train))
    print('测试得分:', dtc.score(X_test, y_test))
    训练得分:0.9172932330827067
    测试得分:0.8666666666666667

    从上面的结果可以看出,决策树算法的训练得分和测试得分都还不错。

    假如设置 max_depth = 1,那么算法评分很低,就会出现欠拟合的问题。

    假如设置 max_depth = 10,那么虽然算法的评分变高了,但是决策树变得过于复杂,就会出现过拟合的问题。

    关于模型复杂度的问题讨论,可以参考:模型越复杂越好吗?

    4. 决策边界

    为了更加直观地看到算法的分类效果,我们定义一个绘制决策边界的函数,画出分类的边界线。

    from matplotlib.colors import ListedColormap
    
    # 定义绘制决策边界的函数
    def plot_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
        )
        X_new = np.c_[x0.ravel(), x1.ravel()]
        
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
        
        custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
        
        plt.contourf(x0, x1, zz, cmap=custom_cmap)
        
    # 绘制决策边界
    plot_decision_boundary(dtc, axis=[11, 15, 0, 6])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.scatter(X[y==2, 0], X[y==2, 1])
    plt.show()

    从图中也可以直观地看出,大部分数据点的分类是基本准确的,这也说明决策树算法的效果还不错。

    5. 树形图

    为了能够更加直观地理解决策树算法,我们可以用树形图来展示算法的结果。

    # 导入相关库,需要先安装 graphviz 和 pydotplus,并在电脑中 Graphviz 软件
    import pydotplus
    from sklearn.tree import export_graphviz
    from IPython.display import Image
    from io import StringIO
    
    # 将对象写入内存中
    dot_data = StringIO()
    
    # 生成决策树结构
    tree.export_graphviz(dtc, class_names=wine.target_names,
                         feature_names=[wine.feature_names[0], wine.feature_names[6]],
                         rounded=True, filled=True, out_file = dot_data)
    
    # 生成树形图并展示出来
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    Image(graph.create_png())

    6. 结果解读

    从上面的树形图来看,在葡萄酒数据的训练集中,有 133 个数据,划分为 3 个类别,数量分别是 43、50、40 个,对应的标签分别是 class_0、class_1、class_2,其中 class_1 的数量最多,所以最上面的根节点认为,类别为 class_1 的可能性最大,Gini 系数为 0.664,它是利用下面的公式计算出来的:

    1 - (43/133)**2 - (50/133)**2 - (40/133)**2

    在决策树算法中,Gini 系数代表样本的不确定性。当每个类别的数量越趋近于平均值,Gini 系数就越大,也就越不确定。

    比如扔硬币的游戏,在一般情况下,正反两面的概率都是 50%,此时 Gini 系数等于 0.5,你猜中的概率也是 50%;假如你对硬币做了手脚,把两面都变成正面图案,此时Gini 系数等于 0, 也就是说,不确定性为 0,你能明确地知道肯定是正面。

    在上面葡萄酒的例子中,当黄酮量 <= 1.575 时,有 49 个样本,3 个类别的数量分别是 0、9、40 个,其中 class_2 的数量最多,Gini 系数为 0.3,比上面的节点要低,说明分类结果变得更加确定。当酒精量 > 12.41 时,有 39 个样本,3 个类别的数量分别是 0、2、37个,Gini 系数为 0.097,此时分类结果变得更加确定为 class_2。

    树形图中其他节点的结果含义类似,在此不再赘述。

    小结

    本文介绍了决策树算法的应用,以葡萄酒数据集为例,演示了决策树算法的实现过程,绘制了直观易懂的决策边界和树形图,并对决策结果做了详细解读。

    虽然决策树算法有很多优点,比如高效、易懂,但是也有它的不足之处,比如当参数设置不当时,很容易出现过拟合的问题。

    为了避免决策树算法出现过拟合的问题,可以使用「集成学习」的方法,融合多种不同的算法,也就是俗话讲的「三个臭皮匠,赛过诸葛亮」。

    关于「集成学习」的方法,本文限于篇幅,这里就不多做介绍了,我下次再写。

    作者:林骥,公众号 ID:linjiwx,从 2008 年开始从事数据分析工作,网名数据化分析,用数据化解分析难题,让数据更有价值,让分析更有效。敬请关注。

    展开全文
  • HashMap中红黑TreeNode的split方法源码解读,对split方法源码的上下文/变量定义,及所调用的关键方法都给出了详细解释说明,欢迎指正
  • 决策的绘制与图像解读

    千次阅读 2021-04-23 16:15:24
    决策 决策的显示结果 可以看到,满足petal width <= 0.75的样本,其三种标签值的样本数分别为[39, 0, 0],也就是说,只要满足这个条件,它的结果是确定的,因此交叉熵为0

    1 决策树的绘制

    可以调用 sklearn.tree.plot_tree 方法绘制决策树,不用像之前那样保存为dot格式文件再转化,而是可以直接绘制

    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    from sklearn import datasets
    from sklearn import tree
    import matplotlib.pyplot as plt
    
    # 导入数据
    iris = datasets.load_iris()
    X = iris['data']
    y = iris['target']
    feature_names = iris.feature_names
    
    # 划分数据
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state  = 1024)
    
    # 决策树实例化、拟合、预测
    clf = DecisionTreeClassifier(criterion='entropy')
    clf.fit(X_train,y_train)
    y_ = clf.predict(X_test)
    
    # 指定图幅大小
    plt.figure(figsize=(18,12))
    
    # 绘制图像
    _ = tree.plot_tree(clf,filled = True,feature_names=feature_names) # 由于返回值不重要,因此直接用下划线接收
    plt.show()
    
    # 保存图像
    plt.savefig('./tree.jpg')
    

    输出
    在这里插入图片描述
    因为scikit-learn是基于numpy,scipy和matplotlib开发的模块,这三个库中,只有matplotlib有绘图功能,因此可以使用matplotlib中的方法设定图幅大小并显示。
    程序运行结束之后,会在当前目录下多出一个“tree.jpg”的文件

    最后显示的图可以看到,根据驯良数据得到的决策树,如果按照数据结构中的标准是6层,但这里我们不考虑叶节点,那么该决策树的深度为5。

    2 图像解读

    为了便于分析决策树的显示结果,我们这里只绘制1层,代码为

    _ = tree.plot_tree(clf,filled = True,feature_names=iris.feature_names,max_depth=1)
    # max_depth表示绘制的最大深度,最大深度不包含叶子节点,
    # 如果max_depth是1,则按数据结构中的标准是2层
    # 有可能决策树不止1层,但这里只绘制一层
    

    我们对输出的结果进行解读
    对于每个划分点,有四条信息,分别为划分依据、当前交叉熵(如果没指定交叉熵,则为基尼系数,基尼系数的计算看本博客第三节),当前样本数,各类样本的数量
    对于每个叶子节点,其比划分节点少一条信息,即划分依据,除此之外其他三条信息都一样。
    在这里插入图片描述
    如果在实例化决策树类的时候,不对树的深度加以限制,那么将会把样本划分到交叉熵(或基尼系数)为0为止。

    为何第一个节点要按照 petal width > 0.75 进行裂分?
    因为CART算法,具体参考《机器学习算法导论》王磊、王晓东

    3 限制图像的深度

    基尼系数的计算公式
    在这里插入图片描述

    这里我们使用基尼系数,并且限制图像深度

    clf = DecisionTreeClassifier(criterion='gini', max_depth=3)
    clf.fit(X_train,y_train)
    
    plt.figure(figsize=(12,10))
    _ = tree.plot_tree(clf,filled=True,feature_names = feature_names)
    plt.show()
    

    输出
    在这里插入图片描述
    可以看到,由于限定了树的深度,使得叶子结点的基尼系数并非都为0,只有第二层的叶子结点基尼系数为0

    展开全文
  • 去年的 教材解读 PPT 长春版PPT课件.PPT
  • 昆明理工大学信息工程与自动化学院学生实验报告 201 201 学年 第 1 学期 课程名称人工智能 开课实验室 年 月 日 年级专业 班 学号 姓名 成绩 实验项目名称 天气决策 指导教师 教 师 评 语 该同学是否了解实验原理 ...
  • 决策算法解读即实例应用

    千次阅读 2018-10-07 09:59:06
    决策ID3算法 决策/判定(decision tree) 判定是一个类似于流程图的结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。的最顶层是根结点。 决策...
  • 解读决策与随机森林模型的概念.docx
  • 、二叉树、二分搜索解读

    千次阅读 2018-10-22 22:25:38
    二、及二叉树 1.结构图示 2.的一些基本概念 1、结点:中的数据元素都称之为结点 2、根:最上面的结点称之为根,一颗只有一个根且由根发展而来,从另外一个角度来说,每个结点都可以认为是其子树的...
  • 小学语文综合性学习课程标准解读知识.pptx
  • 红黑树解读与Java实现

    千次阅读 2019-05-03 22:50:55
    红黑树解读与Java实现 概要 目录 红黑的介绍 红黑的应用 红黑的时间复杂度和相关证明 红黑的基本操作,左右旋 红黑的基本操作,添加与调整 红黑的基本操作,删除与调整 一、红黑的介绍 什么是红黑...
  • 小学语文综合性学习课程标准解读知识PPT学习教案.pptx
  • 高中数学新课程标准解读桓台一中巩鹏PPT学习教案.pptx
  • 训练自己的数据集 感谢 大佬的开源!!! DataXujing 我们以训练YOLOv4-P7为例,介绍如何基于Scaled YOLOv4训练自己的数据集 0.环境配置 python3.7 cuda 10.2 pytorch==1.6.0 torchvision==0.7.0 ...
  • 新娘》是著名美籍印度裔移民女作家芭拉蒂·穆克尔吉小说创作的成熟之作。小说通过主人公塔拉的寻根之旅,再现了殖民霸权、父权制度及阶级压迫对女性,特别是第三世界女性的摧残与迫害,探讨了殖民阴霾下女性意识...
  • AVL —— 个人解读

    2021-11-11 19:31:06
    AVL平衡二叉树二级目录三级目录 平衡二叉树 对于任意一个节点,左子树和右子的高度差不能为超过1 平衡二叉树的高度和节点数量,之间的关系也是O(logn)的 二级目录 三级目录
  • 主成分分析pca图解读,主成分分析散点图解读,主成分分析(PCA)原理详解1. 相关背景在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律。多变量大样本无疑会为...
  •  此外,设立WLAN无线网络技术需要考虑很多因素:需要连接的建筑物必须要能保持明确的视线,因此,像高大的树木和建筑物等障碍物都会直接影响无线电波的传输。在减少带宽的情况下,可以增加建筑物之间的传输距离,...
  • 进化讲解.ppt

    2018-04-23 13:26:16
    普通高等教育“十二五”规划教材-生物信息学 第九章:分子进化与系统发育
  • 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制; 一.核心源程序的文件组织:  1.Linux核心源程序通常都安装在/usr/src/linux...
  • 平衡二叉树(AVL)深入解读

    千次阅读 多人点赞 2016-08-06 18:10:33
    平衡二叉树又称AVL性质:它或者是颗空,或者是具有下列性质的二叉树: 它的左子树和右子都是平衡二叉树,且左子树和右子的深度之差的绝对值不超过1。 若将二叉树节点的平衡因子BF定义为该节点的左子树的深度...
  • 对生成协议的精细解读,包含了生成的发展的过程中诞生的协议,以及各协议之间的关系
  • 什么是“赫夫曼” 什么是“赫夫曼编码”

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,913
精华内容 12,765
关键字:

关于树的解读