# 《零代码机器学习》90 分钟实验课 · 教师包

> **一句话**：让学生在一节课内，用自己的手把一份真实的传感器数据变成能用的模型，
> **全程不写一行代码、全程不联网**。
>
> 适用：本科高年级 / 研究生一年级｜无需编程基础｜Windows 10/11
> 配套数据：`har-teaching.csv`（随包提供，来源与许可见 `LICENSE-and-source.txt`）
>
> **教初中 / 高中？** 另有一套 `教师包-中学版-2课时.md`：同样的数据，换成 22 个
> 用中文讲得明白的特征、标签译成中文、拆成 2 课时（第 1 课时自成闭环）。
> 中学版**不建议**照搬本包的「两档对比」——实测在那份数据上「均衡」更慢且没有更准。

---

## 0. 为什么这门课值得上（给老师的 2 分钟）

市面上的 ML 入门课大多卡在同一个地方：**学生要先花两周装环境**（Python、conda、CUDA……），
等装完，热情已经没了。这门课把"装环境"整个拿掉，让学生**在 15 分钟内看到第一个模型跑出来**，
然后才有兴趣去问"它是怎么做到的"。

它同时解决了一个老师常遇到的现实问题：**实验室机器不能联网、数据不能出内网**。
本课**全程离线可跑**，不依赖任何云服务，也不需要学生注册账号。

**这门课的落点不是"教会调包"，是"建立正确的直觉"**——尤其是最后一节：
为什么 93% 的准确率**不**代表问题解决了。

---

## 1. 教学目标

| # | 目标 | 怎么验证达成了 |
|---|---|---|
| 1 | 说清监督学习三要素：**特征 / 标签 / 划分** | 学生能在报告里指出本实验的这三样分别是什么 |
| 2 | 亲手完成一次完整建模（导入→训练→评估→导出） | 导出目录存在且能被加载 |
| 3 | 理解**模型选择的权衡**：准确率 vs 体积 vs 时间 | 能解释为什么 95.4% 那一版的模型大了 20 倍 |
| 4 | ⭐ **批判性**：知道高准确率可能来自数据泄漏 | 能回答"93% 是否说明模型能用了" |

---

## 2. 课前准备（老师做，约 20 分钟）

- [ ] 在**至少一台教学机**上装好 Kvaxir（官网 https://kvaxir.com/download.html）
- [ ] 把 `har-teaching.csv` 拷到每台机器（或用 U 盘/局域网共享）
  - 也可让网络通畅的机器直接从：
    `https://kvaxir-dl-100053019339-1491474854.cos.ap-shanghai.myqcloud.com/teaching/har-teaching.csv`
    （4.6 MB，公开只读）
- [ ] **自己完整跑一遍并掐表**——见下方"上课前必做"
- [ ] 留意：**不要**让学生在这节课注册账号。训练完全是本地功能，不需要账号

### ⚠️ 上课前必做：掐表折算

本包的实测数字来自 **14 核 Intel Core Ultra 5 225H / 18GB 内存**的机器。
学生笔记本常见 4–8 核，**耗时大约是下表的 1.5–3 倍**。请务必自己跑一遍再安排时间。

| 步骤 | 本包实测（14 核） | 4–8 核机器的大致预期 |
|---|---|---|
| 速度优先档训练 | **约 51 秒** | 约 1.5–2.5 分钟 |
| 均衡档训练 | **约 94 秒** | 约 2.5–5 分钟 |
| 相同配置重复训练 | **秒级**（命中缓存） | 秒级 |

> 如果你们机房机器较弱，**把"均衡档"那一段改为演示**（老师一台机器投屏跑），
> 学生只自己做"速度优先"档。这样仍然完整覆盖教学目标 3。

---

## 3. 时间表（90 分钟）

| 时段 | 环节 | 分钟 | 关键动作 |
|---|---|---|---|
| 0:00–0:10 | **提问开场** | 10 | 手机怎么知道你在走路？把它变成一个数据问题 |
| 0:10–0:25 | **认识数据** | 15 | 导入 CSV，看懂 561 个特征和"标签"是什么 |
| 0:25–0:40 | **第一次训练**（速度优先） | 15 | 跑出第一个模型 ≈93% |
| 0:40–0:55 | **第二次训练**（均衡） | 15 | 对比：95.4%，但模型大了约 20 倍 |
| 0:55–1:10 | **看训练图谱** | 15 | AutoML 到底在做什么：它试了哪些模型 |
| 1:10–1:25 | ⭐ **导出 + 关键讨论** | 15 | "93% 够用吗？"——引入主体泄漏 |
| 1:25–1:30 | 收尾与作业 | 5 | 布置报告 |

---

## 4. 分步脚本

### 环节一（10 分钟）提问开场

**不要**先讲什么是机器学习。先问：

