在机器学习中,决策树是一种直观易懂的分类模型,而 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个样本
- 分子3、3、2:是指三个年龄取值所对应的样本数量。
接下来你可以使用相同的方法来计算其他三个属性的Gini index,这里我将结果直接展出,方便你进行结果的检查。
计算 “收入水平 ”的Gini 值和Gini index
收入水平 | Gini 值 | 权重(占比) |
---|---|---|
高 | 0.444 | 3/8 |
中 | 0 | 3/8 |
低 | 0 | 2/8 |
Gini Index | 0.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.48 | 5/8 |
否 | 0.444 | 3/8 |
Gini Index | 0.4665 | — |
Gini index“是否有房”=5/8⋅0.48+3/8⋅0.444=0.3+0.1665=0.4665
是否违约 | Gini 值 | 权重(占比) |
---|---|---|
是 | 0 | 3/8 |
否 | 0.32 | 5/8 |
Gini Index | 0.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 最小的属性作为分裂依据 |
泛化能力 | 决策树不保证每条样本都准确,更关注整体效果 |
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、评论交流!