Python 决策树计算熵、gini系数、误分率
·
决策树算法中,熵、基尼系数和误分率是三种常用的特征划分标准,用于评估数据集的纯度或不纯度。
核心概念与计算公式
信息熵
信息熵用于度量随机变量的不确定性,其计算公式为:
基尼系数越小,表示数据集的纯度越高。
误分率
误分率表示错误分类的概率,计算公式为:
import numpy as np
from math import log
def calc_entropy(data_set):
"""
计算给定数据集的信息熵
"""
num_entries = len(data_set)
if num_entries == 0:
return 0
# 统计各类别出现次数
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
def calc_gini(data_set):
"""
计算给定数据集的基尼系数
"""
num_entries = len(data_set)
if num_entries == 0:
return 0
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
# 计算基尼系数
gini = 1.0
for key in label_counts:
prob = float(label_counts[key]) / num_entries
gini -= prob ** 2
return gini
def calc_error_rate(data_set):
"""
计算给定数据集的误分率
"""
num_entries = len(data_set)
if num_entries == 0:
return 0
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
# 找到最大概率的类别
max_prob = 0
for key in label_counts:
prob = float(label_counts[key]) / num_entries
if prob > max_prob:
max_prob = prob
return 1 - max_prob
def split_data_set(data_set, axis, value):
"""
按照给定特征划分数据集
"""
ret_data_set = []
for feat_vec in data_set:
if feat_vec[axis] == value:
reduced_feat_vec = feat_vec[:axis]
reduced_feat_vec.extend(feat_vec[axis+1:])
ret_data_set.append(reduced_feat_vec)
return ret_data_set
def calc_info_gain(data_set, axis):
"""
计算指定特征的信息增益
"""
base_entropy = calc_entropy(data_set)
# 获取该特征的所有可能值
feat_list = [example[axis] for example in data_set]
unique_vals = set(feat_list)
new_entropy = 0.0
for value in unique_vals:
sub_data_set = split_data_set(data_set, axis, value)
prob = len(sub_data_set) / float(len(data_set))
new_entropy += prob * calc_entropy(sub_data_set)
info_gain = base_entropy - new_entropy
return info_gain
def calc_gini_gain(data_set, axis):
"""
计算指定特征的基尼增益
"""
base_gini = calc_gini(data_set)
feat_list = [example[axis] for example in data_set]
unique_vals = set(feat_list)
new_gini = 0.0
for value in unique_vals:
sub_data_set = split_data_set(data_set, axis, value)
prob = len(sub_data_set) / float(len(data_set))
new_gini += prob * calc_gini(sub_data_set)
gini_gain = base_gini - new_gini
return gini_gain
def demo_metrics():
"""
演示三种指标的计算
"""
# 示例数据集:前两列为特征,最后一列为类别标签
test_data = [
[1, 1, 'A'],
[1, 1, 'A'],
[1, 0, 'B'],
[0, 1, 'B'],
[0, 1, 'B']
]
print("示例数据集:")
for data in test_data:
print(data)
print(f"\n信息熵: {calc_entropy(test_data):.4f}")
print(f"基尼系数: {calc_gini(test_data):.4f}")
print(f"误分率: {calc_error_rate(test_data):.4f}")
# 计算各特征的信息增益和基尼增益
num_features = len(test_data[0]) - 1
for i in range(num_features):
info_gain = calc_info_gain(test_data, i)
gini_gain = calc_gini_gain(test_data, i)
print(f"\n特征 {i} 的信息增益: {info_gain:.4f}")
print(f"特征 {i} 的基尼增益: {gini_gain:.4f}")
if __name__ == "__main__":
demo_metrics()
算法特点与应用场景
信息熵对取值数目较多的特征有所偏好,而基尼系数在计算上相对简单。在实际应用中,基尼系数通常作为默认的划分标准。信息增益的计算公式为
,即划分前后信息熵的减少量。
该代码实现了决策树中三种主要纯度指标的计算方法,包括信息熵、基尼系数和误分率,并提供了信息增益和基尼增益的计算功能,可用于决策树算法的特征选择过程。
更多推荐


所有评论(0)