
数据挖掘期末总结这件事我前前后后做过三次一次是自己考一次帮学弟梳理整门课还有一次是带项目组里刚转方向的同学过一遍体系。每次做完都会发现同一个问题——课上的知识点单看都懂一到综合题、一碰到真数据就串不起来。所以我这篇总结不打算把课本目录抄一遍而是按我自己的理解把数据挖掘这门课真正的主线、必考的算法细节以及一个能贯穿全流程的实战案例GEO 基因表达数据挖掘从下载、处理、质控到差异分析串成一条线。不管你是刚学完要应付期末还是工作里突然被安排做数据挖掘任务看完至少能明白三件事这门课的核心骨架是什么、哪些公式必须亲手推一遍、哪些坑我替你先踩过了。全文按五块展开知识地图、算法细节、完整案例、问题速查、复习节奏。建议从头看因为最后那个案例是把前面所有知识点真正用起来的地方。1. 数据挖掘这门课的骨架到底长什么样1.1 从业务问题到模型落地CRISP-DM 这条主线很多人复习数据挖掘的时候是把它当成一堆互不相关的算法去背决策树、K-means、Apriori、SVM……背完发现脑子里的东西是散装的。我自己第一遍学也是这个状态直到后来做真实项目才反应过来整门课其实是被一条行业标准流程串起来的这条线叫 CRISP-DM跨行业数据挖掘标准流程。它分六个阶段业务理解、数据理解、数据准备、建模、评估、部署。考试里不会直接问你CRISP-DM 第二阶段叫什么但它决定了所有综合题的答题顺序。我踩过的一个坑特别典型期末有道大题给了三张表问请设计一个方案预测用户是否会流失。我当时上来就写用决策树建模划分训练集测试集结果分数很低。后来问老师才知道标准得分点是先做业务理解流失的定义是什么、预测周期多长、再做数据理解缺失率、字段含义、正负样本比例最后才是建模。答题顺序错了说明我脑子里没有流程这条主线只有算法。这一点在真实工作里更要命——业务方问的是能不能提前两周发现要流失的客户你回一句我用 XGBoost对话就进行不下去了。所以复习的第一步我建议先画一张知识地图横轴是流程六阶段纵轴是每个阶段用到的具体技术。数据处理阶段对应缺失值、异常值、归一化、降维建模阶段对应分类、聚类、关联规则、回归评估阶段对应混淆矩阵、交叉验证、ROC。画完你会发现那些零散的算法一下子有了归属考综合题的时候你知道该从哪个抽屉里拿东西了。1.2 期末复习的取舍逻辑哪些必须背哪些理解就行一门数据挖掘课教材动辄四五百页全背既不可能也没必要。我总结的取舍原则是考计算和推导的必须背熟考概念的理解即可考工具的会用就行。按这个原则下面这几类内容属于必须能闭卷手写的信息熵、信息增益、信息增益率的计算公式以及 ID3、C4.5、CART 三者的选择准则差异支持度、置信度、提升度的定义式和计算过程Apriori 的剪枝逻辑混淆矩阵四个格子以及准确率、精确率、召回率、F1 的推导K-means 的迭代步骤和 SSE 目标函数朴素贝叶斯在离散属性下的分类过程含拉普拉斯平滑。而像数据挖掘的定义、OLAP 和 OLTP 的区别这类概念题理解之后用自己的话能说清楚就够了考前突击看一眼关键词即可。我当时把复习时间按 6:3:1 分配——六成时间给计算和推导三成给概念串联一成给工具实操。实测下来这个比例比较稳因为期末卷子上真正拉开分差的往往就是那两三道计算题和一道综合设计题。提示先翻一遍历年题或老师给的重点范围再决定背什么。如果课程明确说不考证明、只考应用那你花两小时推 SVM 的对偶问题就是纯浪费时间。1.3 从题型反推复习重点把功夫花在能拿分的地方不同学校的卷子结构差别很大但核心题型基本跑不出这四类选择填空、计算题、简答概念题、综合设计题。这四类对应的复习策略完全不同我用一张表把它说清楚。题型常见考点复习方法时间占比选择填空距离度量、术语定义、算法归属过一遍思维导图错题集中刷15%计算题熵/增益、支持度置信度、朴素贝叶斯、K-means 一轮迭代手写至少三遍保证零计算失误40%简答概念过拟合、数据预处理、评估指标含义用自己的话复述能举例20%综合设计给定数据集设计完整流程背熟一个完整案例考试直接套框架25%这里我最想强调的是背熟一个完整案例。综合设计题本质上是在考你会不会走完整流程如果你脑子里有一个可以随时调用的案例比如后面要讲的 GEO 表达谱差异分析答题时把它的框架平移过来只换数据背景基本就能拿住大部分得分点。这是我从高年级同学那里学到的招比临时编一个流程靠谱得多。2. 核心算法细节拆解那些必考点到底怎么理解2.1 数据预处理看起来最无聊却最容易丢分数据处理这块很多人的复习方式是跳过觉得不就是填缺失值嘛。但我在卷子上见过太多人栽在这里。真正要掌握的是三件事缺失值怎么判断和处理、异常值怎么识别、数据怎么标准化。缺失值处理先看缺失比例和缺失机制。缺失率低于 5%直接删除样本或字段通常没问题缺失率在 5% 到 30% 之间用均值、中位数或众数填充是比较常见的做法超过 30%填充的偏差就很大了得考虑模型填充比如用随机森林回归预测缺失值或者干脆放弃这个字段。考试里常考的是判断题某属性缺失 40%用均值填充是否合理答案通常是不合理因为这会严重扭曲分布尤其是偏态数据——中位数比均值更抗偏。异常值识别最常考两个方法。一个是3σ 准则适用于近似正态分布的数据超出均值加减三倍标准差就判为异常另一个是箱线图的 IQR 准则下界是 Q1 减 1.5 倍 IQR上界是 Q3 加 1.5 倍 IQR不要求正态分布所以更通用。这里有个坑异常值不等于错误值。有些异常值是真实业务信号比如信用卡欺诈金额直接删掉等于把最重要的样本删了。所以处理异常值之前先想清楚业务含义这一步是为什么层面的东西卷子上写出来往往是加分项。标准化这块要分清两种。Min-Max 归一化把数据线性映射到 [0,1]公式是 (x - min) / (max - min)缺点是受极端值影响大Z-Score 标准化把数据变成均值 0、方差 1公式是 (x - μ) / σ对异常值更鲁棒。KNN、SVM、K-means 这类基于距离的算法必须先标准化否则量纲大的特征会主导距离计算而决策树、随机森林这类基于分裂点的算法则可以不做标准化因为它们对单调变换不敏感。这个为什么是考试简答题的常客。2.2 关联规则Apriori 的剪枝逻辑一定要亲手推一遍关联规则这块考试基本围绕三个度量展开。支持度Support(X) 包含 X 的交易数 / 总交易数置信度Confidence(X→Y) Support(X∪Y) / Support(X)提升度Lift(X→Y) Confidence(X→Y) / Support(Y)。提升度大于 1 表示正相关等于 1 表示独立小于 1 表示负相关。这三个公式看起来简单但每年都有人把置信度的分子分母写反。Apriori 的核心是向下封闭性先验性质如果一个项集是频繁的那么它的所有子集也一定是频繁的反过来如果一个项集是非频繁的那它的所有超集也一定是非频繁的。这条性质的价值在于剪枝——你只需要在上一层频繁项集的基础上生成候选项集不用把所有组合都试一遍。我建议复习时手动画一遍 L1 到 L2 到 L3 的生成和剪枝过程用一个小数据集比如五条交易跑一遍比看十遍书管用。计算过程一般是先扫描一遍数据得到 L1然后 L1 自连接得到 C2扫描计数并剪掉低于最小支持度的得到 L2以此类推。FP-Growth 是 Apriori 的改进版思路差异在于它把数据集压缩成一棵 FP 树只需要扫描两遍数据一遍统计数据频次、一遍构建树避免了 Apriori 反复扫描数据库的开销。考试里常考的是两者的对比Apriori 需要多次扫描、候选集生成开销大FP-Growth 只扫两遍、不需要生成候选集但构建 FP 树的内存开销更大。这种各有取舍的对比题答案一定要两面都写。2.3 分类算法从决策树到集成学习一条清晰的演进线分类是这门课的重头戏章节最多我建议按单模型 → 集成的顺序理解而不是按教材顺序。决策树要记住三个分裂准则和它们的差异。ID3 用信息增益偏向取值多的属性这是它的天然缺陷C4.5 改用信息增益率除了一项分裂信息来惩罚多值属性CART 用基尼指数值越小纯度越高。信息熵的公式 H(D) -Σ p_i·log₂(p_i)信息增益 Gain(D,a) H(D) - Σ (|D_v|/|D|)·H(D_v)。我考试的时候把这三个公式在草稿纸上默写了五遍最后看到一个数据集就能条件反射地开始列表计算。朴素贝叶斯的核心是朴素两个字——假设所有属性条件独立。分类时计算 P(C|X) ∝ P(C)·∏P(x_i|C)取后验概率最大的类。离散属性用频数估计概率连续属性用高斯分布的概率密度。这里的关键细节是拉普拉斯平滑如果某个属性值在训练集中没出现过概率会变成 0连乘之后整个后验都变成 0。加上平滑项后公式变成 (N_ic 1) / (N_c 类别数)这个 1 千万别漏掉卷子上漏了就是白丢分。KNN是懒惰学习的代表没有显式训练过程预测时找最近的 k 个邻居投票。k 值的选择是个权衡k 太小容易受噪声影响k 太大容易把远处的异类推过来一般取奇数避免平票实操中可以从 3 到 10 里用交叉验证挑。SVM的核心是最大间隔。线性可分时找那条让两类样本间隔最大的超平面硬间隔要求所有样本都分对实际数据很少完全可分所以引入松弛变量变成软间隔用参数 C 控制对错分的容忍度——C 越大越不允许犯错容易过拟合C 越小容错越强可能欠拟合。线性不可分时用核函数把数据映射到高维RBF 核最常用它的 γ 参数控制单个样本的影响半径。集成学习是这些单模型的组合。Bagging 的思路是并行训练多个模型再投票代表是随机森林它额外在特征维度上也做随机抽样所以对过拟合有很好的抵抗力。Boosting 是串行训练后一个模型专门拟合前一个模型的残差代表有 AdaBoost 和 GBDT。这两类的差别一定要能说清楚Bagging 降低方差Boosting 降低偏差这是简答题的标准答案结构。2.4 聚类与降维无监督学习的两个基本动作聚类部分K-means 是必考。步骤是随机选 k 个中心点把每个样本分给最近的中心重新计算每类的均值作为新中心重复直到中心不再变化或达到最大迭代次数。目标函数是 SSE误差平方和也就是每个点到所属中心的距离平方之和。考试里常见的坑是初始中心敏感——不同的初始化会得到不同的结果解决办法是 K-means 或者多跑几次取 SSE 最小的。k 的选择可以用肘部法看 SSE 随 k 变化的拐点也可以用轮廓系数取值在 -1 到 1 之间越大越好。DBSCAN 考的是和 K-means 的对比。它基于密度需要两个参数邻域半径 eps 和最小点数 minPts。点分成核心点、边界点和噪声点。它的优势是能发现任意形状的簇、能识别噪声、不需要预先指定簇数劣势是参数敏感密度差异大的数据集效果差。这个对比是简答题高频点。降维这块主要是 PCA。它的思路是找一组新的正交坐标轴让数据投影到第一个轴上的方差最大第二个轴次之以此类推。计算过程是求协方差矩阵的特征值和特征向量按特征值从大到小排序取前 k 个。通常看累计方差解释率一般取到 85% 或者 90% 以上。这里要能解释清楚为什么方差大代表信息多——方差小说明数据在某个方向上基本不变那这个方向对区分样本没贡献丢掉损失不大。2.5 模型评估一张混淆矩阵定乾坤评估指标是每次考试的必考内容。二分类的混淆矩阵四个格子是 TP、FP、FN、TN四个基础指标从它推出来准确率 (TPTN)/总数精确率 TP/(TPFP)召回率 TP/(TPFN)F1 2·P·R/(PR)。这里最容易混的是精确率和召回率的场景选择——宁可错杀不可放过的场景比如垃圾邮件过滤看重召回率宁可放过不可错杀的场景比如推荐系统推高置信度内容看重精确率。当正负样本极不均衡时准确率会失效。比如 1000 个样本里只有 10 个正例全预测成负例也有 99% 的准确率但这个模型毫无用处。这时候要看 ROC 曲线和 AUCAUC 表示随机取一对正负样本、模型把正例排在负例前面的概率取值 0.5 表示随机猜测1 表示完美。一般 0.7 以上算可用0.85 以上算不错。模型的验证方式也要掌握留出法简单但结果受划分影响、k 折交叉验证最常用k 一般取 5 或 10、留一法样本量小时用但计算开销大。过拟合和欠拟合的判断也是高频考点——训练集表现好、测试集表现差是过拟合两边都差是欠拟合前者用正则化、剪枝、增加数据解决后者用增加模型复杂度、加特征解决。3. 把课堂知识落到一个完整案例上GEO 数据挖掘全流程3.1 为什么选这个案例作为期末复习的母题前面所有的知识点如果不落到一个完整案例上考试时还是散的。我选 GEO 基因表达数据挖掘作为贯穿案例理由有三个。第一它是标准的数据挖掘全流程从数据下载、清洗、标准化到差异分析、功能富集每一步都能对应上课堂知识点正好把我的知识地图跑一遍。第二它涉及的数据规模不大通常几十到几百个样本、两万多个基因特征用普通笔记本就能跑完不需要服务器。第三它的特征维度远大于样本量这个特点会逼着你思考降维、多重检验校正这些问题比刷题学得深。GEO 是基因表达综合数据库的缩写里面存储的是公开的高通量基因表达数据。它的数据结构分几层GSE 是一个完整的研究系列GSM 是单个样本GPL 是芯片或测序平台GDS 是经过整理的数据集。理解这四层结构很重要因为下载的时候要选对层级否则拿到的数据没法直接用。3.2 第一步数据下载与表达矩阵整理下载这一步看着简单但有讲究。我一般用 R 语言配合相关工具包把表达矩阵和样本表型信息一起拿下来。# 下载并读取一个 GSE 系列 gset - getGEO(GSE42872, destdir ., AnnotGPL TRUE, getGPL TRUE) # 提取表达矩阵 exprSet - exprs(gset) # 提取样本表型信息 pheno - pData(gset) # 查看数据规模 dim(exprSet)下载完第一件事是看数据长什么样dim()看行列数head()看前几行range()看数值范围。实测下来这一步能筛掉一半的坑。比如你会发现第一列可能是探针 ID 而不是数值或者里面有负值、有大量零这些都是后续处理的信号。样本表型信息要重点看因为分组变量藏在里面。通常需要从pheno里找到描述样本处理条件的那一列比如疾病组 vs 对照组或者处理组 vs 未处理组。这一列决定了后面的差异分析怎么比。我见过有人直接按样本顺序分组结果把两组掺到一起了分析出来全是噪声。分组信息一定要人工核对一遍看标签和样本名是否对应得上。3.3 第二步数据质控与标准化决定结果可信度的关键环节拿到表达矩阵之后质控和标准化是最容易被忽视、但最影响结果的一步。质控主要看三个东西缺失值、异常样本、数据分布。缺失值处理上表达谱数据里如果某个探针在大量样本中都是缺失或接近零直接删掉这个探针比较稳妥如果只是零星缺失可以用行均值填充。异常样本检测我一般用箱线图看各样本的中位数是否对齐再配合聚类分析看有没有样本明显游离在群体之外——如果某个样本离其他所有样本都很远很可能是实验失败样本需要剔除。标准化这块第一步是判断要不要做对数转换。经验法则是如果表达矩阵的最大值超过 100通常需要做 log2 转换如果最大值在 20 以内一般已经是对数尺度了。转换完之后数据分布应该更接近正态这是后续很多统计方法的前提。# 判断是否需要 log2 转换 ex - exprSet qx - as.numeric(quantile(ex, c(0, 0.25, 0.5, 0.75, 0.99, 1.0), na.rm TRUE)) need_log - (qx[5] 100) || (qx[6] - qx[1] 50 qx[2] 0) if (need_log) ex[ex 0] - NA if (need_log) ex - log2(ex 1) # 用分位数法进行样本间标准化 library(limma) ex_norm - normalizeBetweenArrays(ex, method quantile)这里有个真实踩坑记录。我第一次做的时候没做对数转换直接上差异分析结果火山图两边全是极端值几乎没有中间地带。后来才明白原始荧光强度是乘法尺度的组间差异会被放大取对数后才变成加法尺度统计量才有意义。这个为什么如果考试问你为什么要做对数转换就是标准答案。如果数据来自多个批次比如不同实验平台、不同时间点还要考虑批次效应校正常用 ComBat 方法。但要注意如果批次和你要比较的分组完全混杂那批次效应和生物学差异就分不开了这时候做校正是自欺欺人只能重新设计实验。这是伦理和方法论层面的红线实操中一定要先检查批次和分组是否交叉。3.4 第三步差异分析与可视化把结果画出来差异分析通常用 limma 包它的核心思想是线性模型加经验贝叶斯在样本量小的情况下也能有不错的稳定性。标准流程是设计矩阵、拟合模型、构造对比、应用贝叶斯、提取结果。library(limma) # 构建设计矩阵group 是分组的因子 group_list - factor(pheno$group) design - model.matrix(~ 0 group_list) colnames(design) - levels(group_list) # 构造比较矩阵比如疾病组 - 对照组 contrast.matrix - makeContrasts(disease - control, levels design) # 拟合 fit - lmFit(ex_norm, design) fit2 - contrasts.fit(fit, contrast.matrix) fit2 - eBayes(fit2) # 提取差异分析结果 allDiff - topTable(fit2, adjust.method BH, number Inf, sort.by P)这个流程里有几个关键细节。第一多重检验校正两万多个基因同时做检验即使每个检验的显著性水平是 0.05也会有上千个假阳性。所以要用 BH 方法校正 p 值得到 adj.P.Val。这一步直接对应课堂上讲的多重比较问题是知识点和实操完美结合的地方。第二阈值设定常用的筛选标准是 |logFC| 1 且 adj.P.Val 0.05。logFC 是 log2 的倍数变化取 1 意味着表达量翻倍或减半是行业里比较通用的门槛。阈值放宽或收紧会显著改变差异基因数量这个要结合实验目的来定。可视化主要是火山图和热图。火山图横轴是 logFC纵轴是 -log10(adj.P.Val)一眼能看出哪些基因同时满足变化幅度大和显著性高两个条件。热图的坑在于必须按行做 Z-score 标准化否则表达量高的基因会主导颜色表达量低的基因看起来全是同一种颜色图就废了。library(pheatmap) # 火山图 plot(allDiff$logFC, -log10(allDiff$adj.P.Val), pch 20, cex 0.6, xlab log2 Fold Change, ylab -log10(adj.P.Val)) # 热图 sig_genes - rownames(allDiff)[allDiff$adj.P.Val 0.05 abs(allDiff$logFC) 1] pheatmap(ex_norm[sig_genes, ], scale row, show_rownames FALSE, show_colnames FALSE, cluster_cols TRUE, cluster_rows TRUE)3.5 第四步功能富集从基因列表到生物学解释找到差异基因只是开始真正要回答的问题是这些基因参与了什么过程。这一步叫功能富集分析常用 GO基因本体和 KEGG通路两个数据库。GO 分三个子本体生物过程、细胞组分、分子功能。KEGG 是通路层面的。library(clusterProfiler) library(org.Hs.eg.db) # 把基因符号转成 Entrez ID gene_ids - bitr(sig_genes, fromType SYMBOL, toType ENTREZID, OrgDb org.Hs.eg.db) # GO 富集 ego - enrichGO(gene gene_ids$ENTREZID, OrgDb org.Hs.eg.db, ont BP, pAdjustMethod BH, pvalueCutoff 0.05) # KEGG 富集 ekk - enrichKEGG(gene gene_ids$ENTREZID, organism hsa, pvalueCutoff 0.05)富集分析的原理是超几何分布检验问你手上这批基因落在某个通路里的数量是不是比从全基因组里随机抽同样数量时显著更多。这里的为什么是课堂统计部分的直接应用。实操里最常见的坑是ID 类型不匹配——你手上的基因符号是 SYMBOL 类型富集函数要的是 ENTREZID不转换直接跑会报错或者出空结果。还有一个坑是物种参数写错人的 KEGG 编码是 hsa小鼠是 mmu写错了结果是空的。这些细节课本上不会讲但做一次就记住了。到这里一个完整的 GEO 数据挖掘流程就走完了。回过头看它把课堂上的数据预处理、标准化、降维、假设检验、多重比较校正、可视化、结果解释全部串了一遍这就是我为什么建议把它当作复习母题的原因。4. 常见问题与排查技巧实录4.1 概念混淆类问题这些是简答题的送分点概念混淆是丢分最冤枉的一类问题因为不是不会而是记混了。我把复习时最常搞混的几组概念整理成表考前扫一遍就能避开。容易混淆的组关键区别记忆抓手信息增益 vs 信息增益率增益偏向多值属性增益率加了分裂信息惩罚率里有惩罚项精确率 vs 召回率精确率看预测为正的里有多少对召回率看真实为正的里捞回多少精准看预测召回看实际过拟合 vs 欠拟合训练好测试差是过拟合两边都差是欠拟合记两好一差和都不好Bagging vs BoostingBagging 并行降方差Boosting 串行降偏差并行松串行紧支持度 vs 置信度支持度看占比置信度看条件概率支持看多少置信看如果归一化 vs 标准化归一化落到 [0,1]标准化变成均值 0 方差 1归一化有上下界这张表我建议自己动手重写一遍不要照抄。手写的过程本身就是在巩固记忆比读十遍有效。我当年是把这六组概念各写了一个自己的小例子考试时一看到题就能立刻调出例子基本不会错。4.2 计算题高频错误三遍手写是底线计算题的丢分几乎全部来自两个原因公式记错和算错。公式记错是硬伤必须靠默写解决算错则是熟练度问题。我在三遍手写里归纳出的高频错误点有这么几个。决策树的信息增益计算最容易错的是分母搞混。H(D) 里的分母是总样本数H(D_v) 前面的权重是 |D_v|/|D|两个分母不一样很多人会写反。另外 log₂ 计算要小心熵的单位是比特底数必须是 2写成自然对数结果全错。Apriori 支持度计算容易错在没理解包含的含义。项集 {A,B} 的支持度是同时包含 A 和 B 的交易比例不是包含 A 或 B。另外提升度的分母是后件单独的支持度不是前件这个顺序写反是重灾区。K-means 一轮迭代计算容易错在新中心的更新。每轮分割完之后新中心是该簇所有点的坐标均值不是原来的中心也不是最近的样本点。算完一轮后要检查簇分配有没有变化如果没变就可以停止这是迭代终止条件卷子上写出来是加分项。朴素贝叶斯计算容易错在连乘转对数这一步。概率连乘很容易下溢实操中取对数变连加但取了对数之后比较大小时要注意是取对数后最大的那个类不是最小的。另外平滑项忘记加是每年都有人犯的错。4.3 实操类问题数据下载与分析中的真实坑做实操的人都知道报错是最耗时间的地方。我把 GEO 分析里遇到的典型问题和解法整理如下。问题现象可能原因解决思路下载时卡住或超时网络波动或数据文件大换个时间重试或手动下载后本地读取表达矩阵里有负值数据经过某些预处理或平台特性结合平台说明判断必要时加常数偏移后再取对数差异基因数量为零分组标签错、未做标准化、阈值过严逐步检查分组、分布、阈值富集结果为空ID 类型不匹配、物种参数写错用 ID 转换函数统一类型核对物种编码热图颜色一片糊未按行标准化设置 scale 参数为 row火山图两边全是极端点未做对数转换检查最大值必要时 log2 转换这里我最想强调的一条经验是任何一步做完都要打印中间结果看一眼。我见过太多人一路跑到底最后结果不对然后从第一步开始重查浪费几个小时。正确的做法是下载完看一眼维度标准化完看一眼分布分组完看一眼标签对不对。这些检查总共花不了五分钟但能省掉大量排查时间。这个习惯我是在吃了两次亏之后养成的现在做任何数据分析都保持这个节奏。还有一个经验是关于可复现性的。整个流程最好写成一个脚本从下载到出图一气呵成中间不要手动改数据。原因是手动改的东西过两天自己都忘了改了什么一旦结果被质疑就说不清楚。脚本里把随机种子固定下来路径用相对路径这样换台机器也能跑出一样的结果。这个习惯在期末项目里尤其重要老师看你交的代码能不能直接运行往往就是给分的关键。5. 复习节奏与应试技巧我个人的三轮打法5.1 三轮复习法把有限时间花在刀刃上我从大二开始用三轮复习法准备这类偏理科的考试实测效率比从头到尾刷一遍书高不少。第一轮是搭框架用一到两天把整门课的目录过一遍画出知识地图标出哪些章节是重点、哪些是了解。这一轮不追求记住细节目标是知道这门课讲了什么脑子里有一张总图。第二轮是抠细节时间最长大概占复习总时长的一半重点是手推公式、手写计算题每一个算法至少完整算一遍。第三轮是模拟实战考前两三天做两套题或者自己给自己出题按考试时间做训练手感和时间分配。三轮之间的间隔很重要。我一般第一轮和第二轮之间隔一天让框架沉淀一下第二轮和第三轮之间连续进行保持状态。这个方法的关键是不要在某一轮里死磕某个难点过久遇到卡住的先标记往下走第二轮再回来集中解决。我第一年复习就是卡在 SVM 的对偶推导上耗了整个下午结果其他章节没时间了得不偿失。5.2 手写推导和口述复述两个被低估的复习动作手写推导的好处不用多说但我要强调一个字默。看着答案抄一遍和合上书自己写一遍效果差好几倍。我的做法是拿一张白纸把信息熵、信息增益、支持度置信度、混淆矩阵这几个核心公式全部默写一遍写完对照教材查错。第一遍基本会错两三个第二遍就只剩一个第三遍基本全对。这个过程花不了半小时但能保证卷子上计算题的基础不丢分。口述复述是另一个被严重低估的动作。找个人哪怕是假想的听众把什么是过拟合为什么 KNN 要标准化Bagging 和 Boosting 的区别用大白话讲一遍。如果讲着讲着自己卡壳了说明这个地方没真懂。我帮学弟梳理的时候发现他们看书觉得都懂一开口讲就露馅这种假懂状态在简答题上会直接体现出来。所以我建议每复习完一个章节就找几个概念给自己口述一遍讲到顺畅为止。5.3 考前一周的具体安排和考场策略考前一周我一般这么排前两天专攻计算题把决策树、Apriori、朴素贝叶斯、K-means 各手算五遍中间两天过概念和综合设计把 GEO 案例的框架默写一遍确保能脱稿讲清楚每个环节最后两天做模拟卷按考试节奏来同时把前面积累的错题本过一遍。错题本这个东西我从第三轮才开始重视后来发现它比任何资料都值钱因为它记录的是你自己的盲区别人的笔记做不到这一点。考场上有两个小策略。第一拿到卷子先花两分钟通读一遍把会做的题和目标分标出来先做有把握的把计算量大或者不确定的留到最后。我见过有人在一道 5 分的计算题上耗了二十分钟最后两道大题没时间写。第二综合设计题不管会不会都要把流程框架写上去——业务理解、数据理解、数据准备、建模、评估每一步都写一两句即使细节答不全框架分也能拿到。这个技巧是我从多次考试里总结出来的性价比很高。最后再分享一个小经验。数据挖掘这门课有个特点知识点之间的关联性特别强评估指标连着分类算法数据预处理连着所有下游分析。所以复习到后期与其一个章节一个章节地看不如围绕一个案例把所有知识点串一遍就像我前面用 GEO 那个案例做的那样。你会发现当你能把一个完整流程从头讲到尾的时候卷子上的大部分题目都变成了这个流程里的某个局部问题答题自然就顺了。