一、信息熵
信息熵是度量样本集合的无序程度的一种指标。如果一个样本集合的纯度较高,那么熵值就比较小;反之,如果一个样本集合的纯度比较低,那么熵值就比较大。 设样本集合 D 中第 k 类样本所占的比例为 pk(k=1,2,…,|y|),则 D 的信息熵的计算公式为:
def calc_entropy(data_set):
num_entries = len(data_set)
label_counts = {}
for feat_vec in data_set:
current_label = feat_vec[-1]
if current_label not in label_counts.keys():
label_counts[current_label] = 0
label_counts[current_label] += 1
entropy = 0.0
for key in label_counts:
prob = float(label_counts[key])/num_entries
entropy -= prob * log(prob, 2)
return entropy
二、信息增益
信息增益是指在得知样本特征 X 的信息所能提供的关于样本类别的信息量,它的计算公式为类别标签的信息熵H(Y)减去在特征 X 已知条件下类别标签的条件熵H(Y|X),用数学式子表示即: 信息增益越大,表示特征对样本分类的重要性越高。在构造决策树时,我们选择信息增益最大的特征作为当前节点对数据进行划分,重复该步骤,直到划分完毕。
def calc_info_gain(data_set, base_entropy, feat_idx):
num_entries = len(data_set)
feat_vals = [example[feat_idx] for example in data_set]
unique_vals = set(feat_vals)
new_entropy = 0.0
for value in unique_vals:
sub_set = split_data_set(data_set, feat_idx, value)
prob = len(sub_set)/float(num_entries)
new_entropy += prob * calc_entropy(sub_set)
info_gain = base_entropy - new_entropy
return info_gain
三、信息增益率
信息增益率在选择划分属性时对可选择的属性数进行了惩罚,避免选择取值数目较多的属性,即会将其权值进行降低,计算公式为: 用信息增益率来选择属性时,先从候选划分属性中找出所有能使信息增益高于平均水平的属性,再从中选择信息增益率最高的。
def calc_info_gain_ratio(data_set, base_entropy, feat_idx):
num_entries = len(data_set)
feat_vals = [example[feat_idx] for example in data_set]
unique_vals = set(feat_vals)
new_entropy = 0.0
split_info = 0.0
for value in unique_vals:
sub_set = split_data_set(data_set, feat_idx, value)
prob = len(sub_set)/float(num_entries)
new_entropy += prob * calc_entropy(sub_set)
split_info -= prob * log(prob, 2)
if split_info == 0.0:
return 0.0
info_gain = base_entropy - new_entropy
info_gain_ratio = info_gain / split_info
return info_gain_ratio
四、实例分析
在使用信息增益率算法建立决策树时,在选择初始特征时,根据信息增益率最高的原则,选取了编号为2(有工作?)的属性进行划分,选择该属性的理由是它能将样本集划分成唯一的三个子集,且每个子集的信息熵都比较小。结果如下图所示: 可以看出,经过信息增益率算法构建的决策树比信息增益算法构建的更为简洁,划分效果更好。