决策树算法中,熵、基尼系数和误分率是三种常用的特征划分标准,用于评估数据集的纯度或不纯度。

核心概念与计算公式
信息熵
信息熵用于度量随机变量的不确定性,其计算公式为:

基尼系数越小,表示数据集的纯度越高。

误分率
误分率表示错误分类的概率,计算公式为:


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()


算法特点与应用场景
信息熵对取值数目较多的特征有所偏好,而基尼系数在计算上相对简单。在实际应用中,基尼系数通常作为默认的划分标准。信息增益的计算公式为 
,即划分前后信息熵的减少量。
该代码实现了决策树中三种主要纯度指标的计算方法,包括信息熵、基尼系数和误分率,并提供了信息增益和基尼增益的计算功能,可用于决策树算法的特征选择过程。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