登录
首页 >  文章 >  python教程

Python实现信息增益与增益率方法

时间:2026-05-10 19:32:50 220浏览 收藏

本文深入浅出地介绍了信息增益与信息增益率在决策树特征选择中的核心作用,并提供了基于Python的完整、可直接运行的实现代码——从信息熵的稳健计算(含log(0)防护),到信息增益衡量特征分类能力,再到信息增益率通过固有值校正多取值偏差,每一步都配有清晰公式、原理说明与实用示例(如对“年龄”特征计算得IG=0.083、GR=0.096);代码简洁高效,支持离散特征开箱即用,同时点明连续特征的分箱预处理要点,是理解ID3与C4.5算法本质、动手构建可解释决策树模型的极佳实践指南。

python中如何实现信息增益和信息增益率

在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 import numpy as np

def entropy(y): _, counts = np.unique(y, return_counts=True) probs = counts / len(y) return -np.sum(probs * np.log2(probs + 1e-9)) # 加极小值避免log(0)

<H3>信息增益的实现</H3>
<p>信息增益表示划分前后熵的减少量。对某个特征 <strong>A</strong>,其信息增益为:</p>
<p><strong>IG(S, A) = H(S) - Σ(|S_v|/|S| * H(S_v))</strong></p>
<p>其中 S_v 是特征 A 取值为 v 的子集。</p>

<p>代码实现:</p>
```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

<H3>使用示例</H3>
<p>假设有一个简单的分类数据集:</p>
```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}")

基本上就这些。通过上述函数,你可以为任意特征计算信息增益和增益率,用于特征选择或构建决策树模型。注意处理离散特征,连续特征需先分箱或扩展逻辑。

本篇关于《Python实现信息增益与增益率方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>