《李宏毅机器学习》task7
一、信息论基础
熵是用来衡量一个系统混论程度的物理量,代表一个系统中蕴含多少信息量,信息量越大表明一个系统不确定性就越大,就存在越多的可能性。
- 信息熵便是信息的期望值,可以记作:
- 条件熵
- 信息增益
- 信息增益率
- 基尼指数
二、决策树的不同分类算法
算法 | 支持模型 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|---|
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分类 | 多叉树 | 信息增益比 | 支持 | 支持 | 支持 |
CART | 分类/回归 | 二叉树 | 基尼系数,均方差 | 支持 | 支持 | 支持 |
- ID3
由于期望信息越小,信息增益越大,从而纯度越高,因此ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。 - C4.5
ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。 - CART
ID3中根据属性值分割数据,之后该特征不会再起作用,这种快速切割的方式会影响算法的准确率。CART是一棵二叉树,采用二元切分法,每次把数据切成两份,分别进入左子树、右子树。而且每个非叶子节点都有两个孩子,所以CART的叶子节点比非叶子多1。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。
三、计算信息熵
import numpy as np
import pandas as pd
def cancShannonEnt(dataSet):
'''
:param dataSet: dataSet
:return: shannonEnt
'''
# 计算公式前,注意数据的格式(array)
numEntries = len(dataSet) # 获取数据的行数
labelCounts = { } # 设置字典数据格式,想要存储的数据格式为:类别:频数
for featVec in dataSet: # 获取数据集每一行的数据
currentLabel = featVec[-1] # 获取特征向量的最后一列
# 检查字典中key是否存在
# 如果key不存在
if currentLabel not in labelCounts.keys():
# 将当前的标签存于字典中,并将频数置为0
labelCounts[currentLabel] = 0
# 如果key存在,在当前的键值上+1
labelCounts[currentLabel] +=1
# 数据已准备好,计算熵
shannonEnt = 0.0 # 初始化信息熵
for key in labelCounts: # 遍历出数据中所的类别
pro = float(labelCounts[key]) /numEntries
shannonEnt -= pro * np.log2(pro) # 计算信息熵
return shannonEnt # 返回信息熵
dataSet = pd.read_csv('watermelon_3a.csv')
dataSet = np.array(dataSet.values)
shannon = cancShannonEnt(dataSet)
print(shannon)
结果: