共计 1320 个字符,预计需要花费 4 分钟才能阅读完成。
1. 决策树与 Gini 系数基础
决策树(Decision Tree)是机器学习中经典的分类与回归方法。CART(Classification and Regression Trees)算法使用 Gini 系数(Gini Index)作为特征选择的标准。

- Gini 系数的意义 :衡量数据的不纯度(Impurity),值越小表示数据越纯净
- 计算逻辑 :对每个特征的可能划分方式计算 Gini 系数,选择使子节点总 Gini 系数最小的划分方式
2. Gini 系数计算公式推导
Gini 系数的定义为:
Gini(D) = 1 - Σ(p_i)^2
其中 p_i 是第 i 类样本在数据集 D 中的比例。
计算示例 :
假设一个二分类数据集有 10 个样本,其中 6 个属于类别 A,4 个属于类别 B:
- 计算类别 A 的比例:6/10 = 0.6
- 计算类别 B 的比例:4/10 = 0.4
- Gini 系数 = 1 – (0.6² + 0.4²) = 1 – (0.36 + 0.16) = 0.48
3. Python 代码实现(含可视化)
import numpy as np
def calculate_gini(y):
"""
计算 Gini 系数
:param y: 目标值数组
:return: Gini 系数值
"""
_, counts = np.unique(y, return_counts=True)
probabilities = counts / len(y)
return 1 - np.sum(probabilities ** 2)
# 示例数据
y = np.array([1, 1, 1, 1, 0, 0, 0, 0, 0, 0])
print("Gini 系数:", calculate_gini(y))
4. 与信息增益的对比实验
- Gini 系数 :
- 计算更快(无对数运算)
- 更倾向于选择多值的特征
-
对类别不平衡更敏感
-
信息增益(Information Gain):
- 基于信息熵(Entropy)
- 计算复杂度稍高
- 更倾向于产生平衡的树
5. sklearn 实战示例
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 使用 Gini 系数构建决策树
clf = DecisionTreeClassifier(criterion='gini', max_depth=3)
clf.fit(X, y)
print("模型准确率:", clf.score(X, y))
6. 常见问题 FAQ
Q1: 如何处理连续特征?
A1: 对连续特征排序后,取相邻值的中间点作为候选划分点,计算每个点的 Gini 系数。
Q2: 类别不平衡时有什么影响?
A2: Gini 系数对多数类更敏感,可能导致偏向多数类的划分。可以使用类别权重参数调整。
Q3: 为什么 CART 只用二分法?
A3: 二分法简化了计算,对连续和离散特征处理统一,且实际效果与多分法相近。
7. 延伸思考
- Gini 系数取值范围是 [0,0.5],0 表示完全纯净,0.5 表示最不纯(二分类情况下)
- CART 采用二分法因为计算简单且效果良好
- 当所有样本属于同一类时 Gini 值为 0
实践建议 :
– 在大型数据集上优先使用 Gini 系数
– 调试时可同时尝试两种标准对比效果
– 注意 max_depth 等参数对模型的影响
正文完
