机器学习入门:决策树 0 基础实战教程
2025年10月24日 07:42
不管你是完全没接触过机器学习,还是只会一点点 Python,这篇教程都能带你学会决策树 —— 从 “懂原理” 到 “用代码做预测”,全程不绕弯、不堆砌术语。
1. 先搞懂:决策树到底是个啥?
决策树是机器学习里最 “像人类思考” 的模型 —— 本质就是 **“问问题→做选择” 的循环 **,像你平时做决定一样。
比如你纠结 “今天要不要带伞”,脑子里的思考过程就是一棵迷你决策树:
如果 天气预报说下雨:
带伞
否则:
如果 外面阴天:
带伞(怕突然下雨)
否则:
不带伞
把这个过程画成图,就是决策树的结构:
天气预报下雨吗?
/ \
是(带伞) 否
/ \
外面阴天吗? 否(不带伞)
/ \
是(带伞) 否(不带伞)
小互动:你试试想一个自己的决策场景(比如 “要不要买这件衣服”),用 “如果… 那么… 否则…” 写出来 —— 这就是你自己的 “决策树” 啦!
2. 决策树能帮我们做什么?
它能解决两类常见问题,生活和工作里都能用得上:
任务类型 | 核心目标 | 真实场景例子 | 决策树怎么工作? |
分类任务 | 给事物贴 “类别标签” | 1. 邮件是 “垃圾邮件” 还是 “正常邮件”2. 患者是 “生病” 还是 “健康” | 输出 “是 / 否”“A 类 / B 类” 这样的明确类别 |
回归任务 | 预测一个 “具体数字” | 1. 预测这套房子的成交价(比如 180 万)2. 预测明天的 PM2.5 值(比如 56) | 输出一个连续的数值(不是固定类别) |
3. 关键问题:决策树怎么选 “该问什么问题”?
比如判断 “要不要出去玩”,为什么先问 “下不下雨”,而不是先问 “温度高不高”?
答案是:每次都选 “最能区分结果” 的问题—— 用 “信息熵” 和 “信息增益” 这两个工具来判断。
3.1 先理解 “信息熵”:衡量数据有多 “乱”
熵(Entropy)是个用来描述 “混乱程度” 的指标,记住一句话:
数据越乱,熵越大;数据越整齐,熵越小。
公式看起来有点复杂,但不用怕,我们用例子算一遍就懂了:
例子 1:数据全 “整齐”(10 个样本全是 “玩”)
例子 2:数据全 “乱”(10 个样本 5 个 “玩”、5 个 “不玩”)
总结熵的意义:
数据情况 | 熵值范围 | 决策树的判断 |
全是同一类结果 | 0 | 不用再问问题,直接出结果 |
各类结果比例差不多 | 接近 1 | 需要找个问题把数据分整齐 |
某一类结果占绝大多数 | 0~1 之间 | 快分整齐了,再问 1 个问题够了 |
3.2 再理解 “信息增益”:选 “最有用” 的问题
信息增益 = 分裂前的熵 - 分裂后的平均熵
增益越大,说明这个问题把数据 “分整齐” 的效果越好—— 决策树就选增益最大的问题作为当前节点。
还是用 “出去玩” 的数据举例子(10 个样本):
天气 | 温度 | 是否出去玩 |
晴 | 高 | 否 |
晴 | 高 | 否 |
阴 | 高 | 是 |
雨 | 适中 | 是 |
雨 | 低 | 是 |
雨 | 低 | 否 |
阴 | 低 | 是 |
晴 | 适中 | 否 |
晴 | 低 | 是 |
雨 | 适中 | 是 |
第一步:算 “分裂前的熵”(没问任何问题时)
第二步:试 “用天气分裂”,算分裂后的平均熵
“天气” 有 3 类:晴(3 个样本)、阴(2 个)、雨(5 个):
晴:3 个全是 “否” → 熵 = 0
阴:2 个全是 “是” → 熵 = 0
雨:5 个里 4 个 “是”、1 个 “否” → 熵≈0.72
第三步:试 “用温度分裂”,算分裂后的平均熵
“温度” 有 3 类:高(3 个)、适中(3 个)、低(4 个):
高:3 个里 1 个 “是”、2 个 “否” → 熵≈0.92
适中:3 个里 2 个 “是”、1 个 “否” → 熵≈0.92
低:4 个里 3 个 “是”、1 个 “否” → 熵≈0.81
结论:
“天气” 的信息增益(0.52)比 “温度”(0)大 → 决策树先问 “天气怎么样”,再继续分!
4. 决策树的构建流程:4 步就能记住
其实就是 “算熵→试特征→选最优→再循环”,用生活类比更易记:
步骤 | 具体操作 | 生活类比(比如整理衣柜) |
1 | 计算当前节点的熵 | 先看衣柜乱不乱(乱 = 熵大,需要整理) |
2 | 用每个特征尝试分裂数据 | 试不同整理方法:按颜色分?按季节分? |
3 | 计算每个特征的信息增益,选最大的 | 看哪种方法让衣柜最整齐(增益最大) |
4 | 对分裂后的每个子节点,重复 1-3 步 | 每个整理好的小区域,再看看要不要细分(比如按颜色分好后,再按上衣 / 裤子分) |
终止条件 | 子节点熵 = 0(全是同一类),或没有新特征可分 | 某个区域的衣服全是 “夏天短袖”,不用再分了 |
5. 实战:用 Python 做一个决策树(跟着敲代码)
目标:用刚才的 “出去玩” 数据,训练一个决策树,预测 “晴、低温度” 时要不要出去玩。
5.1 准备工具:安装依赖
首先要装两个 Python 库:pandas(处理数据)、scikit-learn(机器学习工具)、matplotlib(画图)。
打开电脑的 “命令提示符”(Windows)或 “终端”(Mac),输入下面的命令,按回车:
# 安装依赖(如果报错,把pip换成pip3)
pip install pandas scikit-learn matplotlib
5.2 第一步:导入数据,创建表格
打开 Python 编辑器(比如 PyCharm、VS Code,或在线编辑器 Colab),敲下面的代码,每一行都有注释:
# 1. 导入处理数据的库pandas
import pandas as pd
# 2. 创建“出去玩”的数据集(和前面例子的 data 一样)
data = pd.DataFrame({
"天气": ["晴", "晴", "阴", "雨", "雨", "雨", "阴", "晴", "晴", "雨"],
"温度": ["高", "高", "高", "适中", "低", "低", "低", "适中", "低", "适中"],
"是否出去玩": ["否","否","是","是","是","否","是","否","是","是"]
})
# 3. 打印数据,确认没问题(运行后能看到表格就是对的)
print("原始数据:")
print(data)
运行代码后,会看到这样的输出:
原始数据:
天气 温度 是否出去玩
0 晴 高 否
1 晴 高 否
2 阴 高 是
3 雨 适中 是
4 雨 低 是
5 雨 低 否
6 阴 低 是
7 晴 适中 否
8 晴 低 是
9 雨 适中 是
5.3 第二步:把文字转成数字(机器只认数字)
决策树不能处理 “晴”“雨” 这种文字,必须转成数字(比如 “晴 = 0,阴 = 1,雨 = 2”)。用LabelEncoder工具做转换:
# 1. 导入转数字的工具
from sklearn.preprocessing import LabelEncoder
# 2. 创建转码器
encoder = LabelEncoder()
# 3. 对每一列文字数据转码(循环处理3列)
for col in data.columns: # col依次是“天气”“温度”“是否出去玩”
data[col] = encoder.fit_transform(data[col]) # 把文字转成0、1、2...
# 4. 打印转码后的数据,确认结果
print("\n转成数字后的数据:")
print(data)
运行后输出(数字对应关系:比如 “天气” 里雨 = 0,阴 = 1,晴 = 2;“是否出去玩” 否 = 0,是 = 1):
转成数字后的数据:
天气 温度 是否出去玩
0 2 0 0
1 2 0 0
2 1 0 1
3 0 1 1
4 0 2 1
5 0 2 0
6 1 2 1
7 2 1 0
8 2 2 1
9 0 1 1
5.4 第三步:训练决策树模型
把数据分成 “特征”(用来判断的条件:天气、温度)和 “标签”(要预测的结果:是否出去玩),然后训练模型:
# 1. 导入决策树分类器(因为我们要分“是/否”,属于分类任务)
from sklearn.tree import DecisionTreeClassifier
# 2. 拆分特征和标签:
# X = 特征(天气、温度)→ 用来做判断的条件
X = data[["天气", "温度"]]
# y = 标签(是否出去玩)→ 要预测的结果
y = data["是否出去玩"]
# 3. 创建决策树模型,指定用“信息熵”选特征(criterion="entropy")
model = DecisionTreeClassifier(criterion="entropy")
# 4. 训练模型(让模型“学习”数据里的规律)
model.fit(X, y)
print("\n模型训练完成!")
5.5 第四步:用模型做预测
比如我们想预测 “天气 = 晴(转码后是 2)、温度 = 低(转码后是 2)” 时,要不要出去玩:
# 预测:输入特征(天气=2(晴),温度=2(低))
# 注意:输入格式必须是 [[特征1, 特征2]](二维列表)
prediction = model.predict([[2, 2]])
# 把预测结果转成文字(0=否,1=是)
result = "是" if prediction[0] == 1 else "否"
print(f"\n预测:天气=晴、温度=低时,是否出去玩?→ {result}")
运行后输出:
预测:天气=晴、温度=低时,是否出去玩?→ 是
和我们之前数据里的第 8 行(晴、低、是)一致,预测对了!
6. 可视化决策树:看清它是怎么思考的
训练好的模型是 “黑盒”?用plot_tree把它画出来,就能看到每一步的决策逻辑:
# 1. 导入画图工具
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
# 2. 设置图片大小(宽8英寸,高6英寸)
plt.figure(figsize=(8, 6))
# 3. 画决策树:
# feature_names:特征的名字(天气、温度)
# class_names:标签的文字(0=不玩,1=玩)
# filled=True:用颜色区分节点(颜色越深,熵越小,数据越整齐)
plot_tree(
model,
feature_names=["天气", "温度"],
class_names=["不玩", "玩"],
filled=True,
rounded=True # 节点边角圆润一点,好看
)
# 4. 显示图片
plt.show()
运行后会弹出一张图,我们来解读关键部分:
根节点(最上面):天气 <= 0.5 → 天气转码后 “雨 = 0”,所以这里是 “天气是不是雨?”;entropy=0.88(和我们之前算的分裂前熵一致);value=[3,7](3 个 “不玩”,7 个 “玩”);class=玩(这个节点里多数是 “玩”)。
左子节点(天气 <=0.5,即雨):温度 <= 1.5(温度转码后 “高 = 0,适中 = 1,低 = 2”,即 “温度是不是高或适中?”);entropy=0.72(和之前算的雨的熵一致)。
最下面的叶子节点(比如天气>0.5→不是雨,再分天气<=1.5→阴):entropy=0(全是 “玩”),value=[0,2](0 个不玩,2 个玩),所以直接输出 “玩”。
这样一看,决策树的思考过程就全透明了!
7. 决策树的优缺点:什么时候用它?
优点(特别适合新手):
好懂好解释:可视化后能看清每一步决策,比神经网络等 “黑盒模型” 容易理解。
不用预处理数据:不用像其他模型(比如线性回归)那样做 “特征标准化”(比如把温度从 “高 / 低” 转成 0-1,或把房价从 100 万 / 200 万转成 0-1)。
符合人类思维:“问问题→做选择” 的逻辑和我们平时做决定一样,容易沟通。
缺点(要注意避坑):
容易过拟合:比如数据里有一个 “晴、高、不玩” 的特殊样本,决策树会专门为它加一个分支,导致遇到新数据时预测不准。
→ 解决办法:限制树的深度(比如DecisionTreeClassifier(max_depth=3)),或 “剪枝”(去掉不重要的分支)。
对数据敏感:数据稍微变一点(比如加一个样本),树的结构可能完全变了。
处理连续值麻烦:比如温度如果是 “25℃、30℃” 这种连续数字,决策树要拆分成 “<=28℃”“>28℃”,不如分类特征(高 / 低)好处理。
进阶方向:
如果觉得单个决策树不够准,可以学 “随机森林”(多个决策树一起投票)或 “梯度提升树”(多个决策树接力优化)—— 它们是基于决策树的更强大模型,在实际工作中用得更多。
8. 总结:0 基础也能记住的核心
决策树本质:“选最能区分数据的问题→分裂→再重复”,像人类做决定一样。
两个关键概念:
熵:衡量数据混乱度(乱→熵大,整齐→熵小)。
信息增益:选 “最有用” 的问题(增益大→分的效果好)。
实战流程:数据准备→转数字→拆分特征标签→训练模型→预测→可视化。
跟着这篇教程敲完代码,你已经掌握了决策树的核心!接下来可以试试用自己的数据(比如 “学生是否及格”:特征 = 作业完成率、上课出勤率,标签 = 及格 / 不及格),按步骤再做一遍,巩固一下~





