基尼系数是用于衡量数据集中不平等性或不纯度的指标。在机器学习中,尤其是在决策树算法里,它量化了节点中类别的混合程度。基尼指数为 0 意味着完全纯度(所有元素属于同一类别),而较高的基尼指数则表示较高的不纯度。
什么是基尼系数?
- 范围:0 到 0.5(针对二元分类): 基尼系数的范围从 0(纯节点,只有一类,例如全是“Yes”)到 0.5(最大不纯度,两类均匀混合,例如 50% “Yes” 和 50% “No”)。在多分类问题中,最大基尼值可能更高,但仍 ≤ 1。
- 计算速度比熵更快: 基尼仅使用概率的平方(无对数运算),这使得计算更加轻量且迅速。
- 用于 CART 树(分类与回归树): CART 是 scikit-learn 中决策树分类器背后的算法。默认情况下,它使用基尼系数来评估分割效果。
- 对类别不平衡敏感: 如果某一类占主导地位(例如 95% “A” 和 5% “B”),基尼系数可能不会强烈惩罚不纯度,从而导致决策树产生偏差。它可能更倾向于选择有利于多数类的分割。
- 无对数计算: 如前所述,基尼避免了对数计算带来的计算负担。这使得速度更快,特别是在大型数据集上训练时。
- Gini = 0 意味着纯节点: 基尼 = 0 的叶节点意味着它只包含一个类别。我们的目标是让叶节点尽可能纯净,以获得高模型精度。
数学表示
基尼系数可以通过以下方式进行数学表示:
> Gini(p) = 1 – \sum{i=1}^{n} pi^2
其中 p_i 是节点中类别 i 的概率。
分步计算
让我们举个例子,假设我们有一个包含以下内容的节点:
- 3 个类别 A 的实例
- 2 个类别 B 的实例
那么:
> pA = \frac{3}{5},\quad pB = \frac{2}{5}
>
> Gini = 1 – (pA^2 + pB^2)\\ = 1 – \left(\frac{9}{25} + \frac{4}{25}\right) = 1 – \frac{13}{25} \\ = \frac{12}{25} = 0.48
代码实现
1. 导入所有依赖项并加载数据集
这一步涉及安装所有必要的库并从 scikit-learn 加载鸢尾花数据集。
Python
CODEBLOCK_0719eab8
2. 数据分割与模型训练
- 将数据集分割为 70% 的训练集和 30% 的测试集。
这有助于在一部分数据上训练模型,并在未见过的数据上进行评估。 Random state确保可复现性(每次结果相同)。- 创建一个使用基尼不纯度来衡量节点分割的决策树分类器。现在,我们在训练数据上训练模型并设置最大树深度。
Python
CODEBLOCK_8530cf84
3. 预测与评估
- 训练好的决策树用于预测测试集的类别标签。
它将包含每个测试样本的预测类别(花卉类型)。- 生成一个分类报告,用于对比真实标签和预测标签。
Python
CODEBLOCK_5b2985ee
输出
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250723163802366949/giniCR.webp">giniCR分类报告
4. 特征重要性分析
- 这显示了每个特征在所有分割中减少基尼不纯度的程度。
- 如果某个特征被频繁用于分割并能带来高纯度,其重要性得分就会更高。
Python
CODEBLOCK_6a38f9b2
输出
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250723163802353186/giniFI.webp">giniFI特征重要性分析
5. 使用基尼不纯度可视化决策树
想象一下在树中绘制不同的分割点。基尼系数通过追求低基尼分数的节点,帮助我们找到类别分离最明显的分割点。这里,使用基尼作为分割标准形成的决策树如下所示:
Python
CODEBLOCK_47be5a3a
输出
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250723163802198525/giniDT.webp">giniDT使用基尼不纯度的决策树