什么是决策树(Decision Tree)

一、什么是决策树(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?

因为:

  1. 计算简单(不用 log)

  2. 速度快

  3. 效果和信息熵差不多

  4. 适合大数据

所以 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年 → 录用

但在我们这个小样本里,两刀已经完全分干净

所以最终树就是一棵 两层的极简决策树

相关推荐
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
YJlio8 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
偷吃的耗子9 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
l1t9 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
化学在逃硬闯CS9 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar12310 小时前
C++使用format
开发语言·c++·算法
山塘小鱼儿10 小时前
本地Ollama+Agent+LangGraph+LangSmith运行
python·langchain·ollama·langgraph·langsimth
码说AI10 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化