23 Python 分类 :像老师一样一步步做判断,一文认识决策树分
Python 数据分析入门:像老师一样一步步做判断,一文认识决策树分类
适合人群:Python 初学者 / 数据分析入门 / 机器学习入门 / 教学案例分享
在前两篇文章里,我们已经先后认识了:
- 什么是分类
- K近邻算法是怎么通过“看谁最像”来完成分类的
那么问题来了:
如果我们不想单纯依赖“邻居投票”,而是希望像老师一样,按照条件一步一步做判断,该怎么办?
比如在“学生能否通过技能考核”这个案例里,老师很可能不是一眼下结论,而是这样思考:
- 先看实训成绩高不高
- 如果实训成绩高,再看出勤率稳不稳
- 如果实训成绩不高,再看有没有参加培训
你会发现,这种判断方式非常像一张流程图。
而在机器学习里,最适合表达这种“分步骤判断”思路的算法,就是:
决策树(Decision Tree)
决策树是分类中最经典的方法之一。它的结构类似流程图,本质上是一种 if…then… 的规则表达方式,既直观又容易解释。
这一篇文章继续沿用“学生职业技能考核通过预测”这个案例,带你从零开始理解:
- 什么是决策树
- 决策树为什么像流程图
- 什么是根结点、内部结点、叶结点
- 决策树为什么适合做分类
- 它和 KNN 的思路有什么不同
- 如何用 Python 训练一个简单的决策树模型
一、先从一个熟悉的判断过程开始
我们还是先回到“学生技能考核预测”这个案例。
假设现在来了一个新学生,学校希望提前判断他能不能通过职业技能考核。
这时候,老师可能会这样分析:
- 如果实训成绩比较高,那通过的可能性通常更大
- 如果实训成绩一般,再看看出勤率怎么样
- 如果出勤率也不错,那通过的机会还是比较大
- 如果实训成绩偏低,再看有没有参加培训
- 如果没有参加培训,那么风险可能就更高
注意看,这种判断方式不是一下子得出答案,而是:
先问一个问题,再根据答案进入下一步,最后得出结果。
这其实就是决策树最核心的思想。
所以你可以先把决策树理解成一句非常直白的话:
把分类问题,变成一连串“如果……那么……”的判断题。
二、什么是决策树?
决策树是一种经典的分类方法,它的结构像一棵树,也很像流程图。它的规则本质上就是:
if…then…
也就是说,模型会根据某个属性做判断,再根据不同的判断结果进入不同分支,最后在某个叶子结点给出分类结果。
如果把它用生活中的方式来理解,可以这样说:
- 每问一个问题,就是一次划分
- 每条分支,表示不同答案走不同路径
- 最后走到哪里,就属于哪一类
比如:
- 如果“实训成绩 > 80”,继续往左走
- 如果“实训成绩 <= 80”,继续往右走
- 然后再判断“出勤率 > 90”还是“<= 90”
- 最后得到“通过”或“未通过”的结论
这就是一棵最基本的决策树。
三、为什么叫“树”?它到底长什么样?
很多初学者第一次看到“决策树”这个词,会以为它特别复杂。其实它的结构并不难理解。
决策树里通常有三种最基本的结点:
1)根结点
根结点就是整棵树的起点。
也就是第一个要问的问题。
比如:
- 先看“实训成绩”
- 或者先看“出勤率”
这个最先问的问题,就在根结点上。
2)内部结点
内部结点就是中间的判断点。
说明前面已经分过一次了,现在还要继续分。
比如:
- 前面已经按“实训成绩”分完了
- 接下来再按“出勤率”继续分
这种中间判断位置,就是内部结点。
3)叶结点
叶结点就是最终结果。
也就是这条判断路径走到最后,模型给出的分类结论。
比如:
- 通过
- 未通过
所以你完全可以把决策树看成这样一种结构:
起点问问题,中间继续问问题,最后给出分类结果。
四、决策树为什么特别适合初学者理解?
决策树之所以常被放在机器学习入门部分,一个很重要的原因就是:
它特别直观。
为什么说它直观?
因为很多分类算法的内部逻辑不太容易直接“看出来”,而决策树的判断过程几乎可以画出来。
比如在“学生是否通过技能考核”这个问题上,决策树可以直接表现成:
- 如果实训成绩高,再看出勤率
- 如果实训成绩低,再看是否培训
- 最后给出“通过”或“未通过”
这样的判断过程和老师平时分析学生情况的方式非常接近。
所以决策树最大的特点之一就是:
容易解释。
这也是它在很多实际场景里很受欢迎的重要原因之一。
五、决策树和 KNN 的思路有什么不同?
学到这里,你可能会自然地问:
上一篇讲的 K近邻,也是分类;这一篇讲的决策树,也是分类。
那它们有什么区别?
区别其实很明显。
KNN 的思路是
- 来一个新样本
- 先找和它最像的几个样本
- 再让这些邻居投票决定类别
也就是说,KNN 更像是在做“相似样本参考”。
决策树的思路是
- 根据某个条件一步步做判断
- 每做一次判断,就把样本分到不同分支
- 最后落到某个叶结点,得到分类结果
也就是说,决策树更像是在做“流程化判断”。
所以你可以用一句话把两者区分开:
KNN 是“看谁最像”,决策树是“按条件一步步判断”。
这也是为什么同样是分类问题,不同算法会有完全不同的解决思路。
六、决策树到底在做什么?本质是“不断划分样本”
决策树虽然看起来像流程图,但它本质上在做一件很重要的事:
根据属性不断把样本划分成更小、更纯的子集。
什么意思?
比如一开始,所有学生数据混在一起,其中既有“通过”的,也有“未通过”的。
这时候,如果我们用“实训成绩”来划分,可能会发现:
- 实训成绩高的这一组里,“通过”的学生明显更多
- 实训成绩低的这一组里,“未通过”的学生明显更多
这说明“实训成绩”这个属性很有区分度。
然后,在划分后的每个子集上,再继续找合适的属性划分,比如再看“出勤率”或者“是否参加培训”。
这样一层一层分下去,最后每一组里的样本就会越来越“纯”,也就是越来越趋向于同一类别。
所以决策树的构建过程,本质上就是:
不断找合适的属性来拆分样本,让每一组数据尽可能更容易区分类别。
七、决策树的规则,本质上就是 if…then…
这一点非常重要。
决策树之所以容易理解,就是因为它最终可以转化成一条条规则。
比如一条从根结点走到叶结点的路径,就可以写成:
- 如果实训成绩高
- 并且出勤率高
- 那么预测为“通过”
这其实就是一条标准的 if…then… 规则:
如果满足这些条件,那么它就属于这个类别。
所以你可以把决策树理解为:
- 外表像树
- 本质像规则集合
- 表达形式像流程图
- 判断逻辑像做判断题
这也是它和很多“黑盒模型”相比,非常友好的一点。
八、一个简单例子:老师是怎么画出一棵“脑海里的决策树”的?
我们可以用一个非常简化的例子来理解。
假设老师根据经验,做出如下判断:
第一步,先看“实训成绩”:
- 如果实训成绩高,继续看出勤率
- 如果实训成绩低,直接判定风险较高
第二步,再看“出勤率”:
- 如果出勤率高,预测“通过”
- 如果出勤率低,预测“未通过”
那么,这棵树大概就可以理解成:
实训成绩
/ \
高 低
/ \
出勤率 未通过
/ \
高 低
/ \
通过 未通过
这其实就是一棵非常典型的决策树。
从这个例子你会发现:
- 树并不神秘
- 它就是把“判断过程”结构化地表达出来
- 每往下一层,判断就更具体一步
九、决策树为什么在实际中很常见?
决策树在分类、预测和规则提取等方面都有广泛应用。
它之所以常见,主要有几个原因。
1)容易理解
和很多模型相比,决策树的判断过程是可以直接解释给别人听的。
比如:
- 为什么这个学生被预测为“通过”?
- 因为他实训成绩高、出勤率高,而且走到了“通过”这个叶结点
这种解释方式非常自然。
2)像流程图,便于展示
决策树非常适合可视化。
即使是不懂算法的人,也能大概看明白它的逻辑。
3)规则清晰,便于提取
很多场景里,不只是想要一个“结果”,还希望得到明确规则。
决策树这方面就很有优势,因为它天然就能形成 if…then… 规则。
所以决策树不仅能做分类,还很适合做规则提取。
十、Python 实操:训练一个简单的决策树模型
下面我们继续使用“学生技能考核预测”的模拟数据,训练一个简单的决策树模型。
为了便于代码实现,我们这里先只使用数值型特征:
- 平时成绩
- 实训成绩
- 出勤率
类别仍然是:
- 通过
- 未通过
1)准备数据
import pandas as pd
data = {
'平时成绩': [82, 76, 90, 60, 71, 88, 67, 95, 78, 85, 69, 92],
'实训成绩': [85, 70, 92, 58, 75, 90, 65, 96, 80, 87, 68, 94],
'出勤率': [96, 85, 98, 70, 80, 97, 75, 99, 90, 93, 78, 98],
'是否通过': ['通过', '未通过', '通过', '未通过', '通过', '通过', '未通过', '通过', '通过', '通过', '未通过', '通过']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
2)划分特征和标签
X = df[['平时成绩', '实训成绩', '出勤率']]
y = df['是否通过']
3)划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
4)创建决策树模型并训练
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)
5)查看模型效果
print("测试集准确率:", clf.score(X_test, y_test))
6)预测一个新学生的结果
假设有一个新学生:
- 平时成绩:79
- 实训成绩:82
- 出勤率:91
new_student = [[79, 82, 91]]
prediction = clf.predict(new_student)
print("新学生预测结果:", prediction[0])
运行后,你就可以看到这个新学生被预测为“通过”还是“未通过”。
十一、完整代码一次放全
如果你想直接复制运行,可以使用下面这份完整代码:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# 1. 构造学生数据
data = {
'平时成绩': [82, 76, 90, 60, 71, 88, 67, 95, 78, 85, 69, 92],
'实训成绩': [85, 70, 92, 58, 75, 90, 65, 96, 80, 87, 68, 94],
'出勤率': [96, 85, 98, 70, 80, 97, 75, 99, 90, 93, 78, 98],
'是否通过': ['通过', '未通过', '通过', '未通过', '通过', '通过', '未通过', '通过', '通过', '通过', '未通过', '通过']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 2. 提取特征和标签
X = df[['平时成绩', '实训成绩', '出勤率']]
y = df['是否通过']
# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
# 4. 构建决策树模型
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)
# 5. 模型评估
print("\n测试集准确率:", clf.score(X_test, y_test))
# 6. 预测新学生
new_student = [[79, 82, 91]]
prediction = clf.predict(new_student)
print("新学生预测结果:", prediction[0])
十二、决策树最值得记住的特点是什么?
学完这一课,至少要记住决策树的这几个核心特点。
1)它像流程图
决策树的结构就是树形结构,本质上很像流程图。每个非叶结点对应一个属性上的划分,每个叶结点对应一个分类结果。
2)它像判断题
决策树的规则本质上是 if…then…,也就是“如果满足某些条件,那么属于某一类”。
3)它适合解释
因为每一步判断都能看清楚,所以决策树往往比很多其他模型更容易解释。
4)它是一步步划分样本得到结果的
不是靠找邻居,也不是靠概率,而是靠“不断划分”。
十三、这一课最核心要记住什么?
学完决策树的基础部分,建议至少把下面几件事想清楚。
1)决策树的核心思想是什么?
把分类问题变成一连串条件判断,最后得到分类结果。
2)为什么叫决策树?
因为它的结构像树,也像流程图。
3)决策树的结点分哪几类?
- 根结点:起始判断
- 内部结点:中间判断
- 叶结点:最终结果
4)决策树和 KNN 的区别是什么?
KNN 是看谁最像,决策树是按条件一步步判断。
5)决策树为什么常用?
因为它直观、规则清晰、容易解释。
十四、结尾总结
这一课主要解决的是一个非常自然的问题:
如果不想只靠“邻居投票”,能不能像老师一样一步步做判断来分类?
答案就是:
可以,这就是决策树的基本思想。
通过“学生职业技能考核通过预测”这个案例,我们可以建立以下几个核心认识:
- 决策树是一种经典的分类方法
- 它的结构类似流程图,规则本质上是 if…then…
- 它通过不断划分样本,把数据一步步分到不同分支上
- 每个叶结点对应一个最终分类结果
- 它非常适合做可解释的分类任务
对于初学者来说,决策树的价值不仅仅在于“会用一个模型”,更重要的是它能帮助你建立另一种非常典型的分类思维:
分类不一定只是看谁最像,也可以通过一步步提问和判断来完成。
十五、课后思考
建议你自己试着回答下面几个问题:
- 决策树为什么说像流程图?
- 什么是根结点、内部结点、叶结点?
- 决策树和 KNN 在分类思路上有什么不同?
- 为什么决策树常被认为容易解释?
- 在“学生是否通过考核”这个问题里,你觉得第一步最适合先看哪个属性?
如果这几个问题你都能比较顺畅地说清楚,那么你对决策树的基础理解就已经比较扎实了。
写在最后
决策树是机器学习里非常值得先学的一类方法。
因为它不仅能做分类,而且特别适合帮助初学者建立“模型是怎么做判断的”这种直观认识。
如果这篇文章对你有帮助,后面就可以顺着继续学习下一课:
- 决策树构建:树的第一步为什么先看这个条件
- ID3、C4.5 和 CART 到底有什么区别
- 随机森林:一棵树不够稳,那就很多棵一起投票
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)