我是靠谱客的博主 等待心情,最近开发中收集的这篇文章主要介绍信息增益,信息增益率,Gini,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在使用决策树的时候,我们通常通过信息增益,信息增益率,Gini三个指标来选择特征,下面详细介绍这三个指标。

http://blog.csdn.net/xuxurui007/article/details/21788551

为什么ID3在以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题,而C4.5以信息增益率作为选择特征的方法时,就会有效避免这个问题,举一个极端的例子,以ID作为特征的时候,每一个类别只有一个数据,ID作为特征的熵就是0,那么ID就是最好的特征。学习连接如下:
学习连接

#-*-coding:utf8-*-
import pandas as pd
from itertools import groupby
import math
def count_entroy(data):
    """
    计算信息熵
    :param data:原始数据
    :return:信息熵
    """
    #对数据进行groupby
    lenght=len(data)
    result_entroy=0
    result = groupby(sorted(data))
    for key, group in result:
        class_num=len(list(group))
        result_entroy=result_entroy-(class_num/lenght)*math.log(class_num/lenght,2)
    return result_entroy
def count_group(data):
    """
    计算信息熵
    :param data:原始数据
    :return:信息熵
    """
    #对数据进行groupby
    key_num={}
    lenght=len(data)
    result = groupby(sorted(data))
    for key, group in result:
        key_num[key[0]]=len(list(group))/lenght
    return key_num
def count_fenmu(key_num):
    """
    计算信息增益比的分母
    :param key_num:groupby的结果
    :return:
    """
    values=key_num.values()
    lenght=sum(key_num.values())
    result=0
    for value in values:
        result=result-(value/lenght)*(math.log(value/lenght,2))
    return result
all_data=pd.read_csv("E:/协和问答系统/SenLiu/熵测试数据.csv")
lenght=len(all_data.T.index)
all_entroy=count_entroy(all_data.iloc[:,[-1]].values)
for i in range(lenght-1):
    key_num=count_group(all_data.iloc[:,[i]].values)
    feature_entroy=0
    for key in key_num.keys():
        feature_data=all_data.iloc[:,[i,-1]][all_data[all_data.T.index[i]]==key]
        feature_entroy=feature_entroy+key_num[key]*(count_entroy(feature_data.iloc[:,[-1]].values))
        # print(count_entroy(feature_data.iloc[:,[-1]]),key_num[key]*(count_entroy(feature_data.iloc[:,[-1]].values)))
    feature_all_entroy=all_entroy-feature_entroy
    #计算信息增益比的分母(特征熵)
    print("信息增益",feature_all_entroy)
    print("信息增益比",feature_all_entroy/count_fenmu(key_num))

数据来源是李航的统计学习方法决策树里面的计算方式。
cart使用gini系数进行分类代码如下:

#-*-coding:utf8-*-
import pandas as pd
from itertools import groupby
def count_entroy(data):
    """
    计算gini系数
    :param data:原始数据
    :return:GINI值
    """
    #对数据进行groupby
    lenght=len(data)
    result_entroy=0
    result = groupby(sorted(data))
    for key, group in result:
        class_num=len(list(group))
        result_entroy=result_entroy+(class_num/lenght)*(1-class_num/lenght)
    return result_entroy
def count_group(data):
    """
    数据进行groupby
    :param data:原始数据
    :return:字典存储groupby结果
    """
    #对数据进行groupby
    key_num={}
    lenght=len(data)
    result = groupby(sorted(data))
    for key, group in result:
        key_num[key[0]]=len(list(group))/lenght
    return key_num
all_data=pd.read_csv("E:/协和问答系统/SenLiu/熵测试数据.csv")
lenght=len(all_data.T.index)
for i in range(lenght-1):
    key_num=count_group(all_data.iloc[:,[i]].values)
    for key in key_num.keys():
        feature_data=all_data.iloc[:,[i,-1]][all_data[all_data.T.index[i]]==key]
        gini_true=count_entroy(feature_data.iloc[:,[-1]].values)
        feature_other_data = all_data.iloc[:, [i, -1]][all_data[all_data.T.index[i]] != key]
        gini_False = count_entroy(feature_other_data.iloc[:,[-1]].values)
        gini_all=key_num[key]*gini_true+(1-key_num[key])*gini_False
        print(key,gini_all)

实验结果如下:

"C:Program FilesAnaconda3python.exe" D:/pycharmprogram/csgwork/find_keysword/cart_count.py
青年 0.44000000000000006
中年 0.48
老年 0.440000000000000060.319999999999999950.320.266666666666666660.26666666666666666
一般 0.32000000000000006
非常好 0.36363636363636370.4740740740740741

Process finished with exit code 0

最后

以上就是等待心情为你收集整理的信息增益,信息增益率,Gini的全部内容,希望文章能够帮你解决信息增益,信息增益率,Gini所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部