机器学习是什么
这一课你将能做到
- 用一句话说清机器学习和传统编程的区别,并能向面试官完整解释
- 说出监督学习、无监督学习、强化学习各自解决什么问题,并各举一个本站场景的例子
- 亲手跑通第一个机器学习模型:根据做题记录预测一道题会不会做对
为什么要学
传统编程是「人写规则」:if 答对基础题多 and 平均用时短 then 掌握。规则越写越多、越写越乱,换个场景就失效,而且你根本说不清「掌握」到底由哪几条规则决定。机器学习把思路反过来:把历史数据(几千条做题记录)和结果(做对没做对)一起喂给算法,让它自己找出规律——这就是「从数据中学习」。
本站有两个真实需求正适合机器学习:根据用户做题记录预测「每个知识点的掌握度」,根据全站作答数据给「题目估难度」。这两件事手写规则很难做好。面试中「介绍一个你的机器学习项目」,答案就从这一课开始长出来。
先建立图像
传统编程: 规则 + 数据 → 答案
机器学习: 数据 + 答案 → 规则(模型)
本站例子:
输入特征 标签
┌─────────┬─────────┬──────┐ ┌────────┐
│ 做题数 │ 平均用时 │ 知识点 │ │ 是否答对 │
├─────────┼─────────┼──────┤ ├────────┤
│ 12 │ 45s │ 循环 │ ──▶ │ 1 │
│ 3 │ 180s │ 多线程│ ──▶ │ 0 │
│ 8 │ 60s │ 集合 │ ──▶ │ 1 │
└─────────┴─────────┴──────┘ └────────┘
模型学到的「规则」就是一个函数 f(做题数, 用时, 知识点) ≈ 答对概率
跟着做
步骤 1:准备环境
Python 3.11+,建虚拟环境并安装本课最小依赖:
python -m venv .venv
.venv\Scripts\activate # Windows;macOS/Linux 用 source .venv/bin/activate
pip install scikit-learn numpy
步骤 2:感受「规则 vs 学习」的差别
新建 intro_demo.py:
from sklearn.linear_model import LogisticRegression
import numpy as np
# 每行特征:[做题数, 平均用时(秒)],标签:1=答对 0=答错
X = np.array([
[12, 45], [8, 60], [10, 50], [15, 40], # 练得多、速度快 → 做对
[3, 180], [2, 200], [4, 160], [1, 220], # 练得少、卡壳久 → 做错
])
y = np.array([1, 1, 1, 1, 0, 0, 0, 0])
model = LogisticRegression()
model.fit(X, y) # 训练:从数据里学规律
# 预测一个新用户:做题 9 次、平均用时 55 秒
prob = model.predict_proba([[9, 55]])[0, 1]
print(f"答对概率: {prob:.2f}") # 约 0.9 左右
运行 python intro_demo.py,输出答对概率。你没有写任何 if 规则,模型从 8 条数据里自己学出了「做题多且快 → 大概率答对」。
步骤 3:看看模型学到了什么
print("系数:", model.coef_.round(3))
print("截距:", model.intercept_.round(3))
系数含义:做题数每 +1,答对的对数几率上升;用时每增加,对数几率下降。规则被模型「写」出来了——这就是简单模型的可解释性。
步骤 4:给模型出 4 组新样本
X_new = np.array([[9, 55], [2, 190], [14, 42], [5, 120]])
print(model.predict(X_new)) # [1 0 1 1]
print(model.predict_proba(X_new)[:, 1].round(2))
最后一组(做题 5 次、用时 120 秒)处于模糊地带,概率接近 0.5——真实系统里这种情况就该先推简单题巩固,而不是硬判「掌握」。
讲清楚要点
- 模型是函数,训练是拟合:模型就是
f(x) → y,训练过程用数据找一组合适的参数,让预测和真实答案的差距最小。 - 监督 / 无监督 / 强化三大类:有标准答案(标签)是监督学习(预测掌握度);没有标签、从数据里自己找结构是无监督(把题目自动聚成难度档);靠试错和奖励学习是强化(自适应出题策略)。
- 分类 vs 回归:预测离散结果(做对/做错、掌握/未掌握)叫分类;预测连续数值(难度分 0-100、预计用时)叫回归。同一个业务问题两种建模都可能成立,取决于产品要什么输出。
- 特征决定上限,模型只是逼近它:用时长、做题数、知识点这些特征选得好,简单模型也能很准;特征拉胯,再强的模型也救不回来。
- 先跑通,再谈精度:8 条数据就能把「训练→预测」闭环走通,几千条数据才谈得上调精度。初学者最容易犯的错是一开始就追求完美。
你可能会懵的地方
- 机器学习、AI、深度学习是什么关系? AI 是最大集合(还包括搜索、专家系统等);机器学习是 AI 的子集(从数据中学习);深度学习又是机器学习的子集(用多层神经网络)。本课程到 ml-dl 之前都是传统机器学习,表格数据上它至今仍是首选。
- 模型和算法有什么区别?
算法是训练过程(怎么找到参数,比如梯度下降),模型是训练产物(找到参数后的那个函数)。
LogisticRegression是算法类,model.fit(...)之后内存里的model对象才是模型。 - 数据要多少才够? 没有绝对数,经验上每个特征至少几十到几百条样本起步。本站每天产生的做题记录远超需求,真正的瓶颈通常是数据质量而不是数量。
- 为什么第一课就用 LogisticRegression? 它是最简单的有解释性的分类模型,一行 fit 一行 predict,能完整演示机器学习闭环,而且是面试必考题。理解它,后面所有模型都是它的变体或组合。
- 传统编程什么时候反而更好? 规则明确且稳定时直接写 if,比如「密码长度必须 ≥ 8」。机器学习适合规则说不清楚、但数据管够的场景。不要用大炮打蚊子。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 一上来就问「用什么神经网络」 | 跳过问题定义 | 先明确:预测什么?有没有标签?分类还是回归? |
| 把所有列都塞给模型 | 无关特征稀释信号 | 挑和结果有相关/因果关系的特征 |
| 训练集上看到 99% 就宣布成功 | 可能是背题不是学习 | 留出测试集,用没见过的数据验证 |
| 用全站平均正确率当个人掌握度 | 抹掉了个体差异 | 按用户特征建模,预测个人概率 |
| 脏数据直接 fit | 垃圾进垃圾出 | 先查缺失、异常值(ml-preprocess 详讲) |
卡点急救
ModuleNotFoundError: No module named 'sklearn':虚拟环境没激活或装错了地方。确认命令行提示符前面有(.venv),再执行pip install scikit-learn。predict_proba输出看不懂:返回两列[P(答错), P(答对)],取[:, 1]才是答对概率。- 中文路径报错:Python 脚本和数据文件放在纯英文路径下,避开编码坑。
面试常问
- 什么是机器学习?和传统编程的核心区别? 传统编程是人写规则处理数据得到答案;机器学习是用「数据 + 答案」自动学出规则(模型)。核心区别在规则是学出来的还是写出来的,学出来的规则能随数据分布变化而更新。
- 监督学习和无监督学习的区别?举个例子。 监督学习有标签,如用历史做题记录预测是否答对;无监督没有标签,目标是发现数据结构,如把题目按作答表现聚成难度档。本站预测掌握度属于监督学习,题目自动分组属于无监督。
- 分类和回归怎么选? 看预测目标:离散类别用分类(掌握/未掌握),连续数值用回归(难度分、预计用时)。产品需要概率就用分类的概率输出,需要一个分数就用回归。
自测三问
- 「数据 + 答案 → 规则」对应机器学习流程里哪两个环节?
- 预测「用户在知识点 X 的掌握度分数(0-100)」是分类还是回归?
model.fit和model.predict各干了什么?
小结一句话
机器学习用数据自动学出规则:特征进、预测出;监督/无监督/强化三大类,分类/回归两种输出——先把闭环跑通,再谈精度。
延伸
- scikit-learn 官方文档
- 下一课:ml-math 数学基础——不搞公式推导,只建立向量、概率、梯度下降三个直觉。