一、什么是决策树(Decision Tree)
决策树本质就是:
一连串的"如果...那么..."判断,最后得到一个结论。
就像 HR 在脑子里的流程:
是否本科?
├─ 否 → 不录用
└─ 是
├─ 工作年限 > 3年?
│ ├─ 是 → 录用
│ └─ 否
│ ├─ 年龄 < 25?
│ │ ├─ 是 → 实习
│ │ └─ 否 → 不录用
这棵树就是决策树。
二、问题来了:先问哪个问题?
假设有三个条件:
-
是否本科
-
年龄
-
工作年限
到底第一刀先切哪个?
这就是决策树算法的核心:
选一个"最有区分度"的条件。
而 Gini 系数就是用来衡量"区分度"的。
三、Gini 系数是啥?
一句话理解:
Gini 越小,分类越干净。
干净 = 一边几乎全是录用,一边几乎全是不录用。
Gini 公式(不用怕)
公式:
Gini = 1 - (p1² + p2² + ...)
p1 = 录用比例
p2 = 不录用比例
四、举一个面试例子
我们有 8 个人:
| 编号 | 本科 | 年龄 | 工作年限 | 是否录用 |
|---|---|---|---|---|
| 1 | 是 | 23 | 1 | 否 |
| 2 | 是 | 28 | 5 | 是 |
| 3 | 否 | 26 | 4 | 否 |
| 4 | 是 | 30 | 6 | 是 |
| 5 | 否 | 24 | 2 | 否 |
| 6 | 是 | 27 | 3 | 是 |
| 7 | 是 | 22 | 0 | 否 |
| 8 | 否 | 35 | 10 | 否 |
总体情况:
-
录用:3人
-
不录用:5人
先算总体 Gini
比例:
-
p(录用) = 3/8 = 0.375
-
p(不录用) = 5/8 = 0.625
Gini = 1 - (0.375² + 0.625²)
≈ 1 - (0.14 + 0.39)
≈ 0.47
说明:很混乱。
五、试试用 "是否本科" 切一刀
本科 = 是
5人:
-
录用:3
-
不录用:2
Gini = 1 - (0.6² + 0.4²)
= 1 - (0.36 + 0.16)
= 0.48
本科 = 否
3人:
- 全部不录用
Gini = 1 - (1²)
= 0
超级干净。
加权平均 Gini
总Gini = (5/8)*0.48 + (3/8)*0
= 0.3
从 0.47 → 0.3
变干净了!
六、为什么不用"年龄"?
因为年龄切完可能两边都很混乱:
-
左边 2录用2不录用
-
右边 1录用3不录用
Gini 会比较高。
七、直觉理解
Gini 就像在问:
这一刀切下去,是不是一边全红,一边全蓝?
越纯越好。
八、为什么很多算法用 Gini?
因为:
-
计算简单(不用 log)
-
速度快
-
效果和信息熵差不多
-
适合大数据
所以 CART 决策树都用 Gini。
九、一句话总结
决策树 = 问问题的流程图
Gini 系数 = 判断哪个问题最有区分度的尺子
目标:让每一层的分类尽量"纯"。
本科 年龄 工作年限 它们三个的gini系数为多少,列个表格 包含计算过程,gini系数,以及排序
好,我们就用刚才那 8 个候选人数据 ,把三个参数都算一遍 Gini,然后做排序。
目标:看 第一刀应该先问谁。
原始数据
| 编号 | 本科 | 年龄 | 工作年限 | 是否录用 |
|---|---|---|---|---|
| 1 | 是 | 23 | 1 | 否 |
| 2 | 是 | 28 | 5 | 是 |
| 3 | 否 | 26 | 4 | 否 |
| 4 | 是 | 30 | 6 | 是 |
| 5 | 否 | 24 | 2 | 否 |
| 6 | 是 | 27 | 3 | 是 |
| 7 | 是 | 22 | 0 | 否 |
| 8 | 否 | 35 | 10 | 否 |
总体:
-
录用:3
-
不录用:5
Gini 公式
二分类时:
Gini = 1 - (p录用² + p不录用²)
一、本科 的 Gini
本科 = 是(5人)
录用 3 / 不录用 2
Gini = 1 - (0.6² + 0.4²)
= 1 - (0.36 + 0.16)
= 0.48
本科 = 否(3人)
录用 0 / 不录用 3
Gini = 1 - (0² + 1²)
= 0
加权平均
(5/8)*0.48 + (3/8)*0
= 0.30
二、年龄 的 Gini
为了简单,我们设一个切分点:年龄 ≤ 25
年龄 ≤ 25(3人)
全部不录用
Gini = 0
年龄 > 25(5人)
录用 3 / 不录用 2
Gini = 0.48
加权平均
(3/8)*0 + (5/8)*0.48
= 0.30
三、工作年限 的 Gini
设切分点:工作年限 ≤ 3
工作 ≤ 3(4人)
录用 1 / 不录用 3
Gini = 1 - (0.25² + 0.75²)
= 1 - (0.0625 + 0.5625)
= 0.375
工作 > 3(4人)
录用 2 / 不录用 2
Gini = 1 - (0.5² + 0.5²)
= 0.5
加权平均
(4/8)*0.375 + (4/8)*0.5
= 0.4375
汇总表
| 特征 | 分割方式 | 左侧Gini | 右侧Gini | 加权Gini | 排名 |
|---|---|---|---|---|---|
| 本科 | 是/否 | 0.48 | 0 | 0.30 | 1 |
| 年龄 | ≤25 / >25 | 0 | 0.48 | 0.30 | 1 |
| 工作年限 | ≤3 / >3 | 0.375 | 0.5 | 0.4375 | 3 |
结论
-
本科 ≈ 年龄 最优
-
工作年限 最差
也就是说:
第一层优先问:
"你是不是本科?" 或 "你多大?"
因为这两个一刀下去能让分类最干净。
直觉解释
-
本科:直接筛掉一堆不合格的人 → 很纯
-
年龄:年轻人几乎全淘汰 → 也很纯
-
工作年限:两边都混着 → 不干净
Gini 越小 = 越适合做第一刀。
那么最终的决策树应该表示成?
我们就沿用刚才那 8 个人的数据,并且按照 Gini 最优优先级:本科 → 年龄 → 工作年限 来构建一棵"最终决策树"。
目标:让每一步分类都尽量纯。
第一步:是否本科(Gini = 0.30,最优)
-
本科 = 否 → 3 人,全部不录用
这一支已经 100% 纯,不需要再分。
-
本科 = 是 → 5 人,里面有录用也有不录用,需要继续切。
第二步:年龄(在"本科=是"里面继续分)
我们用刚才的切分点:年龄 ≤ 25
在"本科=是"的 5 人里:
| 年龄 ≤25 | 2 人 | 全部不录用 |
|---|---|---|
| 年龄 >25 | 3 人 | 全部录用 |
这里已经完全纯了,不需要再看工作年限。
最终决策树(文字版)
是否本科?
├─ 否 → 不录用
└─ 是
├─ 年龄 ≤ 25 → 不录用
└─ 年龄 > 25 → 录用
树形图(更直观)
是否本科
/ \
否 是
(不录用) [年龄 ≤ 25?]
/ \
是 否
(不录用) (录用)
为什么没有用"工作年限"?
因为:
-
在第二层已经 100% 分类干净了
-
再切只会增加复杂度,没有收益
-
决策树的原则是:纯了就停
用 HR 的大白话理解
这棵树等价于 HR 的一句话规则:
不是本科直接刷掉;
是本科但太年轻(≤25)也刷掉;
本科 + 年龄大于 25 → 录用。
现实中的补充
真实业务中可能会继续加一层,比如:
-
本科 + 年龄>25 但工作年限=0 → 实习
-
本科 + 年龄>25 + 工作3年 → 录用
但在我们这个小样本里,两刀已经完全分干净 ,
所以最终树就是一棵 两层的极简决策树。