机器学习入门:决策树 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 基础也能记住的核心

决策树本质“选最能区分数据的问题→分裂→再重复”,像人类做决定一样。

两个关键概念

熵:衡量数据混乱度(乱→熵大,整齐→熵小)。

信息增益:选 “最有用” 的问题(增益大→分的效果好)。

实战流程:数据准备→转数字→拆分特征标签→训练模型→预测→可视化。

跟着这篇教程敲完代码,你已经掌握了决策树的核心!接下来可以试试用自己的数据(比如 “学生是否及格”:特征 = 作业完成率、上课出勤率,标签 = 及格 / 不及格),按步骤再做一遍,巩固一下~