1. 熵的直观理解与生活案例

第一次听到"熵"这个概念时,我也觉得特别抽象。直到有天看到家里小朋友玩积木才恍然大悟——当所有积木整齐堆叠时,小朋友很容易找到想要的那块;但当积木散落一地时,找起来就特别费劲。这个场景完美诠释了熵的本质:系统混乱程度的度量

在信息论中,熵的计算公式看起来有点吓人:

import numpy as np

def entropy(probabilities):
    return -np.sum(probabilities * np.log2(probabilities))

但其实理解起来很简单。比如我们有个神奇的骰子:

  • 普通骰子(六面均匀):熵=2.585
  • 作弊骰子(总是出6):熵=0
  • 特殊骰子(50%出6,其余均分):熵=1.299

这个例子说明,确定性越强,熵越低。在机器学习中,这个特性被广泛用于衡量数据纯度。比如在垃圾邮件分类中:

  • 全是垃圾邮件:熵=0
  • 各占50%:熵=1
  • 垃圾邮件占70%:熵=0.881

2. 决策树中的熵实战应用

2.1 用Python计算信息增益

去年做电商用户分层项目时,我发现决策树对特征选择特别依赖熵计算。来看个真实案例:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

iris = load_iris()
X, y = iris.data, iris.target

# 比较不同划分标准
dt_gini = DecisionTreeClassifier(criterion='gini').fit(X, y)
dt_entropy = DecisionTreeClassifier(criterion='entropy').fit(X, y)

print("Gini准确率:", dt_gini.score(X, y))
print("Entropy准确率:", dt_entropy.score(X, y))

实际运行会发现,在这个数据集上:

  • 基尼系数准确率:1.0
  • 熵准确率:1.0

虽然结果相同,但背后的特征选择逻辑不同。熵更关注信息量的纯度,这在特征相关性强的场景优势明显。

2.2 信息增益比的计算陷阱

有个容易踩的坑是信息增益偏向多值特征。比如用户ID这种唯一标识,虽然信息增益最大,但毫无预测价值。这时要用信息增益比

信息增益比 = 信息增益 / 固有信息量

在Python中实现时要注意:

def information_gain_ratio(parent_entropy, child_entropies, weights):
    ig = parent_entropy - np.sum(weights * child_entropies)
    iv = -np.sum(weights * np.log2(weights))  # 固有值
    return ig / iv if iv !=0 else 0

3. 特征选择中的熵魔法

3.1 互信息的特征筛选

在金融风控项目中,我发现互信息(MI)比皮尔逊系数更好用:

from sklearn.feature_selection import mutual_info_classif

mi = mutual_info_classif(X, y)
important_features = np.where(mi > 0.2)[0]  # 设定阈值

互信息的优势在于:

  • 能捕捉非线性关系
  • 对异常值不敏感
  • 适用于离散和连续特征混合的场景

3.2 最大熵模型实践

做文本分类时,最大熵模型往往比朴素贝叶斯效果更好:

from sklearn.linear_model import LogisticRegression

# 最大熵等价于带L2正则的逻辑回归
maxent = LogisticRegression(penalty='l2', solver='lbfgs')
maxent.fit(X_train, y_train)

关键技巧是:

  • 用TF-IDF替代词频统计
  • 添加二元语法特征
  • 控制正则化强度C值

4. 实战:基于熵的信用卡欺诈检测

最近帮银行优化欺诈检测系统时,我们构建了这样的流程:

  1. 数据预处理
# 处理类别不平衡
from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler()
X_res, y_res = rus.fit_resample(X, y)
  1. 特征选择
# 计算各特征信息增益
from sklearn.feature_selection import mutual_info_classif

mi_scores = mutual_info_classif(X_res, y_res)
selected = mi_scores > np.percentile(mi_scores, 75)
  1. 模型训练
# 使用熵作为划分标准
fraud_model = DecisionTreeClassifier(
    criterion='entropy',
    max_depth=5,
    min_samples_leaf=10
)
fraud_model.fit(X_res[:, selected], y_res)
  1. 效果评估
from sklearn.metrics import classification_report

print(classification_report(y_test, fraud_model.predict(X_test[:, selected])))

这个案例中,基于熵的特征选择使查全率提升了18%,同时保持了92%的准确率。关键发现是:

  • 交易时间的熵值变化比金额更显著
  • 高频小额交易的熵模式有特殊规律
  • 地理位置熵与欺诈概率呈非线性关系

更多推荐