> 你的手机是怎么知道你**在走路**而不是**在站着**的？
> 它凭什么知道你是**上楼**还是**下楼**？

让学生自由回答 2–3 分钟（答案通常是"重力感应""陀螺仪""算法"）。然后收敛：

> 手机里有一个加速度计和一个陀螺仪，每秒测 50 次。
> 问题是：**从这些数字，怎么得出"他在上楼"这个结论？**
> 这正是我们这节课要做的事——而且我们要用**真实的数据**做。

指出今天数据的来历：30 个人，腰上绑一部手机，做 6 种动作，**全程录像**，人工打标签。
（这就是"监督学习"里"监督"二字的来源。）

---

### 环节二（15 分钟）认识数据

1. 打开 Kvaxir → 新建/进入一个项目
2. 导入 `har-teaching.csv`
3. 让学生自己看，然后提问：
   - 这份表有多少行？多少列？→ **720 行，563 列**
   - 哪一列是"答案"（标签）？→ **`标签`列**，取值是 6 种动作
   - 另外那一列 `来源` 是干什么的？→ 记录数据出处（本包用于**溯源**，训练时不参与）
   - 剩下 561 列是什么？→ 每个 2.56 秒窗口里算出来的特征（均值、标准差、能量……）

**要讲清楚的一个点**：561 列不是 561 个传感器，是**从 6 个通道的原始信号里加工出来的**。
这是机器学习里很常见的一步：**特征工程**。今天这一步别人已经替我们做好了，
所以我们可以直接开始训练。

---

### 环节三（15 分钟）第一次训练 · 速度优先

1. 选目标列 = `标签`
2. 档位选 **「速度优先」**
3. 点 **「开始训练」**

**预期结果（本包实测）**

| 项 | 值 |
|---|---|
| 耗时 | 约 **51 秒** |
| 最佳模型 | **LightGBMXT** |
| 验证得分 | **约 0.931（93.1%）** |
| 模型目录体积 | 约 **3.4 MB** |

让学生记下这三个数——**环节四要用它们做对比**。

> 如果学生问"为什么是 LightGBMXT 而不是别的"——**先别答**，留到环节五看图谱。

---

### 环节四（15 分钟）第二次训练 · 均衡

1. 档位改选 **「均衡」**，其余不变，再训一次

**预期结果（本包实测）**

| 项 | 速度优先 | 均衡 |
|---|---|---|
| 耗时 | 约 51 秒 | 约 **94 秒** |
| 最佳模型 | LightGBMXT | **WeightedEnsemble_L2** |
| 验证得分 | 约 93.1% | 约 **95.4%** |
| 模型体积 | 约 3.4 MB | 约 **75.0 MB** |

**这是本课最重要的对比**。引导学生自己说出结论：

- 准确率只涨了 **2.3 个百分点**
- 但训练时间翻了近一倍，**模型体积大了约 22 倍**
- → **"更高准确率"不是免费的，要问值不值**

**讨论**：如果这个模型要装到一个只有 1 MB 存储的单片机里，你选哪一档？
（答案：速度优先那一档，甚至还要再做压缩——这正是嵌入式部署的真实约束。）

> 补充说明：选「均衡」时会用**集成学习**（把多个模型组合起来投票），
> 所以它更准、但体积和耗时都更大。名字里的 `WeightedEnsemble` 就是"加权集成"。

---

### 环节五（15 分钟）看训练图谱

打开图谱页，让学生观察：

- 它**不是只训了一个模型**，而是试了很多个，然后挑最好的
- 这解释了环节三的疑问：**为什么最终是 LightGBMXT**——它是那批候选里验证得分最高的
- 真正的模型**选择过程**是自动的，人只需要定"档位"（也就是给多少时间预算）

**这里可以引入"时间预算"概念**：档位本质上是在说"我愿意花多少时间找模型"。

---

### 环节六（15 分钟）导出 + 关键讨论 ⭐

**先做导出**：导出模型，指出导出的是一个**标准模型包**——
不依赖 Kvaxir 也能被别人用 Python 加载推理。**这一点很重要**：
工具不该把你的成果锁死在它自己里面。

**然后进入本课的高潮讨论。** 问全班：

> 93% 的准确率。**这个模型现在能用了么？**

多数学生会说"能"或"差不多能"。然后给出这个事实：

> 这 720 条数据来自 **30 个不同的人**。我们刚刚是**随机**把它切成训练和测试的。
> 也就是说，同一个人可能既有数据在训练集里，也有数据在测试集里。
>
> 那么模型学到的，到底是"**走路**这件事"，
> 还是"**这 30 个人各自走路的样子**"？

这个现象叫 **主体泄漏（subject leakage）**。后果是**准确率虚高**：
模型在测试集上表现好，是因为它见过这个人，而不是因为它学会了走路。
如果换一个**从没见过的**人来测，准确率会掉。

