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…
  • 它通过不断划分样本,把数据一步步分到不同分支上
  • 每个叶结点对应一个最终分类结果
  • 它非常适合做可解释的分类任务

对于初学者来说,决策树的价值不仅仅在于“会用一个模型”,更重要的是它能帮助你建立另一种非常典型的分类思维:

分类不一定只是看谁最像,也可以通过一步步提问和判断来完成。


十五、课后思考

建议你自己试着回答下面几个问题:

  1. 决策树为什么说像流程图?
  2. 什么是根结点、内部结点、叶结点?
  3. 决策树和 KNN 在分类思路上有什么不同?
  4. 为什么决策树常被认为容易解释?
  5. 在“学生是否通过考核”这个问题里,你觉得第一步最适合先看哪个属性?

如果这几个问题你都能比较顺畅地说清楚,那么你对决策树的基础理解就已经比较扎实了。


写在最后

决策树是机器学习里非常值得先学的一类方法。
因为它不仅能做分类,而且特别适合帮助初学者建立“模型是怎么做判断的”这种直观认识。

如果这篇文章对你有帮助,后面就可以顺着继续学习下一课:

  • 决策树构建:树的第一步为什么先看这个条件
  • ID3、C4.5 和 CART 到底有什么区别
  • 随机森林:一棵树不够稳,那就很多棵一起投票
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