一、信息增益
信息熵: (样本集D中第k类样本所占比例为) Ent(D)值越小,则D的纯度越高
信息增益: 信息增益越大,则利用属性a来划分所获得的‘纯度提升’越大
二、增益率
增益率:
属性a的可能取值数目越多,IV(a)的值通常越大
增益率对可取数目较少的属性有所偏好,不直接选择增益率最大的,而是先从候选划分属性中找出信息增益高于平均水平的属性
三、基尼指数
基尼值: Gini(D)越小,则数据集D的纯度越高
属性a的基尼指数:
四、西瓜例子
以西瓜数据集为例
编号 色泽 根蒂 敲声 纹理 脐部 触感 好瓜
1 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是
2 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是
3 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是
4 青绿 蜷缩 沉闷 清晰 凹陷 硬滑 是
5 浅白 蜷缩 浊响 清晰 凹陷 硬滑 是
6 青绿 稍蜷 浊响 清晰 稍凹 软粘 是
7 乌黑 稍蜷 浊响 稍糊 稍凹 软粘 是
8 乌黑 稍蜷 浊响 清晰 稍凹 硬滑 是
9 乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑 否
10 青绿 硬挺 清脆 清晰 平坦 软粘 否 11 浅白 硬挺 清脆 模糊 平坦 硬滑 否
12 浅白 蜷缩 浊响 模糊 平坦 软粘 否
13 青绿 稍蜷 浊响 稍糊 凹陷 硬滑 否
14 浅白 稍蜷 沉闷 稍糊 凹陷 硬滑 否
15 乌黑 稍蜷 浊响 清晰 稍凹 软粘 否
16 浅白 蜷缩 浊响 模糊 平坦 硬滑 否
17 青绿 蜷缩 沉闷 稍糊 稍凹 硬滑 否
import numpy as np
import pandas as pd
import math
data = pd.read_csv('watermalon.csv')
熵的计算函数:
def info(x,y):
if x != y and x != 0:
# 计算当前情况的熵
return -(x/y)*math.log2(x/y) - ((y-x)/y)*math.log2((y-x)/y)
if x == y or x == 0:
# 纯度最大,熵值为0
return 0
信息增益计算:(选择信息增益大的作为分类属性)
#根蒂的信息增益
gendi_entropy = (8/17)*info(5,8)+(7/17)*info(3,7)+(2/17)*info(0,2)
gain_col = info_D - gendi_entropy
#敲声的信息增益
qiaosheng_entropy = (10/17)*info(6,10)+(5/17)*info(2,5)+(2/17)*info(0,2)
info_gain = info_D - qiaosheng_entropy
#纹理的信息增益
wenli_entropy = (9/17)*info(7,9)+(5/17)*info(1,5)+(3/17)*info(0,3)
info_gain = info_D - wenli_entropy
根蒂的信息增益:0.142674959566 敲声的信息增益:0.140781433614 纹理的信息增益:0.380591897368
基尼指数计算:(选择基尼指数小的作为分类属性)
def info(x,y):
if x != y and x != 0:
return 1 - (x/y)*(x/y) - ((y-x)/y)*((y-x)/y)
if x == y or x == 0:
return 0
gendi_Gini=(8/17)*gini(5,8)+(7/17)*gini(3,7)+(2/17)*gini(0,2)
qiaosheng_Gini=(10/17)*gini(6,10)+(5/17)*gini(2,5)+(2/17)*gini(0,2)
wenli_Gini = (9/17)*gini(7,9)+(5/17)*gini(1,5)+(3/17)*gini(0,3)
根蒂的基尼指数:0.42226891 敲声的基尼指数:0.42352941 纹理的基尼指数:0.27712419
五、分析总结
总结:
信息增益倾向于选择取值较多的特征,可以通过增加数据的多样性来减少信息的不确定性;基尼指数在小数据上表现更稳定,关注的是数据集的不纯度
通常在分类问题上使用信息增益较多,回归问题使用基尼指数较多
数据集小、特征取值分布不均匀,基尼指数较好;数据集大、特征取值分布均匀,信息增益较合适