当前位置 博文首页 > jcLee95的博客:机器学习 - [源码实现决策树小专题]决策树中,信

    jcLee95的博客:机器学习 - [源码实现决策树小专题]决策树中,信

    作者:[db:作者] 时间:2021-09-18 15:57

    信息增益、信息增益率计算 以及 最佳特征挑选 的Python实现

    JackLee
    CSDN用户名:jcLee95
    代码纯由理论课程闭门造车而来,无抄袭任何博客书籍。如需纠错或想参与讨论的小伙伴,可以给我写邮件。
    邮箱:291148484@163.com


    阅读本文前推荐先阅读:混杂度数值度量的Python编程实现
    阅读本文前推荐先阅读:决策树算法中数据集的划分

    导读:决策树是一种基于信息的学习算法。在决策树算法中需要不断地挑选出最佳特征,而挑选最佳特征地依据就是信息增益率

    增益本身就具有相对地特性,表征某事物从一个状态到另一个状态后,某个指标的变化量。
    在决策树算法中,信息增益指的是依据某个特征的取值划分数据集时数据集划分后相对于划分前,所能导致减少的信息不确定度
    这也就是说信息增益即不确定度的降低值。当我们以信息熵(香浓熵,简称)作为不确定性的度量时,以数据集划分前的原始熵减去数据集划分后的剩余熵得到的值就是信息增益


    【博文1】在我的博文https://blog.csdn.net/qq_28550263/article/details/114892718中已经详尽地介绍了数据集划分的思路、步骤,给出了源代码并举了两个例子。


    【博文2】在我的博文https://blog.csdn.net/qq_28550263/article/details/114883862中,则给出了不确定度的计算方法,其中就包含了基于信息熵(香浓熵)的计算方法和基尼系数的计算方法。


    对于以上内容我们都将用到。

    1. 求解信息增益

    已经准备好的接口

    (1)划分数据集函数(仅展示接口,具体内容请参阅【博文1】)

    def dividing_data_set(date_set,node_feature,node_feature_value):
        """
        划分数据集
        整个划分方法的思想是"记录索引-重索引"。简而言之就是先记住特征取值为指定取值的索引号,然
        后依据记录索引号保对其它特征下同索引号的元素进行保留。最终实现留下当前划分数据条的目的。
    
        Parameters
        ----------
        date_set: "dict"结构的数据集,其中键为”labels“的键值对对应为标签集(源于x_train),其余
                   的对应为特征取值键值对(源于y_train)。
        
        node_feature:可以是num、str等类型,但是必须和date_set中的键的类型保持一致。表示需要划分
                   数据集的节点处对应的特征名。
    
        node_feature_value:是对应与 node_feature 的一个特定取值。
        
        Returns
        -------
        result : dict
            返回子数据集字典,其形式与date_set保持一致。其中键`labels`对应的值类似是子标签集数组。
        """
    

    (2)混杂度求取函数(仅展示接口,具体内容请参阅【博文2】)

    def impurity(anArray, impurity_t="entropy"):
        """
        计算混杂度
        
        Parameters
        ----------
        impurity_t:  str,表示混杂度的度量方式,只能是{"entropy","gini"}中的一个。
        anArray:     an Array like object,由某特征依次对应每条数据下的取值构成。
    
        Return
        result: float
            为计算得到的impurity的数值。
        """
    

    使用实例讲解

    这里采用【博文1】中的例子:

    import numpy as np
    
    # 定义模拟数据
    x_train = np.array([[1, 4, 2, 0, 3, 1, 1, 0, 1, 4, 2, 4, 4, 2, 4, 2, 0, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 3, 1, 3, 1, 3, 1, 1, 0, 1, 4, 3, 4, 4, 2],
           [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 3, 0, 3, 1, 1, 0, 0, 4, 2, 2, 4, 1, 1, 0, -1, 0, 4, 0, -1, -1, 0, 0, 0, 0, 0, 0, 2],
           [4, 2, 2, 3, 1, 2, 1, 1, 0, 2, 1, 1, 1, 0, 3, 0, 3, 2, 2, 0, 0, 0, 0, 3, 1, 1, 2, 3, 4, 3, 1, 1, 3, 1, 2, 1, 1, 0, 1, 2, 2, 1, 0],
           [1, 4, 2, 2, 3, 1, 1, 0, 0, 2, 1, 1, 1, 0, 3, 4, 2, 2, 4, 1, 0, 1, 0, 3, 2, 2, 4, 3, 1, 2, -1, 2, 2, 1, 0, 1, -1, 0, 1, 1, 1, 0, 0],
           [1, 2, 2, 1, 3, 1, 1, 0, 0, 2, 2, 1, 1, 0, 0, 4, 1, 2, 1, 0, 0, 0, 0, 2, 1, 1, 2, 3, 3, 0, -1, 2, 1, 3, 1, 1, 0, 0, 2, 3, 2, 1, 0],
           [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 2, 4, 2, 2, -1, 2, 2, 3, 0, 0, 0, 0, 2, 2, 2, 2, 0],
           [1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 3, 2, 1, 1, 0, 2, 2, 1, 0, 3, 3, 2, 1, 1, 3, 0, -2, -1, -1, 0, 1, 0, 2, 2, 1],
           [0, 0, 3, 3, 2, 0, 0, 0, 0, 3, 3, 3, 0, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, 3, 4, 4, 1, 2, 1, 0, 1