Machine Learning 简明教程
Machine Learning - Entropy
熵是一个起源于热力学的概念,后来被应用于各种领域,包括信息论、统计学和机器学习。在机器学习中,熵被用作衡量一组数据的不纯度或随机性的指标。具体来说,熵在决策树算法中用于决定如何分割数据以创建一个更同质的子集。在本文中,我们将讨论机器学习中的熵、其属性以及在 Python 中的实现。
熵被定义为系统中无序或随机性的度量。在决策树的背景下,熵被用作衡量节点不纯度的指标。如果节点中所有示例都属于同一类别,则该节点被认为是纯的。相反,如果节点包含来自多个类别的示例,则该节点是不纯的。
为了计算熵,我们首先需要定义数据集中每个类别的概率。令 p(i) 是示例属于类别 i 的概率。如果我们有 k 个类别,则系统总熵(表示为 H(S))的计算如下:
H\left ( S \right )=-sum\left ( p\left ( i \right )\ast log_{2}\left ( p\left ( i \right ) \right ) \right )
其中求和是对所有 k 个类别进行的。此方程称为香农熵。
例如,假设我们有一个包含 100 个示例的数据集,其中 60 个属于类别 A,40 个属于类别 B。那么类别 A 的概率为 0.6,类别 B 的概率为 0.4。数据集的熵为:
H\left ( S \right )=-(0.6\times log_{2}(0.6)+ 0.4\times log_{2}(0.4)) = 0.971
如果数据集中所有示例都属于同一类别,则熵为 0,表示纯节点。另一方面,如果示例在所有类别中均匀分布,则熵很高,表示不纯节点。
在决策树算法中,熵用于确定每个节点的最佳分裂。目标是创建导致子集最同质的分裂。这可以通过计算每个可能分裂的熵并选择导致总熵最低的分裂来实现。
例如,假设我们有一个包含两个特征 X1 和 X2 的数据集,目标是预测类别标签 Y。我们从计算整个数据集的熵 H(S) 开始。接下来,我们根据每个特征计算每个可能分裂的熵。例如,我们可以根据 X1 或 X2 的值对数据进行分割。每个分裂的熵计算如下:
H\left ( X_{1} \right )=p_{1}\times H\left ( S_{1} \right )+p_{2}\times H\left ( S_{2} \right )H\left ( X_{2} \right )=p_{3}\times H\left ( S_{3} \right )+p_{4}\times H\left ( S_{4} \right )
其中 p1、p2、p3 和 p4 是每个子集的概率;H(S1)、H(S2)、H(S3) 和 H(S4) 是每个子集的熵。
然后我们选择导致总熵最低的划分,它由以下内容给定:
H_{split}=H\left ( X_{1} \right )\, if\, H\left ( X_{1} \right )\leq H\left ( X_{2} \right );\: else\: H\left ( X_{2} \right )
然后使用此划分来创建决策树的子节点,并且该过程重复执行,直至所有节点都是纯的或满足停止准则为止。
Example
我们举个例子来了解如何在 Python 中实现它。这里我们将使用“iris”数据集:
from sklearn.datasets import load_iris
import numpy as np
# Load iris dataset
iris = load_iris()
# Extract features and target
X = iris.data
y = iris.target
# Define a function to calculate entropy
def entropy(y):
n = len(y)
_, counts = np.unique(y, return_counts=True)
probs = counts / n
return -np.sum(probs * np.log2(probs))
# Calculate the entropy of the target variable
target_entropy = entropy(y)
print(f"Target entropy: {target_entropy:.3f}")
以上代码加载 iris 数据集,提取特征和目标,并定义一个函数来计算熵。entropy() 函数采用目标值向量并返回集合的熵。
该函数首先计算集合中的示例数和每种类的数目。然后计算每个类的比例并使用这些比例根据熵公式计算集合的熵。最后,代码计算 iris 数据集中目标变量的熵并将其打印到控制台。