学术界对这份数据的标准做法是**按人划分**（21 人训练 / 9 人测试），而不是随机划分。
本教学子集**没有保留 subject 列**（源文件里就没有），所以课堂上的数字是偏高的。

**收束成一句可以带走的话**：
> **一个高准确率，先要问它是在什么条件下测出来的。**
> 数据怎么划分，决定了这个数字意味着什么。

（这句也是本课最想留给学生的东西。它比"会用某个工具"重要得多。）

---

### 环节七（5 分钟）作业

见 `学生实验报告模板.md`。建议要求：

1. 填完整份报告（含三个实测数字）
2. 回答"93% 够用吗"这一题，**要说理由**

---

## 5. 常见卡点

| 现象 | 原因 | 怎么办 |
|---|---|---|
| 找不到 CSV | 文件没拷到机器上 | 提前用 U 盘/共享分发 |
| 训练很慢（超过 5 分钟） | 机房机器核数少 | 改用"速度优先"，或改为老师投屏演示 |
| 提示磁盘不足 | 模型目录占用大（均衡档可达 75 MB/次） | 课前清一次历史模型目录；或只用速度优先档 |
| 学生想注册账号 | 以为必须注册 | 说明：**训练是纯本地功能，不需要账号**；本课全程不联网 |
| 结果与手册数字略有出入 | 机器不同、随机种子不同 | 正常，误差 1–2 个百分点内可接受；**重点是对比趋势而非绝对值** |

---

## 6. 可选：把"离线"变成一次可验证的实验

本课最有说服力的一个环节，是让学生**自己证明数据没有外发**：

1. 打开 Windows「资源监视器」→「网络」标签
2. 保持窗口可见，然后去点"开始训练"
3. 观察：**整个训练期间，Kvaxir 没有任何网络流量**

这比老师说一百遍"它是本地的"都有用。如果你的课程涉及数据合规、涉密数据管理，
**强烈建议加这个环节**（约 5 分钟，从环节三的时间里挪）。

---

## 7. 延伸讨论（选做，适合研究生）

- 如果只有 100 条数据会怎样？→ 演示小样本下的方差
- 如果不平衡（比如"站立"占 90%）会怎样？→ 讨论为什么"准确率"会骗人，该看什么指标
- 如果设备老化了、换了传感器，模型还准吗？→ 引入**数据漂移**
- 为什么这里的 `来源` 列不能当特征用？→ 引入**特征泄漏**

---

## 7.5 教师支持计划（免费）

如果你打算把这节课用在自己的课程里，可以申请**免费的完整权限账号**：

- **给什么**：完整权限（**导出的模型不带水印**），与付费用户同权。一学期有效，到期可续
- **不包含**：AI 辅助功能（数据体检 / 结果点评 / 助手）按用量计费，需自行兑换
- **为什么本地训练不在权益里**：因为**本地训练本来就免费，而且不需要账号**
- **怎么申请**：用**学校邮箱**写一封邮件到 `elonfortec@163.com`，
  注明学校、院系与打算怎么用在课上；然后在 Kvaxir 里**正常注册一个账号**（同一个邮箱），
  把注册邮箱告诉我们，**人工开通**，通常 1–2 个工作日
- 说明页：https://kvaxir.com/teachers.html

> 目前是人工审核（没有自动化的教育邮箱验证）。若两三天没收到回复，可以再发一封。

---

## 8. 数据来源与许可（必须保留）

本课数据是 **UCI HAR** 数据集的分层抽样子集，许可为 **CC BY 4.0**。

> Reyes-Ortiz, J., Anguita, D., Ghio, A., Oneto, L., & Parra, X. (2013).
> Human Activity Recognition Using Smartphones [Dataset].
> UCI Machine Learning Repository. https://doi.org/10.24432/C5S4K

完整署名与原始实验说明见随包 `LICENSE-and-source.txt`，或在线获取：
`https://kvaxir-dl-100053019339-1491474854.cos.ap-shanghai.myqcloud.com/teaching/LICENSE-and-source.txt`
**分发本包时请一并保留该文件**（这是 CC BY 4.0 的署名要求）。

---

## 9. 关于本包的实测数字（可复现性声明）

- 测量机器：**14 核 Intel Core Ultra 5 225H / 18 GB 内存 / Windows**
- 数据：`har-teaching.csv`，720 行 × 563 列（6 类各 120 行，抽样种子固定为 42）
- 档位：速度优先 / 均衡，目标列 `标签`
- 复现方式：同一份数据、同一档位重复训练会**命中训练缓存并秒级返回**，
  所以做"改档位对比"时必须**换档位**才会真训（相同配置会直接给上次结果，这本身也是个可讲的知识点）

> 抽样脚本：`tools/growth/make_teaching_set.py`（`--per-class` 可调每类行数）
