信息熵(香浓熵)
是一种信息的度量方式,表示信息的混乱程度,也就是说:信息越有序,信息熵越低。定义如下:
KaTeX parse error: Expected group after '_' at position 14: Ent(D)=−\sum_̲\limits{k=1}^yp…
其中满足:
0 ⩽ H ( p ) ⩽ l o g 2 n 0⩽H(p)⩽log_2n 0⩽H(p)⩽log2n, 这里 H ( p ) H(p) H(p) 等同于 E n t ( D ) Ent(D) Ent(D)。
相对熵
相对熵又称KL散度,如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度来衡量这两个分布的差异。
交叉熵
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ D_{KL}(p||q) &…
等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵。
在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即 D K L ( y ∣ ∣ y ^ ) D_{KL}(y||\hat{y}) DKL(y∣∣y^),由于KL散度中的前一部分不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
信息增益
条件熵代表在某一个条件下,随机变量的复杂度(不确定度)。
信息增益=信息熵-条件熵,代表了在一个条件下,信息复杂度(不确定性)减少的程度。
ID3算法
以信息增益为准选择决策树的属性
C4.5算法
信息增益准则对可取值数目较多的属性有所偏好,所有C4.5算法不直接信用信息增益,而是使用增益率,其定义如下:
KaTeX parse error: Expected group after '_' at position 62: …V(a) = - \sum^V_̲\limits{v=1}\fr…
CART算法
使用基尼指数划分属性,定义如下:
KaTeX parse error: Expected group after '_' at position 21: …{index}= \sum^V_̲\limits{v=1} \f…
G
i
n
i
(
D
)
Gini(D)
Gini(D)反映了从数据集
D
D
D中随机抽取两个样本,其类别标记不一致的概率。因此
G
i
n
i
(
D
)
Gini(D)
Gini(D)越小,则数据集
D
D
D的纯度越高。
剪枝
- 预剪枝:在构造决策树的同时进行剪枝,对每个节点进行划分前的估计,如果不能带来决策树泛化性能的提升则停止划分并将当前节点标记为叶节点。预剪枝有带来欠拟合的风险。
- 后剪枝:决策树构造完成后进行剪枝,自底向上对非叶节点考察,如果该节点的子树替换为子树的叶节点可以提升泛化性能,则替换该子树为其叶节点。后剪纸的欠拟合风险很小,泛化性能通常优于预剪枝,但计算量大,训练时间较长。
计算香浓熵
import numpy as np
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
# 数据已准备好,计算熵
print(labelCounts)
shannonEnt = 0.0 # 初始化信息熵
for key in labelCounts: # 遍历出数据中所的类别
pro = float(labelCounts[key]) /numEntries
shannonEnt -= pro * np.log2(pro) # 计算信息熵
#print(pro * np.log2(pro))
return shannonEnt # 返回信息熵
import pandas as pd
data=pd.read_csv("watermelon_3a.csv",header=0)
data1=data.values.tolist()
#print(data1)
cancShannonEnt(data1)