概述
在使用决策树的时候,我们通常通过信息增益,信息增益率,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.44000000000000006
否 0.31999999999999995
是 0.32
否 0.26666666666666666
是 0.26666666666666666
一般 0.32000000000000006
非常好 0.3636363636363637
好 0.4740740740740741
Process finished with exit code 0
最后
以上就是等待心情为你收集整理的信息增益,信息增益率,Gini的全部内容,希望文章能够帮你解决信息增益,信息增益率,Gini所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复