决策树模型实战:从零推导CART算法中的Gini系数计算

1次阅读
没有评论

共计 1320 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

1. 决策树与 Gini 系数基础

决策树(Decision Tree)是机器学习中经典的分类与回归方法。CART(Classification and Regression Trees)算法使用 Gini 系数(Gini Index)作为特征选择的标准。

决策树模型实战:从零推导 CART 算法中的 Gini 系数计算

  • Gini 系数的意义 :衡量数据的不纯度(Impurity),值越小表示数据越纯净
  • 计算逻辑 :对每个特征的可能划分方式计算 Gini 系数,选择使子节点总 Gini 系数最小的划分方式

2. Gini 系数计算公式推导

Gini 系数的定义为:

Gini(D) = 1 - Σ(p_i)^2

其中 p_i 是第 i 类样本在数据集 D 中的比例。

计算示例 :
假设一个二分类数据集有 10 个样本,其中 6 个属于类别 A,4 个属于类别 B:

  1. 计算类别 A 的比例:6/10 = 0.6
  2. 计算类别 B 的比例:4/10 = 0.4
  3. 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. 延伸思考

  1. Gini 系数取值范围是 [0,0.5],0 表示完全纯净,0.5 表示最不纯(二分类情况下)
  2. CART 采用二分法因为计算简单且效果良好
  3. 当所有样本属于同一类时 Gini 值为 0

实践建议 :
– 在大型数据集上优先使用 Gini 系数
– 调试时可同时尝试两种标准对比效果
– 注意 max_depth 等参数对模型的影响

正文完
 0
评论(没有评论)