简介:这份机器学习期末复习题PDF面向高校学生与备考者,用于系统梳理课程核心考点、检验知识掌握程度。内容覆盖监督与无监督学习、概率分布与共轭先验、朴素贝叶斯、线性分类、支持向量机、集成学习、决策树、聚类与降维等模块,并以单选题形式呈现,题干涉及贝叶斯分类器、Beta与Dirichlet分布、核函数与软间隔参数C、Bagging与Boosting差异、信息增益与基尼指数、PCA降维及过拟合规避等具体知识点,便于对照课堂进度逐章自测。资源包共1个PDF文件,大小约4.83MB,结构紧凑,适合打印或平板阅读。目前已有13523人学习下载,热度较高。借助这份题库,读者可快速定位薄弱章节,结合选项解析理解算法原理与易混淆概念,为期末冲刺提供清晰的复习路径。
1. 一份“机器学习期末复习题.pdf”背后,藏着多少能直接跑通的工程能力
期末周前两周,某高校实验室的 A 同学把一份“机器学习期末复习题.pdf”丢进群里,配文只有一句:“这玩意儿到底怎么复习才不翻车?”我翻了几页,发现它根本不是普通题库——里面混着公式推导、伪代码填空、数据集划分计算、模型评估指标手算,还有几道“给定场景选模型并说明理由”的开放题。换句话说,这份 PDF 表面是复习资料,实际是一份压缩过的机器学习工程能力清单:你既要能背出偏差方差分解,也要能手算混淆矩阵,还要能解释为什么在类别极不平衡时准确率会骗人。
如果你是在校生,它能帮你把散落在十几章 PPT 里的知识点串成一条可推导的线;如果你已经工作,想借复习题重新夯实基础,它同样是一份低成本的自测工具。问题在于,大多数人复习机器学习的方式是“看一遍、划重点、背公式”,结果一到手算题就卡住,一到选型题就凭感觉。这篇笔记不打算给你押题,而是把这份复习题 PDF 里最常出现的几类题型,拆成可以动手复现的步骤——从公式推导到代码验证,从参数含义到踩坑记录。你照着做一遍,复习题就不再是黑匣子,而是一张能自己出题、自己判卷的检查表。
2. 把复习题拆成可执行模块:从公式推导到代码验证的完整链路
2.1 先分清四类题型,别用同一种方式复习
一份典型的机器学习期末复习题 PDF,题目大致落在四个区域:数学推导、算法流程、评估计算、场景选型。数学推导题要求你写出损失函数对参数的偏导,或者证明某个不等式;算法流程题常给一段伪代码,让你补全更新步骤或判断收敛条件;评估计算题会给你一个混淆矩阵,让你算精确率、召回率、F1;场景选型题则描述一个业务背景,问你选哪个模型、为什么、怎么调参。
这四类题的复习方式完全不同。推导题必须手写一遍,不能只看;流程题要对着代码跑一遍,看每一步张量形状怎么变;评估题要拿真实数据算一遍,感受指标之间的拉扯;选型题要建立自己的决策树,而不是背“数据量大用深度学习”这种空话。我一般会建议把 PDF 里的题目按这四类打标签,然后每类挑三道典型题做深,比刷完一整本都有用。
2.2 用 Python 复现一道手算题:从公式到数值验证
复习题里最常见的计算题之一是:给定线性回归的损失函数 (J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2),求 (\theta_j) 的偏导并写出梯度下降更新式。手写推导之后,最好用代码验证一遍,否则你永远不知道自己符号有没有搞反。
import numpy as np # 构造一个极简数据集:3 个样本,1 个特征 X = np.array([[1.0], [2.0], [3.0]]) y = np.array([[2.0], [4.0], [6.0]]) m = len(y) # 初始化参数 theta = np.array([[0.0], [0.0]]) # theta0 是截距,theta1 是斜率 X_b = np.c_[np.ones((m, 1)), X] # 给 X 加一列 1,方便矩阵运算 learning_rate = 0.1 n_iterations = 100 for iteration in range(n_iterations): # 前向计算:预测值 y_pred = X_b.dot(theta) # 计算梯度:这里对应手推公式 (1/m) * X_b.T * (y_pred - y) gradients = (1.0 / m) * X_b.T.dot(y_pred - y) # 更新参数 theta = theta - learning_rate * gradients print("最终 theta:", theta.ravel()) print("预测值:", X_b.dot(theta).ravel())这段代码的关键不是跑出结果,而是让你看到手推公式里的每一项在代码里长什么样。gradients那一行就是偏导的矩阵形式,1.0/m对应损失函数里的 (\frac{1}{m}),X_b.T对应求和后对每个特征的分量。如果你手推时漏了1/m,代码跑出来的收敛速度会明显不同。参数learning_rate设成 0.1 是因为这个数据尺度小,再大容易震荡;n_iterations设 100 是因为这个简单问题几十步就收敛了。你可以故意把学习率改成 1.0,观察损失怎么炸掉——这就是复习题里“梯度下降发散条件”的直观来源。
2.3 混淆矩阵手算题:用 sklearn 对答案,但别依赖它
评估计算题几乎每份复习题都有:给一个 3x3 混淆矩阵,算宏平均 F1 和微平均 F1。手算时最容易错的是“宏平均先算每个类别的 F1 再平均”和“微平均先汇总 TP、FP、FN 再算”这两个顺序。我一般会先用代码算一遍,再手算对答案。
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score import numpy as np # 假设真实标签和预测标签 y_true = [0, 1, 2, 0, 1, 2, 0, 1, 2, 0] y_pred = [0, 2, 1, 0, 0, 2, 0, 1, 2, 1] # 混淆矩阵 cm = confusion_matrix(y_true, y_pred) print("混淆矩阵:\n", cm) # 宏平均 F1:先算每个类别的 F1,再取平均 macro_f1 = f1_score(y_true, y_pred, average='macro') print("宏平均 F1:", macro_f1) # 微平均 F1:先汇总所有 TP、FP、FN,再算 F1 micro_f1 = f1_score(y_true, y_pred, average='micro') print("微平均 F1:", micro_f1) # 每个类别的精确率和召回率 for cls in [0, 1, 2]: p = precision_score(y_true, y_pred, labels=[cls], average='micro') r = recall_score(y_true, y_pred, labels=[cls], average='micro') print(f"类别 {cls}:精确率={p:.3f},召回率={r:.3f}")跑完这段代码,你会发现宏平均 F1 和微平均 F1 在这个例子里不一样。宏平均对每个类别一视同仁,哪怕类别 2 样本少,它的 F1 也会被同等权重计入;微平均则被样本多的类别主导。复习题里如果问“哪个指标更适合类别不平衡场景”,答案通常不是绝对的,而是要看你是更关心少数类还是整体表现。参数average='macro'和average='micro'就是两种汇总逻辑,手算时一定要先写清楚每个类别的 TP、FP、FN,再套公式。
2.4 选型题怎么答才不像背课文:建一棵自己的决策树
场景选型题最怕写成“因为随机森林效果好所以选它”。复习题 PDF 里这类题通常会给几个约束:样本量、特征维度、是否在线学习、可解释性要求。我一般会按下面这棵决策树来组织答案:
| 约束条件 | 优先考虑 | 次选 | 要避开的坑 |
|---|---|---|---|
| 样本量小于 1000,特征少于 50 | 逻辑回归 / 决策树 | SVM(RBF 核) | 深度学习几乎必过拟合 |
| 样本量大于 10 万,特征维度高 | 线性模型 + 正则化 | 梯度提升树 | 不要一上来就上深度网络 |
| 要求强可解释性 | 逻辑回归 / 决策树 | 朴素贝叶斯 | 集成模型解释成本高 |
| 需要在线学习 | 随机梯度下降 | 被动攻击算法 | 批量算法无法增量更新 |
| 类别极度不平衡 | 代价敏感学习 | 集成方法 + 重采样 | 只看准确率会翻车 |
这张表不是标准答案,而是帮你把“选型理由”拆成可检查的条目。复习题里如果给了具体数字,你就把数字填进约束条件,然后按表推导。比如“样本 500,特征 20,要求可解释”,那就直接落到逻辑回归或决策树,再补一句“因为样本量小,树模型需要限制最大深度防止过拟合”。这样答,比背一百遍“随机森林好”都有用。
3. 复习题里那些“看起来会、一算就错”的坑:5 个血泪排查记录
3.1 坑一:梯度下降手推时漏掉 1/m,收敛速度对不上
现象:手推公式和代码跑出来的参数更新量差了一个数量级,复习题里给的参考答案是 0.01 的更新步长,你算出来是 0.1。
原因:损失函数定义里有没有 (\frac{1}{m}) 或 (\frac{1}{2m}) 会直接影响梯度尺度。很多教材在推导时为了简洁会省略 (\frac{1}{m}),但代码实现里通常保留。复习题如果给了损失函数完整形式,就必须按完整形式推。
解决:先看题目给的损失函数有没有求和符号前的系数。如果有 (\frac{1}{m}),梯度里就必须带 (\frac{1}{m});如果只写了 (\sum),那梯度里就没有。最稳妥的办法是用一个小数据集同时手算和代码算,对不上就检查系数。
3.2 坑二:混淆矩阵转置,精确率和召回率对调
现象:手算的精确率是 0.6,代码跑出来是 0.4,检查半天发现混淆矩阵行列写反了。
原因:混淆矩阵的行通常代表真实标签,列代表预测标签,但有些教材反过来。复习题里如果没明确标注,很容易按自己的习惯写。
解决:在草稿纸上先画一个 2x2 表格,标清楚“行=真实,列=预测”,然后再填数字。算精确率时分母是“预测为该类的总数”(列和),算召回率时分母是“真实为该类的总数”(行和)。如果题目给了混淆矩阵但没说明方向,就按 sklearn 的默认方向来:行是真实,列是预测。
3.3 坑三:正则化项系数手算时忘记乘 1/2
现象:带 L2 正则化的损失函数求导,手算结果和参考答案差一个系数 2。
原因:L2 正则项通常写成 (\frac{\lambda}{2}|\theta|^2),求导后是 (\lambda\theta)。如果写成 (\lambda|\theta|^2),求导后就是 (2\lambda\theta)。复习题里如果给了正则项的具体形式,必须按给定形式推。
解决:看到正则项先看有没有 (\frac{1}{2})。有 (\frac{1}{2}) 的,求导后系数是 (\lambda);没有的,求导后系数是 (2\lambda)。这个细节在复习题里经常用来区分“是否认真推导过”。
3.4 坑四:宏平均 F1 和微平均 F1 在类别不平衡时差距巨大
现象:复习题给了一个类别不平衡的混淆矩阵,你算宏平均 F1 是 0.75,微平均 F1 是 0.92,不确定该填哪个。
原因:宏平均对每个类别等权重,微平均对每个样本等权重。类别不平衡时,样本多的类别会主导微平均,导致微平均偏高。
解决:先看题目问的是“整体性能”还是“各类别平均性能”。如果问整体,用微平均;如果问模型对少数类的表现,用宏平均。如果题目没明确,就把两个都算出来,并说明差异原因。复习题里这种题往往就是考你知不知道两者区别。
3.5 坑五:选型题只写模型名,不写约束条件
现象:答案写了“用 SVM”,但题目里明明说了样本量 10 万,SVM 训练时间根本扛不住。
原因:选型题考的是“在给定约束下做权衡”,不是考你知不知道模型名字。只写模型名,等于没答。
解决:答题时按“约束 → 候选模型 → 排除理由 → 最终选择 → 调参方向”五步写。比如“样本 10 万,特征 100,要求在线学习:候选有线性模型和树模型;树模型不支持在线学习,排除;线性模型加 SGD 可以增量更新,选它;调参重点是学习率和正则化系数。”这样写,即使最终模型选得不是最优,逻辑分也能拿到。
4. 从复习题到真实项目:把 PDF 里的题改造成可复现的小实验
4.1 用复习题里的公式生成一份自己的“错题集”
复习题做完一遍,最有价值的不是分数,而是错题。我一般会把错题按“公式记错、概念混淆、计算失误、选型理由不充分”四类归档,然后每类挑一道题,改造成一个可运行的小实验。比如公式记错的题,就写一段代码验证公式;概念混淆的题,就找两个容易混的指标,用同一份数据算出来对比。
import numpy as np from sklearn.metrics import precision_score, recall_score, f1_score # 模拟一个类别不平衡场景:100 个样本,正类只有 5 个 y_true = np.array([1]*5 + [0]*95) y_pred = np.array([1]*3 + [0]*2 + [1]*2 + [0]*93) # 准确率:看起来很高,但没意义 accuracy = np.mean(y_true == y_pred) print("准确率:", accuracy) # 精确率、召回率、F1 p = precision_score(y_true, y_pred) r = recall_score(y_true, y_pred) f1 = f1_score(y_true, y_pred) print(f"精确率:{p:.3f},召回率:{r:.3f},F1:{f1:.3f}")这段代码跑出来,准确率可能超过 0.9,但召回率很低。复习题里如果问“为什么准确率不适合不平衡数据”,你就可以直接拿这个例子说明:准确率高是因为负类样本多,模型全预测负类也能拿高分,但正类一个都没抓到。参数上,y_true和y_pred的构造就是模拟不平衡场景,你可以改正类数量观察指标变化。
4.2 把选型题变成一次小规模模型对比
复习题里的选型题,最有效的复习方式是拿一个真实小数据集,把候选模型都跑一遍,看指标和训练时间。比如用 sklearn 自带的乳腺癌数据集,对比逻辑回归、决策树、随机森林、SVM 四个模型。
from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.svm import SVC from sklearn.metrics import f1_score import time # 加载数据 data = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split( data.data, data.target, test_size=0.3, random_state=42 ) # 标准化:SVM 和逻辑回归对尺度敏感 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) models = { "逻辑回归": LogisticRegression(max_iter=5000), "决策树": DecisionTreeClassifier(max_depth=5, random_state=42), "随机森林": RandomForestClassifier(n_estimators=100, random_state=42), "SVM": SVC(kernel='rbf', random_state=42) } for name, model in models.items(): start = time.time() model.fit(X_train_scaled, y_train) train_time = time.time() - start y_pred = model.predict(X_test_scaled) f1 = f1_score(y_test, y_pred) print(f"{name}:F1={f1:.3f},训练时间={train_time:.3f}s")跑完你会看到,在这个小数据集上,逻辑回归和 SVM 的 F1 可能很接近,但训练时间差很多;决策树可解释性强但 F1 可能略低;随机森林稳定但训练时间最长。复习题里如果问“为什么选逻辑回归而不是 SVM”,你就可以用训练时间和可解释性来答。参数max_depth=5是防止决策树过拟合,n_estimators=100是随机森林的默认值,max_iter=5000是防止逻辑回归不收敛。这些参数在复习题里经常作为填空出现,跑一遍就记住了。
4.3 用交叉验证代替单次划分,复习题里的“评估”才完整
很多复习题只给一次训练集/测试集划分,但真实评估要用交叉验证。我一般会建议把复习题里的评估题改造成 K 折交叉验证,看指标均值和方差。
from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_breast_cancer from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline data = load_breast_cancer() # 用管道把标准化和模型串起来,避免数据泄露 pipeline = make_pipeline( StandardScaler(), LogisticRegression(max_iter=5000) ) # 5 折交叉验证,看 F1 的均值和标准差 scores = cross_val_score(pipeline, data.data, data.target, cv=5, scoring='f1') print("F1 均值:", scores.mean()) print("F1 标准差:", scores.std())这段代码的关键是make_pipeline,它把标准化和模型绑在一起,每一折的标准化只在该折的训练集上拟合,避免用测试集信息。复习题里如果问“为什么交叉验证比单次划分可靠”,你就可以用标准差来说明:单次划分的 F1 可能偏高或偏低,交叉验证的均值更接近真实性能。参数cv=5是折数,数据量小可以设 10,数据量大设 5 就够。
5. 复习题之外:把“会做题”变成“会调参”的一个小技巧
复习题能帮你把公式和流程跑通,但真实项目里最耗时间的往往不是推导,而是调参。我自己的习惯是:每做完一道复习题,就顺手问一句“如果这是真实数据,哪个参数最可能让我翻车?”然后针对那个参数做一次小范围扫描。比如逻辑回归的C值、随机森林的max_depth、SVM 的gamma,都是复习题里经常出现但很少展开的参数。
以逻辑回归的C为例,它是正则化强度的倒数:C越小,正则化越强,模型越保守;C越大,正则化越弱,模型越容易过拟合。复习题里如果只让你写“逻辑回归有 L2 正则化”,你其实没真正理解C的作用。我一般会跑一个C的扫描,看 F1 怎么变。
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score from sklearn.datasets import load_breast_cancer from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline import numpy as np data = load_breast_cancer() C_values = [0.001, 0.01, 0.1, 1, 10, 100] for C in C_values: pipeline = make_pipeline( StandardScaler(), LogisticRegression(C=C, max_iter=5000) ) scores = cross_val_score(pipeline, data.data, data.target, cv=5, scoring='f1') print(f"C={C:>6}:F1 均值={scores.mean():.4f},标准差={scores.std():.4f}")跑完你会看到,C太小的时候 F1 偏低,因为模型被正则化压得太狠;C太大的时候 F1 可能略降,因为开始过拟合。中间某个值通常最好。这个扫描不需要跑很多次,六七个值就能看出趋势。复习题里如果问“怎么选正则化系数”,你就可以答“用交叉验证扫描,看 F1 均值和标准差的平衡点”。
另一个容易翻车的参数是决策树的max_depth。复习题里经常让你画决策树,但很少让你调深度。深度太浅欠拟合,太深过拟合。我一般会固定其他参数,只扫max_depth,看训练集和验证集的 F1 差距。
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import f1_score from sklearn.datasets import load_breast_cancer data = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split( data.data, data.target, test_size=0.3, random_state=42 ) for depth in [1, 2, 3, 5, 8, 12, None]: model = DecisionTreeClassifier(max_depth=depth, random_state=42) model.fit(X_train, y_train) train_f1 = f1_score(y_train, model.predict(X_train)) test_f1 = f1_score(y_test, model.predict(X_test)) print(f"max_depth={str(depth):>4}:训练 F1={train_f1:.3f},测试 F1={test_f1:.3f}")如果训练 F1 远高于测试 F1,说明过拟合,要减小深度;如果两者都低,说明欠拟合,要增加深度或换模型。这个技巧在复习题里不会写,但真实项目里每天都在用。我自己的教训是:不要一上来就调学习率,先把模型容量参数(深度、C、gamma)扫一遍,往往能省一半时间。希望帮到你。
本文还有配套的精品资源,点击获取