视频链接
https://www.bilibili.com/video/BV1FJcvznE52/
人工智能初探:用随机森林做分类预测
本节目标
通过一个简单的例子,让你亲身体验如何用 AI 解决问题:
- 用随机森林算法识别鸢尾花的种类
- 理解机器学习的完整流程
- 学会使用 sklearn 库
什么是决策树?
决策树就像你平时做判断时的思考过程。
举个例子:判断一个水果是什么 🍎
你看到桌上有个水果,你会怎么想?
【开始】
│
▼
它是圆形的吗?
/ \
是 否
/ \
▼ ▼
它是红色的吗? 它是长条形的吗?
/ \ / \
是 否 是 否
| | | |
▼ ▼ ▼ ▼
苹果 橙子 香蕉 不确定
这就是一棵决策树!
- 每个方块是一个问题(判断条件)
- 每个分支是答案(是/否)
- 最下面的结果是最终判断
决策树是怎么"学习"的?
假设我们有很多水果的数据:
| 形状 | 颜色 | 大小 | 水果 |
|---|---|---|---|
| 圆形 | 红色 | 中等 | 苹果 |
| 圆形 | 橙色 | 中等 | 橙子 |
| 长条 | 黄色 | 大 | 香蕉 |
| 圆形 | 红色 | 小 | 苹果 |
决策树会自己找出最重要的问题:
- 先看"形状"——能区分出香蕉
- 再看"颜色"——能区分苹果和橙子
- 最后形成一棵树
什么是随机森林?
一棵决策树可能会犯错。那如果有很多棵树一起投票呢?
形象的理解 🌲🌲🌲
想象你要判断一个水果是苹果还是橘子:
单棵决策树:问 1 个朋友的意见
- 朋友可能看错,可能判断错
随机森林:问 100 个朋友的意见,然后投票
- 朋友1:看颜色 → 说是苹果
- 朋友2:看形状 → 说是橘子
- 朋友3:闻气味 → 说是苹果
- ...(100个朋友各自判断)
- 最后统计:苹果 70 票,橘子 30 票 → 结果是苹果
为什么叫"随机森林"?
"随机"体现在:每棵树看的数据和特征都是随机的
"森林"体现在:有很多棵树一起投票
可视化:三棵树的判断过程 🌲🌲🌲
假设桌上有一个水果,三棵树各自判断它是什么:
┌─────────────────────────────────────────────────────────────────┐
│ 随机森林(多棵树投票) │
│ │
│ 输入水果的特征数据: │
│ ┌─────────┬─────────┬─────────┬─────────┐ │
│ │ 形状=圆形 │ 颜色=红色 │ 大小=小 │ 气味=香 │ │
│ └─────────┴─────────┴─────────┴─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 树 1 │ │ 树 2 │ │ 树 3 │
│ (随机取 │ │ (随机取 │ │ (随机取 │
│ 2个特征)│ │ 2个特征)│ │ 2个特征)│
│ 形状+颜色│ │ 颜色+气味│ │ 大小+形状│
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
▼ ▼ ▼
形状=圆形? 颜色=红色? 大小=大?
/ \ / \ / \
是 否 是 否 是 否
| | | | | |
▼ ▼ ▼ ▼ ▼ ▼
再判断 香蕉 再判断 香蕉/橙子 西瓜 再判断
│ │ │
▼ ▼ ▼
颜色=红色? 气味=香? 形状=圆形?
/ \ / \ / \
是 否 是 否 是 否
| | | | | |
▼ ▼ ▼ ▼ ▼ ▼
苹果 橙子 苹果 橙子 苹果 葡萄
│ │ │
▼ ▼ ▼
【苹果】 【苹果】 【苹果】
│ │ │
└─────────────────────┼─────────────────────┘
│
▼
┌─────────────────┐
│ 投票统计结果 │
│ 苹果:3 票 │
│ 香蕉:0 票 │
│ 其他:0 票 │
│─────────────── │
│ 结果:苹果 ✓ │
└─────────────────┘
每棵树的"随机"体现在哪里?
| 树 | 随机选取的特征 | 判断逻辑 |
|---|---|---|
| 树1 | 形状 + 颜色 | 先看形状,再看颜色 |
| 树2 | 颜色 + 气味 | 先看颜色,再闻气味 |
| 树3 | 大小 + 形状 | 先看大小,再看形状 |
关键点:
- 每棵树只用部分特征(不是全部特征)
- 每棵树的判断顺序也不一样
- 有的树"眼光准",有的树可能"看错",但投票后结果更准确
随机森林的优点
| 优点 | 说明 |
|---|---|
| ✅ 准确 | 多棵树投票,减少错误 |
| ✅ 稳定 | 不会因为一两棵树的错误就误判 |
| ✅ 简单 | 不用调太多参数 |
| ✅ 抗干扰 | 对异常值不敏感 |
我们要解决的问题
鸢尾花分类问题
鸢尾花有 3 个品种:
- 山鸢尾(Setosa)
- 杂色鸢尾(Versicolor)
- 维吉尼亚鸢尾(Virginica)
每种花有 4 个测量数据:
- 花萼长度
- 花萼宽度
- 花瓣长度
- 花瓣宽度
目标:根据这 4 个数据,判断是哪种鸢尾花
数据集里的特征和标签
在机器学习里,数据通常分为两部分:特征和标签。
什么是特征(Features)?
特征就是描述事物的属性,是我们用来做判断的依据。
以鸢尾花数据集为例:
| 特征名称 | 说明 | 示例值 |
|---|---|---|
| 花萼长度 | 花萼的长度(厘米) | 5.1 cm |
| 花萼宽度 | 花萼的宽度(厘米) | 3.5 cm |
| 花瓣长度 | 花瓣的长度(厘米) | 1.4 cm |
| 花瓣宽度 | 花瓣的宽度(厘米) | 0.2 cm |
类比理解:
- 就像判断一个人是男是女,你可能会看:身高、发型、穿着等——这些都是特征
- 就像判断一个水果是苹果还是香蕉,你会看:形状、颜色、大小——这些都是特征
什么是标签(Label)?
标签就是我们要预测的结果,是数据的正确答案。
| 标签值 | 花的种类 | 说明 |
|---|---|---|
| 0 | setosa | 山鸢尾 |
| 1 | versicolor | 杂色鸢尾 |
| 2 | virginica | 维吉尼亚鸢尾 |
类比理解:
- 就像练习题的答案
- 就像照片下面标注的人物姓名
特征与标签的关系
┌─────────────────────────────────────────────────────────┐
│ 鸢尾花数据集示例 │
├──────────┬──────────┬──────────┬──────────┬─────────────┤
│ 花萼长度 │ 花萼宽度 │ 花瓣长度 │ 花瓣宽度 │ 标签(种类) │
│ (特征1) │ (特征2) │ (特征3) │ (特征4) │ │
├──────────┼──────────┼──────────┼──────────┼─────────────┤
│ 5.1 │ 3.5 │ 1.4 │ 0.2 │ 0(setosa) │
│ 4.9 │ 3.0 │ 1.4 │ 0.2 │ 0(setosa) │
│ 6.3 │ 3.3 │ 6.0 │ 2.5 │ 2(virginica)│
└──────────┴──────────┴──────────┴──────────┴─────────────┘
↑ ↑
特征(X) 标签(y)
(输入/题目) (输出/答案)
在代码中的表示
# X 是大写的,表示特征矩阵(多行多列的数据)
X = iris.data # 形状是 (150, 4),150朵花,每朵4个特征
# y 是小写的,表示标签向量(一列数据)
y = iris.target # 形状是 (150,),150个标签
记忆技巧:
- X 像交叉路口,有很多条路(多列特征)
- y 像一条直线,只有一个方向(一列标签)
训练集和测试集的区别(通俗讲解)
在写代码之前,我们先理解一个重要概念。
举个生活中的例子 📝
想象你要参加数学考试:
训练集 = 练习题
- 老师给你 100 道练习题
- 你反复做这些题,学会解题方法
- 你可以对答案,知道自己哪里错了
- 目标:学会知识和方法
测试集 = 考试题
- 老师出 20 道从没见过的新题
- 你不能提前看答案
- 用来检验你真正学会了没有
- 目标:检验学习效果
为什么要分开?
假设老师把考试题提前给你做:
- 你把答案背下来了,考试得 100 分
- 但你其实没学会,换个题就不会了
- 这叫"过拟合"——死记硬背,不会变通
再举个更形象的例子 🐕
你教小朋友认识狗狗:
训练集:给他看 100 张狗狗的照片
- 边看他边学:"有四条腿、有尾巴、毛茸茸的是狗"
- 他可以问"这是狗吗?",你告诉他答案
测试集:给他看 20 张新照片(他没见过)
- 有狗、有猫、有兔子
- 看他能不能正确分辨
- 如果他说对了,说明他真的学会了
如果不用测试集会怎样?
- 小朋友把 100 张照片背下来了
- 你拿其中一张问他,他答对了
- 但遇到新照片,他就傻眼了
在本案例中
我们有 150 朵鸢尾花的数据:
- 训练集(80%,120朵):让模型学习规律
- 测试集(20%,30朵):检验模型学得怎么样
黄金法则:
- 训练时,模型只能看到训练集
- 测试集要保密,直到最后检验才用
- 就像考试不能提前看试卷一样!
模型训练流程
┌─────────────┐
│ 1. 准备数据 │ ← 收集、清洗数据
└──────┬──────┘
↓
┌─────────────┐
│ 2. 划分数据 │ ← 一部分学习,一部分测试
└──────┬──────┘
↓
┌─────────────┐
│ 3. 选择算法 │ ← 这里用随机森林
└──────┬──────┘
↓
┌─────────────┐
│ 4. 训练模型 │ ← 让模型学习规律
└──────┬──────┘
↓
┌─────────────┐
│ 5. 评估模型 │ ← 测试模型好不好
└──────┬──────┘
↓
┌─────────────┐
│ 6. 使用模型 │ ← 预测新数据
└─────────────┘
环境准备
在运行代码之前,需要先安装 sklearn 库:
pip install scikit-learn
完整代码
# 第一步:导入需要的工具
from sklearn.datasets import load_iris # 加载鸢尾花数据集
from sklearn.model_selection import train_test_split # 划分训练集和测试集
from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
from sklearn.metrics import accuracy_score # 计算准确率
# 第二步:加载数据
print("正在加载鸢尾花数据集...")
iris = load_iris()
# 看看数据长什么样
print(f"数据集大小:{iris.data.shape}") # (150, 4) 表示150朵花,每朵4个特征
print(f"特征名称:{iris.feature_names}")
print(f"花的种类:{iris.target_names}")
print()
# 打印前5行数据
print("前5个样本数据:")
print("花萼长度 花萼宽度 花瓣长度 花瓣宽度 种类")
for i in range(5):
features = iris.data[i]
target = iris.target[i]
target_name = iris.target_names[target]
print(f" {features[0]:.1f} {features[1]:.1f} {features[2]:.1f} {features[3]:.1f} {target}({target_name})")
print()
# 第三步:准备训练数据和测试数据
# 把数据分成两部分:80%用来学习,20%用来考试
X_train, X_test, y_train, y_test = train_test_split(
iris.data, # 花的4个测量数据
iris.target, # 花的种类标签(0, 1, 2)
test_size=0.2, # 20%用来测试
random_state=42 # 随机种子,保证每次结果一样
)
print(f"训练数据:{len(X_train)}朵")
print(f"测试数据:{len(X_test)}朵")
print()
# 第四步:创建并训练模型
print("正在训练随机森林模型...")
model = RandomForestClassifier(
n_estimators=100, # 用100棵树
random_state=42
)
model.fit(X_train, y_train) # 训练!这就是"学习"的过程
print("训练完成!")
print()
# 第五步:用模型做预测
print("用测试数据检验模型...")
predictions = model.predict(X_test)
# 第六步:查看结果
accuracy = accuracy_score(y_test, predictions)
print(f"预测准确率:{accuracy * 100:.1f}%")
print()
# 看看具体预测了哪些
print("测试样本预测结果:")
for i in range(len(X_test)):
true_name = iris.target_names[y_test[i]]
pred_name = iris.target_names[predictions[i]]
mark = "✓" if y_test[i] == predictions[i] else "✗"
print(f" 样本{i+1}: 实际是{true_name}, 预测是{pred_name} {mark}")
print()
print("=" * 50)
print("练习:预测一朵新花")
print("=" * 50)
# 第七步:预测一朵新花
# 假设你测量了一朵花:花萼长5.1cm,宽3.5cm,花瓣长1.4cm,宽0.2cm
new_flower = [[5.1, 3.5, 1.4, 0.2]]
result = model.predict(new_flower)
prob = model.predict_proba(new_flower) # 预测概率
print(f"新花的测量数据:{new_flower[0]}")
print(f"预测结果:{iris.target_names[result[0]]}")
print(f"预测概率:")
for i, name in enumerate(iris.target_names):
print(f" {name}: {prob[0][i]*100:.1f}%")
运行结果示例
正在加载鸢尾花数据集...
数据集大小:(150, 4)
特征名称:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
花的种类:['setosa' 'versicolor' 'virginica']
前5个样本数据:
花萼长度 花萼宽度 花瓣长度 花瓣宽度 种类
5.1 3.5 1.4 0.2 0(setosa)
4.9 3.0 1.4 0.2 0(setosa)
4.7 3.2 1.3 0.2 0(setosa)
4.6 3.1 1.5 0.2 0(setosa)
5.0 3.6 1.4 0.2 0(setosa)
训练数据:120朵
测试数据:30朵
正在训练随机森林模型...
训练完成!
用测试数据检验模型...
预测准确率:100.0%
测试样本预测结果:
样本1: 实际是setosa, 预测是setosa ✓
样本2: 实际是versicolor, 预测是versicolor ✓
...
==================================================
练习:预测一朵新花
==================================================
新花的测量数据:[5.1, 3.5, 1.4, 0.2]
预测结果:setosa
预测概率:
setosa: 100.0%
versicolor: 0.0%
virginica: 0.0%
代码解析
1. 数据划分 train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
数据集划分可视化
┌─────────────────────────────────────────────────────────────────────┐
│ 原始数据集 (150朵鸢尾花) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 特征 X (150, 4) │ 标签 y (150,) │ │
│ │ ┌─────┬─────┬─────┬─────┐ ┌─────────┐ │ │
│ │ │花萼长│花萼宽│花瓣长│花瓣宽│ │ 种类 │ │ │
│ │ ├─────┼─────┼─────┼─────┤ ├─────────┤ │ │
│ │ │ 5.1 │ 3.5 │ 1.4 │ 0.2 │ │ setosa │ │ │
│ │ │ 4.9 │ 3.0 │ 1.4 │ 0.2 │ │ setosa │ │ │
│ │ │ ... │ ... │ ... │ ... │ │ ... │ │ │
│ │ │ 6.3 │ 3.3 │ 6.0 │ 2.5 │ │virginica│ │ │
│ │ └─────┴─────┴─────┴─────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼ train_test_split(test_size=0.2)
┌───────────────────────────┴───────────────────────────┐
│ │
▼ ▼
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ 训练集 (80% = 120朵) │ │ 测试集 (20% = 30朵) │
│ ┌───────────────────────┐ │ │ ┌───────────────────────┐ │
│ │ X_train (120, 4) │ │ │ │ X_test (30, 4) │ │
│ │ ┌─────┬─────┬─────┐ │ │ │ │ ┌─────┬─────┬─────┐ │ │
│ │ │花萼长│花萼宽│... │ │ │ │ │ │花萼长│花萼宽│... │ │ │
│ │ ├─────┼─────┼─────┤ │ │ │ │ ├─────┼─────┼─────┤ │ │
│ │ │ 5.1 │ 3.5 │ ... │ │ │ │ │ │ 6.3 │ 3.3 │ ... │ │ │
│ │ └─────┴─────┴─────┘ │ │ │ │ └─────┴─────┴─────┘ │ │
│ └───────────────────────┘ │ │ └───────────────────────┘ │
│ ┌───────────────────────┐ │ │ ┌───────────────────────┐ │
│ │ y_train (120,) │ │ │ │ y_test (30,) │ │
│ │ ┌─────────┐ │ │ │ │ ┌─────────┐ │ │
│ │ │ 种类 │ │ │ │ │ │ 种类 │ │ │
│ │ ├─────────┤ │ │ │ │ ├─────────┤ │ │
│ │ │ setosa │ │ │ │ │ │virginica│ │ │
│ │ └─────────┘ │ │ │ │ └─────────┘ │ │
│ └───────────────────────┘ │ │ └───────────────────────┘ │
│ │ │ │
│ 📝 用于:模型学习规律 │ │ 📝 用于:检验模型效果 │
└─────────────────────────────┘ └─────────────────────────────┘
变量说明
| 变量 | 含义 | 作用 |
|---|---|---|
X_train |
训练数据(花的特征) | 让模型学习规律 |
y_train |
训练标签(花的种类) | 告诉模型正确答案 |
X_test |
测试数据(花的特征) | 检验模型学得怎么样 |
y_test |
测试标签(花的种类) | 计算准确率 |
X是题目(花的测量数据)y是答案(花的种类)test_size=0.2表示 20% 数据用来测试
划分过程示意
原始数据: [🌸][🌸][🌸][🌼][🌼][🌼][🌺][🌺][🌺]... (150朵)
↓ 随机打乱并划分
训练集(80%): [🌸][🌼][🌺][🌸][🌼][🌺]... (120朵) → 用来学习
测试集(20%): [🌸][🌼][🌺]... (30朵) → 用来考试
2. 训练模型 model.fit()
model.fit(X_train, y_train)
- 这就是"学习"的过程
- 模型通过看大量的例子,找出规律
- 就像你通过做很多题,学会了解题方法
3. 预测 model.predict()
predictions = model.predict(X_test)
- 用训练好的模型做预测
- 就像考试时用学到的知识答题
4. 评估 accuracy_score
accuracy = accuracy_score(y_test, predictions)
- 计算预测对了多少
- 准确率 = 预测对的数量 ÷ 总数量
动手练习
练习 1:修改树的数量
把 n_estimators=100 改成 n_estimators=10,看看准确率有什么变化。
model = RandomForestClassifier(n_estimators=10, random_state=42)
思考:树越多,结果一定越好吗?
练习 2:预测不同的花
修改下面的数据,预测其他花:
# 试试这朵花的测量数据
new_flower = [[6.0, 3.0, 4.5, 1.5]] # 修改这里
result = model.predict(new_flower)
print(f"预测结果:{iris.target_names[result[0]]}")
练习 3:查看特征重要性
# 看看哪个特征最重要
importances = model.feature_importances_
for name, importance in zip(iris.feature_names, importances):
print(f"{name}: {importance:.3f}")
思考:花瓣宽度和花萼长度,哪个对判断花的种类更重要?
本节小结
✅ 你学会了:
- 使用 sklearn 加载内置数据集
- 用随机森林进行分类预测
- 划分训练集和测试集
- 评估模型准确率
✅ 关键概念:
- 随机森林:多棵决策树投票决定结果
- 训练集:用来学习的数据
- 测试集:用来检验的数据
- 准确率:预测正确的比例
拓展阅读
想要了解更多?可以试试:
- 用其他算法(如决策树、K近邻)对比效果
- 尝试其他 sklearn 内置数据集(如手写数字识别)
- 可视化决策树的结构
下节课,我们将学习更多机器学习算法!
思维导图
┌─────────────────┐
│ 人工智能初探 │
│ 随机森林分类预测 │
└────────┬────────┘
│
┌────────────────────────────────────┼────────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 核心概念 │ │ 实践操作 │ │ 知识拓展 │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
┌────┴────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│决策树 │ │随机森林│ │数据准备│ │模型训练│ │动手练习│ │拓展阅读│
└──┬───┘ └──┬───┘ └───┬────┘ └───┬────┘ └───┬────┘ └───┬────┘
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│• 思考过程的可视化 │ │• 加载鸢尾花数据集 │ │• 修改树的数量 │
│• 问题→分支→结果 │ │• 划分训练集/测试集 │ │• 预测不同的花 │
│• 自动找出重要特征 │ │ (80%训练,20%测试) │ │• 查看特征重要性 │
└─────────────────┘ │• 创建随机森林模型 │ └─────────────────────┘
│ (n_estimators=100) │
┌─────────────────┐ │• 训练模型(fit) │
│• 多棵树投票决策 │ │• 预测与评估 │
│• 每棵树随机特征 │ │ (accuracy_score) │
│• 减少错误更稳定 │ │• 预测新数据 │
└─────────────────┘ └─────────────────────┘
核心概念详解
决策树:像做判断时的思考过程,通过一系列问题(判断条件)和分支(是/否),最终得到结果。
随机森林:多棵决策树一起投票决定结果,每棵树看不同的随机特征,更准确、更稳定。
数据集结构
┌─────────────────────────────────────────────────────────────────┐
│ 鸢尾花数据集 (150朵) │
├─────────────────────────────────────────────────────────────────┤
│ 特征 (X) - 输入/题目 标签 (y) - 输出/答案 │
│ ┌────────┬────────┬────────┬────────┐ ┌──────────────┐ │
│ │花萼长度 │花萼宽度 │花瓣长度 │花瓣宽度 │ │ 花的种类 │ │
│ │ 5.1 │ 3.5 │ 1.4 │ 0.2 │ │ 0=setosa │ │
│ │ 4.9 │ 3.0 │ 1.4 │ 0.2 │ │ 1=versicolor │ │
│ └────────┴────────┴────────┴────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘
模型训练流程
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1.准备数据 │────▶│ 2.划分数据 │────▶│ 3.选择算法 │
│ 加载数据集 │ │ 训练集80% │ │ 随机森林 │
└─────────────┘ └─────────────┘ └──────┬──────┘
│
┌─────────────┐ ┌─────────────┐ ┌─────┴─────┐
│ 6.使用模型 │◀────│ 5.评估模型 │◀────│ 4.训练模型 │
│ 预测新数据 │ │ 计算准确率 │ │ model.fit │
└─────────────┘ └─────────────┘ └───────────┘
本节要点总结
| 要点 | 内容 |
|---|---|
| 🎯 目标 | 用随机森林识别鸢尾花种类 |
| 🌲 算法 | 随机森林 = 多棵决策树投票 |
| 📊 数据 | 150朵花,4个特征,3个类别 |
| 🔧 工具 | sklearn库 |
| 📈 评估 | 准确率 = 预测正确数 ÷ 总数 |
| 📝 关键 | 训练集学习,测试集检验 |
浙公网安备 33010602011771号