信息增益和信息增益率用于决策树特征选择,基于信息熵计算。1. 信息熵衡量数据混乱程度,公式为H(S) = -Σ(p_i log2(p_i)),Python用entropy函数实现。2. 信息增益IG(S, A) = H(S) - Σ(|S_v|/|S| H(S_v)),表示划分后熵的减少,通过information_gain函数计算特征对标签的分类能力。3. 信息增益率GR(S, A) = IG(S, A) / IV(A),其中IV(A)为特征A的固有值,用于抑制多取值特征偏差,由intrinsic_value函数计算。4. 示例中使用年龄特征计算得信息增益0.083,增益率0.096。5. 函数适用于离散特征,连续特征需预处理分箱。完整实现包含熵、增益、增益率三部分,支持决策树构建中的最优划分选择。

在Python中实现信息增益(Information Gain)和信息增益率(Information Gain Ratio),主要基于信息熵的概念。这两个指标常用于决策树算法(如ID3使用信息增益,C4.5使用信息增益率)中选择最优划分属性。
信息熵的计算
信息熵衡量数据集的混乱程度。假设一个数据集有 C 个类别,每个类别的概率为 p_i,则信息熵定义为:
H(S) = -Σ(p_i * log2(p_i))
注意:当 p_i 为0时,对应项视为0。Python实现如下:
立即学习“Python免费学习笔记(深入)”;
```python import numpy as npdef entropy(y): _, counts = np.unique(y, return_counts=True) probs = counts / len(y) return -np.sum(probs * np.log2(probs + 1e-9)) # 加极小值避免log(0)
信息增益的实现
信息增益表示划分前后熵的减少量。对某个特征 A,其信息增益为:
IG(S, A) = H(S) - Σ(|S_v|/|S| * H(S_v))
其中 S_v 是特征 A 取值为 v 的子集。
代码实现:
```python def information_gain(X, y, feature_idx): original_entropy = entropy(y) values, counts = np.unique(X[:, feature_idx], return_counts=True) weighted_entropy = 0 for value, count in zip(values, counts): subset_indices = X[:, feature_idx] == value subset_entropy = entropy(y[subset_indices]) weighted_entropy += (count / len(y)) * subset_entropy return original_entropy - weighted_entropy
信息增益率的实现
信息增益偏向取值多的特征,因此引入信息增益率进行校正:
GR(S, A) = IG(S, A) / IV(A)
其中 IV(A) 是特征 A 的固有值(Intrinsic Value):
IV(A) = -Σ(|S_v|/|S| * log2(|S_v|/|S|))
完整实现:
```python def intrinsic_value(X, feature_idx): values, counts = np.unique(X[:, feature_idx], return_counts=True) probs = counts / len(X) return -np.sum(probs * np.log2(probs + 1e-9))def information_gain_ratio(X, y, feature_idx): ig = information_gain(X, y, feature_idx) iv = intrinsic_value(X, feature_idx) return ig / iv if iv > 0 else 0
使用示例
假设有一个简单的分类数据集:
```python # 示例数据:X为特征,y为标签 X = np.array([ ['青年', '否', '否', '一般'], ['青年', '否', '否', '好'], ['青年', '是', '否', '好'], ['青年', '是', '是', '一般'], ['中年', '否', '否', '一般'], ['中年', '否', '否', '好'], ['中年', '是', '是', '好'], ['中年', '否', '是', '非常好'], ['老年', '否', '是', '非常好'], ['老年', '否', '是', '好'], ['老年', '是', '否', '好'], ['老年', '是', '否', '非常好'], ]) y = np.array(['否', '否', '是', '是', '否', '否', '是', '是', '是', '是', '是', '是']) # 计算第0个特征(年龄)的信息增益和增益率 ig = information_gain(X, y, 0) igr = information_gain_ratio(X, y, 0) print(f"信息增益: {ig:.3f}") print(f"信息增益率: {igr:.3f}")
基本上就这些。通过上述函数,你可以为任意特征计算信息增益和增益率,用于特征选择或构建决策树模型。注意处理离散特征,连续特征需先分箱或扩展逻辑。











