用Gini基尼系数,徒手‘种’出一棵决策树(含完整案例+手算)

在机器学习中,决策树是一种直观易懂的分类模型,而 Gini 系数是其中常用的划分标准之一。本文将通过手动计算与经典案例,带你从 0 到 1 理解 Gini 系数的原理、计算公式、实际应用及注意事项。

 首先,我们先来来了解一下什么是Gini 系数,它有怎样的作用、怎么帮助我们建立决策树,然后通过一个例子,将所学的公式用于实际的问题中去巩固概念。

一、Gini 系数定义

在决策树算法中,Gini 基尼系数用于衡量数据集的纯度,其公式如下:

  • D:样本集

  • K:分类的总数

  • ∑是求和符号

  • pk​:属于第k 类的样本占比

Gini 值范围为 (0,1)

  • 越接近 0,表示越纯净(全部属于一个类别)

  • 越接近 1,表示类别分布越混乱


二、Gini Index(属性划分评估)

对于某个属性 A 将样本集 D 分成多个子集 D1,D2,...,Dn其 Gini Index 的计算公式为为:

  • 将样本集D分成多个子集,比如你问了10个人,是否吃饭,对于他们的回答,你将10个人分为了7个 “ 是” 与3个 “ 否 ”  的子集。

我们用这个加权平均的方式,来评估划分后子集的整体纯度。哪个属性的 Gini Index 最小,就优先选择它作为根节点或者进行后续划分。


三、案例:贷款审批系统中构建决策树

我们用一个简化的贷款审批数据集,共 8 个样本,目标是预测“是否批准贷款”。目标是建立一棵决策树,找到最优的属性作为“根节点”来划分。

“一个用户的贷款申请应该批准(Yes)还是拒绝(No)?”

编号

 年龄  (属性)

收入水平(属性)是否有房(属性)是否违约(属性)是否批准(标签)
1青年否 
2中年是 
3老年是 
4青年否 
5老年否 
6中年是 
7青年是 
8中年否 

第一步:选择最优划分属性 —— 应用 Gini 指数!

你现在的任务是:

对属性“年龄”、“收入水平”、“是否有房”、“是否违约”分别计算其对于标签 “ 是否批准 ” 的 Gini index。(为了后面选择最优属性的进行划分)

以属性 “年龄” 为例进行计算:

(可以浏览并明晰“年龄”属性Gini系数的计算方式,之后自行计算“收入水平”、“是否有房”、“是否违约”属性的Gini系数)

年龄有三个取值:青年、中年、老年。

把数据按年龄划分:

  • 青年:3个样本,1个是(批准),2个否(不批准) → Gini = 1 - (1/3)^2 - (2/3)^2 =0.444

  • 中年:3个样本,2是,1否 → Gini =1 - (2/3)^2 - (1/3)^2 = =0.444

  • 老年:2个样本,1是,1否 → Gini = =1 - 0.5^2 - 0.5^2 =0.5

 再计算加权平均 Gini 指数(Gini Index):

Gini index"年龄"​=(3/8)⋅0.444+(3/8)​⋅0.444+(2/8)⋅0.5=0.1665+0.1665+0.125=0.458

  • 分母8:指的是一共8个样本
  • 分子332:是指三个年龄取值所对应的样本数量。

接下来你可以使用相同的方法来计算其他三个属性的Gini index,这里我将结果直接展出,方便你进行结果的检查。

计算 “收入水平 ”的Gini 值和Gini index 

收入水平Gini 值权重(占比)
0.4443/8
03/8
02/8
Gini Index0.1665

这就是 Gini 在决策树中最典型的“划分后加权平均”。

Gini index“收入​水平”=3/8​⋅0.444 +3/8​⋅0 +2/8​⋅0 =0.375⋅0.444 +0.375⋅0 +0.25⋅0=0.1665


计算 “是否有房 ”的Gini 值和Gini index 

是否有房Gini 值权重(占比)
0.485/8
0.4443/8
Gini Index0.4665

Gini index“是否有房”​=5/8⋅0.48+3/8​⋅0.444=0.3+0.1665=0.4665​


是否违约Gini 值权重(占比)
03/8
0.325/8
Gini Index0.2

Gini index "是否违约​"=5/8​⋅0.32+3/8​⋅0=0.2 


汇总所有属性 Gini Index:

属性名Gini Index
收入水平0.1665 (最优)
是否违约0.200 (次优)
是否有房0.4665 (相对差)
年龄0.458 (区分度低)

根据我们在最初学到的Gini index 越小说明属性将数据分得更清晰(纯),因此我们选择“收入水平”作为决策树的根节点。

四、决策树结构图

我们根据 Gini 最小原则,选取选择“收入水平”作为决策树的根节点。同时,我们在为计算收入水平时,发现收入水平为“中”的批准结果皆为“是”(批准),而收入水平为“低”的批准结果为“否”(不批准)。

那是否就可以顺利画出我们的决策树了呢?细心的我们发现“收入水平”为高的人群中并不全为“是”或否,在三个样本中一个的批准结果为“是”,两个为“否”。那么就需要我们继续借助Gini index 来确定节点,明确结果。

在我们的汇总所有属性表中,最优的属性已作为根节点,那么我们使用次优的属性“是否违约”作为内部节点。但是同样是违约的高收入人群的两个样本,一个给了“批准”,一个给了“不批准”,但我们这里仍然只分了两类情况,那是不是判断错误了?

其实原因是:决策树是“基于整体最优划分”构建的模型,并不保证对每条训练样本都100%正确,这就是所谓的泛化原则

换句话说:为了让整个模型在大多数样本上表现更好,它可能会牺牲个别样本的准确性

因此我们这里牺牲了编号1 的数据的准确性。

总结

内容说明
Gini 系数衡量分类纯度,越低越好
Gini Index属性划分后子集加权 Gini,决定划分属性优劣
决策树构建选择 Gini Index 最小的属性作为分裂依据
泛化能力决策树不保证每条样本都准确,更关注整体效果

 如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、评论交流!