(决策树中的)信息熵和样本分类的信息熵计算源代码

目录

一、信息熵

① 基本概念

② 计算公式

二、决策树中的信息熵

三、计算数据集样本分类的香农熵的源代码


说明:由于对这部分的知识有所遗忘,因此翻阅资料进行温习,写下本文。

需要注意的是,在本文中,所有中括号里边的内容,纯属个人理解,望读者包涵。


一、信息熵

① 基本概念

用来衡量一个随机变量出现的期望值【一个决策由很多随机向量共同决定,这些随机向量就是人决定每一件事中考虑的各个因素】。一个变量的信息熵越大,那么它蕴含的情况就越多【即这个因素还和其他许多因素关联,越早处理这个因素越好决断,否则最后处理,照样会让你头疼,因为你已经把其他因素决断完了,当考虑到这个因素时,又不得不重新考虑其他因素,这样大概率会导致你决断上的失误】,也就是需要更多的信息才能完全确定它。

香农这样认为:信息就是对不确定性得消除,一般而言,当某种信息出现更高概率时,表明它被传播得更广泛,或者说被引用的程度更高。

香农第一次提出信息熵的概念,所以信息熵和香农熵的表达一毛一样...


② 计算公式

对于多分类问题,延申一下得出公式了。在如下的决策树中,还可以用某类特征的数据的长度/总数据的长度代表发生的概率,即频率代表概率,p 这个概念具体场景下含义不同,可以灵活使用。

注意:本文提到的一个特征或一个分类也可以叫做一个随机变量(收入),这个随机变量可以有不同的取值(高低);一个随机变量通俗来说,就是决策一个事物需要考虑的一个因素。


二、决策树中的信息熵

在决策树中,信息熵不仅能用来度量类别的不确定性,还可以用来度量包含不同特征的数据样本与类别的不确定性。某个特征列向量的信息熵越大,则该向量的不确定性就越大【这里就很好理解了,特征列向量就是我们提到的影响人考虑的决策的各个因素】,也就是其混乱程度越大,越应该优先考虑从该特征向量入手进行划分【我的理解,因为构造决策树的关键是在于分裂属性,其中,分裂属性就是在某个节点(节点是所有数据在此处的分类依据,这个依据就是某一特征)按照某一特征的不同划分(流到这里的数据集根据节点上的特征进行划分,如年龄特征,继而裂变为各个子集,如青年集、中年集和老年集,这些集合流向下一个特征节点,反复按这个逻辑进行)构造不同的分支,它的目标是让各个裂变子集尽可能的纯(属于同一类,比如今中午都决定买海鲜吃的人群,或都不买海鲜吃的人群),也就是属于同一类,因此,最先划分信息熵大的特征向量做出决策的效率更高】。

举个例子:如果预测某客户中午买不买海鲜吃,[年龄] 这个变量蕴含的情况就特别多(当然实际多不多,得靠计算信息熵计算),年龄分为青年、中年、老年,某个年龄段的人吃不吃或许要看收入的高低,每个收入的人群或许要看是否是学生,学生中又要看性别来决策,太多信息了。如果直接按 [收入] 这个变量划分,可能就会好一点。信息熵就是为我们选取决策树中最适合最先划分的特征。


三、计算数据集样本分类的香农熵的源代码

说明:

1、求解各个分类特征的信息熵,比如收入,它分为高和低,但收入高的不是全都吃海鲜的,收入低的不是全不吃海鲜的,在编码上更加复杂,我将在下篇文章中详述。

2、以下源码和注解为原创,如有不当或疑惑之处,可在评论区留言告知。


源代码:

from numpy import *


# 本文源码只求样本分类的信息熵,仅为了说明信息熵的求解方法
# 对于如何求解各个类别特征的信息熵和如何构造决策树,将在后续文章详述

def calculate_xns(dataset, n):
    """
    计算给定数据集的香农熵(信息熵)
    :param dataset:数据集
    :param n:数据集的第n个特征,默认取-1,即数据集中每个样本的标签
    :return:数据集的香农熵
    """
    xns = 0.0  # 香农熵
    num = len(dataset)  # 样本集的总数,用于计算分类标签出现的概率

    # 1、将数据集样本标签的特征值(分类值)放入列表
    all_labels = [c[n] for c in dataset]  # c[-1]:即取数据集中的每条数据的标签:吃或不吃
    # print(all_labels)  # 得到 [吃,吃,不吃,不吃,不吃,不吃] 的结果
    # 2、按标签的种类进行统计,吃这一类2个;不吃这一类4个
    every_label = {}  # 以词典形式存储每个类别(键)及个数(值), 如{吃:2,不吃:4}
    for item in set(all_labels):  # 对每个类别计数,并放入词典, 其中set(all_labels) = [吃,不吃]
        every_label[item] = all_labels.count(item)
    # 计算样本标签的香农熵,即数据集的香农熵
    for item2 in every_label:
        prob = every_label[item2] / num  # 每个特征值出现的概率
        xns -= prob * log2(prob)  # xns是全局变量,这样就可以计算关于决策的要考虑的某个随机变量(如收入特征)的香农熵
    return xns


# 问题描述:如何求解数据集样本分类的信息熵?

# 如下列是已知的统计数据(如果有大数据更好):
# 第一列特征是学生(Yes:是,No:不是)
# 第二列特征是性别(Yes:男,No:女)
# 第三列特征是收入(Yes:高,No:低)
# 第四列是每个样本最终的分类标签(吃海鲜或不吃海鲜)

data = [['Yes', 'Yes', 'Yes', "吃"],
        ['No', 'No', 'Yes', "吃"],
        ['No', 'Yes', 'No', "不吃"],
        ['No', 'No', 'No', "不吃"],
        ['No', 'Yes', 'No', "不吃"],
        ['No', 'No', 'No', "不吃"]]

# 打印数据集样本分类的信息熵
print("数据集样本分类的信息熵%s" % (calculate_xns(data, -1)))  # 0.9182958340544896

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_40506723/article/details/127156554
今日推荐