COMP4204 数据挖掘教程:从数据仓库、预处理、关联规则到分类与聚类

这篇文章根据 COMP 4204 / DSAI 4204 课程资料整理,主题是数据挖掘的完整工作流。它不是只讲模型,而是从数据仓库、数据预处理和特征工程开始,再进入关联规则挖掘、分类、集成学习、聚类、DBSCAN 和 Web Mining,形成一条从数据组织到模式发现的学习路线。

如果说统计机器学习更关心“模型为什么有效”,数据挖掘更关心的是:

面对真实、混乱、不完整的数据,如何把它整理成可以被分析、建模、解释和部署的知识。

原始资料:

1. 数据挖掘到底在挖什么

数据挖掘不是简单地“套模型”。它更像一个从原始数据到知识的流水线:

Raw DataClean DataFeaturesPatterns / ModelsDecision\text{Raw Data} \rightarrow \text{Clean Data} \rightarrow \text{Features} \rightarrow \text{Patterns / Models} \rightarrow \text{Decision}

这里的每一步都有明确作用:

  1. Raw Data:原始数据,可能缺失、重复、噪声大、格式混乱。
  2. Clean Data:经过清洗、对齐、去噪、补缺的数据。
  3. Features:模型真正能使用的变量。
  4. Patterns / Models:关联规则、分类器、聚类结构、回归模型等。
  5. Decision:业务解释、风险判断、推荐策略或预测结果。

所以数据挖掘的核心不是单个算法,而是一个问题:

如何把数据里的结构变成可解释、可复现、可使用的知识?

这也是为什么课程会从 Data Warehousing 和 Data Preprocessing 讲起,而不是一上来就讲 XGBoost。

2. 数据仓库:为什么要先组织数据

真实场景里,数据常常分散在多个系统中:

  • 销售系统记录订单。
  • 用户系统记录画像。
  • 日志系统记录访问行为。
  • 财务系统记录收入和成本。
  • 客服系统记录投诉和反馈。

如果每次分析都直接从这些系统临时抓数据,会遇到很多问题:

  1. 数据格式不统一。
  2. 字段含义不一致。
  3. 不同系统更新时间不同。
  4. 历史数据难以追踪。
  5. 查询会影响业务系统性能。

数据仓库的目标是把分散的数据整理到一个面向分析的环境中。它不是为了替代业务数据库,而是为了支持 OLAP 和决策分析。

一个经典数据仓库可以理解为:

Operational DatabasesETLData WarehouseOLAP / Data Mining\text{Operational Databases} \rightarrow \text{ETL} \rightarrow \text{Data Warehouse} \rightarrow \text{OLAP / Data Mining}

其中 ETL 表示:

  • Extract:从多个来源抽取数据。
  • Transform:清洗、转换、统一口径。
  • Load:加载到仓库。

数据仓库常用 data cube 表示多维分析结构。例如销售数据可以有几个维度:

  • Time:year, quarter, month, day
  • Location:country, city, store
  • Product:category, brand, item
  • Customer:age group, gender, segment

一个指标 measure 可能是:

Sales Amount\text{Sales Amount}

于是一个分析问题可以写成:

在 2025 年 Q4,香港地区,电子产品类别,不同客户群体的销售额是多少?

这就是 OLAP 的典型用法。

3. Star Schema:事实表和维度表

数据仓库建模中常见 star schema。中心是 fact table,周围是 dimension tables。

事实表保存可度量的事件,例如:

order_id time_id product_id store_id customer_id sales
001 T01 P03 S02 C99 1200

维度表保存解释这些 ID 的上下文,例如 product dimension:

product_id category brand price_range
P03 Laptop Lenovo High

为什么要这样拆?因为事实表通常很大,每一行是一次交易或事件;维度表相对较小,提供解释。这样既减少重复信息,也方便按照不同维度聚合。

Data mining 之前做 data warehouse 的价值在于:你不是在混乱表格上建模,而是在一个有语义、有时间、有维度结构的数据环境里建模。

4. 数据质量:No quality data, no quality mining

课程里很重要的一句话是:

No quality data, no quality mining results.

数据质量通常可以从几个维度看:

  1. Accuracy:值是否正确。
  2. Completeness:是否缺失。
  3. Consistency:不同来源是否一致。
  4. Timeliness:是否及时。
  5. Interpretability:字段是否可解释。
  6. Accessibility:是否容易获取。

举例来说,一个交易数据集里 discount 缺失,不一定表示折扣为 0,也可能只是没有记录;用户行为数据里某个类别编码是 1, 2, 3,也不一定说明类别之间有天然大小关系。如果没有理解字段含义,直接把所有列丢进模型,就很容易得到看似准确但解释错误的结果。

因此,数据预处理不是“赛前清洁”,而是模型质量的一部分。

5. 缺失值处理:为什么不能无脑填均值

设一个特征为 XX,存在缺失值。最简单的处理是均值填补:

Xi={Xi,Xi observedXˉ,Xi missingX_i = \begin{cases} X_i, & X_i \text{ observed}\\ \bar X, & X_i \text{ missing} \end{cases}

均值填补的优点是简单,但它有几个问题:

  1. 会压缩方差。
  2. 会改变变量分布。
  3. 会弱化变量和目标之间的关系。
  4. 如果缺失本身有含义,会丢掉信息。

例如房价数据中的 PoolQC 缺失,往往表示没有泳池,而不是质量未知。此时更合理的处理是:

1
df["PoolQC"] = df["PoolQC"].fillna("None")

而不是用众数填补。

对数值变量,可以按业务语义处理:

  • 面积类变量缺失:可能表示不存在,填 0。
  • 连续测量变量缺失:可以用 median。
  • 分组相关变量缺失:可以按 neighborhood 或 category 分组填补。

例如:

1
2
3
4
df["LotFrontage"] = (
df.groupby("Neighborhood")["LotFrontage"]
.transform(lambda x: x.fillna(x.median()))
)

这里的逻辑是:临街长度更可能和所在社区相关,而不是全局均值相关。

6. 噪声与异常值:什么时候删,什么时候保留

异常值不一定是错误。它可能是:

  1. 数据录入错误。
  2. 罕见但真实的样本。
  3. 对模型非常重要的极端情况。

例如房价预测中,如果 GrLivArea 很大但 SalePrice 很低,可能是异常交易;也可能是特殊房产类型。处理异常值前要先问:

这个异常点是 measurement error,还是 population 中真实存在的 tail case?

常用检查方式包括:

1
2
3
4
5
import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(data=df, x="GrLivArea", y="SalePrice")
plt.show()

如果少数样本明显违背整体趋势,且业务上难以解释,可以考虑删除。但要记录原因,避免为了提高分数而随意“修剪数据”。

7. 特征工程:模型性能往往来自这里

Feature engineering 是把原始字段转化为更有预测力的输入。

它的目标不是“制造更多列”,而是:

让特征更接近目标变量背后的机制。

以房价预测为例,原始数据可能有:

  • TotalBsmtSF
  • 1stFlrSF
  • 2ndFlrSF
  • GarageArea
  • YearBuilt
  • YearRemodAdd

可以构造:

1
2
3
4
df["TotalSF"] = df["TotalBsmtSF"] + df["1stFlrSF"] + df["2ndFlrSF"]
df["HouseAge"] = df["YrSold"] - df["YearBuilt"]
df["RemodAge"] = df["YrSold"] - df["YearRemodAdd"]
df["HasGarage"] = (df["GarageArea"] > 0).astype(int)

这些特征更贴近房价逻辑:

  • 总面积比单独楼层面积更直接影响价格。
  • 房龄影响折旧。
  • 翻修年龄反映维护状况。
  • 是否有车库是一种结构性差异。

特征工程可以分成几类:

类型 作用 例子
Encoding 把类别变量变成模型可用格式 one-hot, ordinal encoding
Imputation 处理缺失值 median, mode, None
Transformation 改变分布 log, Box-Cox
Aggregation 合成更强特征 TotalSF
Interaction 建模变量交互 quality × area

8. 为什么要做 log transform

很多价格、收入、面积类变量右偏严重。以房价 YY 为例,如果分布长尾明显,直接建模可能让模型过度关注高价房。

常用变换是:

Y=log(1+Y)Y'=\log(1+Y)

Python 中:

1
2
3
import numpy as np

y = np.log1p(df["SalePrice"])

为什么这样有用?

如果误差是乘法型:

Y=Y^ϵY = \hat Y \cdot \epsilon

取 log 后:

logY=logY^+logϵ\log Y = \log \hat Y + \log \epsilon

乘法误差变成加法误差,更符合很多回归模型的假设。

在 Kaggle 房价预测中,评价指标 RMSLE 本身也鼓励对价格取 log,因为它关心相对误差而不是绝对误差:

RMSLE=1ni=1n(log(y^i+1)log(yi+1))2\text{RMSLE} = \sqrt{ \frac{1}{n} \sum_{i=1}^n \left( \log(\hat y_i+1)-\log(y_i+1) \right)^2 }

9. 关联规则挖掘:从共现中发现模式

Association Rule Mining 关注的是这样的规则:

XYX \Rightarrow Y

例如:

buys(diapers) => buys(beer)

这里 XXYY 都是 itemsets。

两个核心指标是 support 和 confidence。

Support 衡量规则涉及的 itemset 出现得有多频繁:

support(XY)=P(XY)\operatorname{support}(X\Rightarrow Y) = P(X\cup Y)

Confidence 衡量在 XX 出现时,YY 出现的概率:

confidence(XY)=P(YX)=P(XY)P(X)\operatorname{confidence}(X\Rightarrow Y) = P(Y|X) = \frac{P(X\cup Y)}{P(X)}

举例:如果 1000 笔交易中有 100 笔包含面包和牛奶,有 200 笔包含面包,则:

support(breadmilk)=1001000=0.1\operatorname{support}(\text{bread}\Rightarrow \text{milk})=\frac{100}{1000}=0.1

confidence(breadmilk)=100200=0.5\operatorname{confidence}(\text{bread}\Rightarrow \text{milk})=\frac{100}{200}=0.5

但 confidence 有缺陷。如果 milk 本来在所有交易中就很常见,那么高 confidence 不一定说明 bread 和 milk 有强关系。

因此常用 lift:

lift(XY)=P(YX)P(Y)=P(XY)P(X)P(Y)\operatorname{lift}(X\Rightarrow Y) = \frac{P(Y|X)}{P(Y)} = \frac{P(X\cup Y)}{P(X)P(Y)}

如果 lift > 1,说明 XX 出现会提高 YY 出现的概率;如果 lift = 1,说明二者近似独立。

10. Apriori:为什么可以剪枝

Apriori 算法依赖一个关键性质:

如果一个 itemset 是 frequent,那么它的所有子集也一定 frequent。

反过来说:

如果一个 itemset 不 frequent,那么包含它的任何更大 itemset 都不可能 frequent。

证明很简单。设

ABA\subseteq B

只要交易包含 BB,就一定包含 AA。所以

support(B)support(A)\operatorname{support}(B)\le \operatorname{support}(A)

如果 AA 的 support 已经低于阈值,那么 BB 的 support 只会更低,不可能成为 frequent itemset。

Apriori 的流程是:

  1. 找 frequent 1-itemsets。
  2. 用它们生成 candidate 2-itemsets。
  3. 计算 support,保留 frequent 2-itemsets。
  4. 继续生成更大的 candidates。
  5. 用非频繁子集剪枝。

这本质上是在搜索 itemset lattice,但用 support 的单调性减少搜索空间。

11. 序列模式挖掘:从共现到顺序

普通 ARM 只关心“是否一起出现”,Sequential Pattern Mining 关心“按什么顺序出现”。

例如:

{Avengers},{Infinity War},{Endgame}\langle \{\text{Avengers}\}, \{\text{Infinity War}\}, \{\text{Endgame}\}\rangle

这表示用户先看 Avengers,再看 Infinity War,再看 Endgame。

序列模式更适合:

  • 用户行为路径
  • 股票状态变化
  • 网页点击流
  • 商品复购路径
  • 医疗事件序列

它比普通关联规则多了时间结构:

X1X2XkX_1 \rightarrow X_2 \rightarrow \cdots \rightarrow X_k

这也是推荐系统和用户旅程分析中很重要的思想。

12. 分类:从训练集到决策边界

分类任务的目标是学习一个函数:

f:XYf:X\rightarrow Y

其中 YY 是离散类别。例如在三分类文本任务中:

Y{negative,neutral,positive}Y\in\{\text{negative},\text{neutral},\text{positive}\}

一般流程是:

  1. 用训练集构建模型。
  2. 在验证集或测试集上评估。
  3. 用模型预测新样本。

一个分类器不仅要训练准确,还要能泛化。训练准确率很高但测试准确率低,说明模型过拟合。

常见指标包括:

指标 含义
Accuracy 整体预测正确比例
Precision 预测为正的样本中有多少是真的正
Recall 真正样本中有多少被找出来
F1 Precision 和 Recall 的调和平均

对于医疗风险预测,Recall 往往比 Accuracy 更重要,因为漏诊的代价可能更高。

13. 决策树:用信息增益选择切分

决策树通过一系列 if-else 规则进行分类。它的关键问题是:

每一步应该选择哪个特征来切分?

ID3 使用 information gain。先定义 entropy:

H(S)=cpclog2pcH(S) = - \sum_{c} p_c\log_2 p_c

如果一个节点里样本类别很混乱,entropy 高;如果几乎都是同一类,entropy 低。

用特征 AA 切分后,条件熵是:

H(SA)=vValues(A)SvSH(Sv)H(S|A) = \sum_{v\in Values(A)} \frac{|S_v|}{|S|} H(S_v)

信息增益:

Gain(S,A)=H(S)H(SA)Gain(S,A)=H(S)-H(S|A)

选择信息增益最大的特征,就是选择让类别混乱程度下降最多的特征。

直观地说,决策树每一步都在问:

哪个问题最能把当前样本分得更纯?

14. Bayes 分类器:概率视角下的最优判断

Bayes 定理:

P(CX)=P(XC)P(C)P(X)P(C|X) = \frac{P(X|C)P(C)}{P(X)}

分类时,我们比较每个类别的 posterior probability:

C^=argmaxCP(CX)\hat C = \arg\max_C P(C|X)

由于 P(X)P(X) 对所有类别相同,可以忽略:

C^=argmaxCP(XC)P(C)\hat C = \arg\max_C P(X|C)P(C)

Naive Bayes 进一步假设特征条件独立:

P(XC)=j=1pP(xjC)P(X|C) = \prod_{j=1}^{p} P(x_j|C)

这个假设通常不完全真实,但它让模型非常快,而且在文本分类中效果很好。

为什么文本分类适合 Naive Bayes?因为 bag-of-words 表示中,模型只需要估计词在不同类别下出现的概率:

P(wordclass)P(\text{word}|\text{class})

这和 Web Mining、Information Retrieval 中的文本表示有天然联系。

15. Ensemble:为什么多个弱模型能变强

集成学习的思想是:

多个模型的错误如果不完全相同,组合起来可能比单个模型更稳定。

Bagging 的代表是 Random Forest。它通过 bootstrap sample 训练多棵树:

D1,D2,,DBD_1,D_2,\ldots,D_B

每棵树给出预测 hb(x)h_b(x),最终分类用投票:

y^=mode{h1(x),,hB(x)}\hat y=\operatorname{mode}\{h_1(x),\ldots,h_B(x)\}

回归用平均:

y^=1Bb=1Bhb(x)\hat y=\frac{1}{B}\sum_{b=1}^B h_b(x)

Bagging 主要降低 variance。

Boosting 的思路不同,它让后面的模型更关注前面错的样本。AdaBoost 可以写成加权模型:

F(x)=t=1Tαtht(x)F(x)=\sum_{t=1}^{T}\alpha_t h_t(x)

其中表现好的弱分类器获得更大的权重 αt\alpha_t

XGBoost、LightGBM、CatBoost 都属于 gradient boosting 家族,它们在表格数据中非常强。你房价预测项目里 CatBoost 表现最好,也符合这个经验:类别特征多、表格结构强、样本量中等时,boosting 方法常常是强 baseline。

16. 聚类:没有标签时如何发现结构

Clustering 是 unsupervised learning。它没有标签 yy,只有特征 XX。目标是把相似样本放到同一组。

最基本的 k-means 目标函数是:

minC1,,Ckj=1kxiCjxiμj2\min_{C_1,\ldots,C_k} \sum_{j=1}^{k} \sum_{x_i\in C_j} \|x_i-\mu_j\|^2

其中 μj\mu_j 是第 jj 个 cluster 的中心。

k-means 迭代两步:

  1. Assignment:把每个点分到最近的中心。
  2. Update:用当前 cluster 的均值更新中心。

数学上:

ci=argminjxiμj2c_i=\arg\min_j \|x_i-\mu_j\|^2

μj=1CjxiCjxi\mu_j=\frac{1}{|C_j|}\sum_{x_i\in C_j}x_i

k-means 适合球形、大小相近的 cluster。但如果 cluster 是弯曲形状,或者有很多噪声点,k-means 就不够好。

17. DBSCAN:用密度定义 cluster

DBSCAN 不要求提前指定 cluster 数量,而是用密度定义簇。

两个核心参数:

  • ε\varepsilon:邻域半径。
  • MinPts:成为 core point 至少需要的邻居数。

对一个点 pp,它的 ε\varepsilon-neighborhood 是:

Nε(p)={q:dist(p,q)ε}N_\varepsilon(p)=\{q:\operatorname{dist}(p,q)\le \varepsilon\}

如果

Nε(p)MinPts|N_\varepsilon(p)|\ge MinPts

pp 是 core point。

DBSCAN 的思想是:

  1. 从 core point 出发。
  2. 把密度可达的点扩展进同一个 cluster。
  3. 无法归入任何 cluster 的点视为 noise。

DBSCAN 的优势是可以发现任意形状的簇,也能识别噪声。缺点是对参数敏感,并且不同密度的 cluster 难处理。

18. Web Mining:文本、链接和用户行为

Web Mining 可以粗略分成三类:

  1. Web Content Mining:挖掘网页内容,例如文本分类、主题提取。
  2. Web Structure Mining:挖掘链接结构,例如 PageRank。
  3. Web Usage Mining:挖掘用户访问行为,例如点击流和 session pattern。

Information Retrieval 中最基本的两个指标是 precision 和 recall:

Precision=RelevantRetrievedRetrievedPrecision= \frac{|\text{Relevant}\cap \text{Retrieved}|}{|\text{Retrieved}|}

Recall=RelevantRetrievedRelevantRecall= \frac{|\text{Relevant}\cap \text{Retrieved}|}{|\text{Relevant}|}

搜索系统通常要在二者之间权衡。返回结果太少,precision 可能高但 recall 低;返回结果太多,recall 高但 precision 可能下降。

在现代 NLP / RAG 中,这个思想仍然非常重要。RAG 的检索模块本质上也在优化:

能不能从海量文档中召回真正相关的内容,并把最有用的内容排在前面?

所以 COMP4204 的 Web Mining 和后面做 RAG、搜索推荐有直接关系。

19. 和算法实习的关系

COMP4204 对算法实习很有价值,因为它覆盖了很多真实项目的基础能力:

  • 表格数据清洗和特征工程。
  • 分类、回归、聚类、关联规则。
  • 指标意识和模型比较。
  • 从原始数据到可用特征的 pipeline。
  • Web Mining 和 IR 思想。
  • 从数据现象到业务解释。

如果目标是 NLP / RAG / 推荐 / 数据挖掘方向,这门课可以作为“数据侧基本功”。尤其是:

  • ARM 对推荐系统中的共现分析有帮助。
  • Web Mining 对搜索和 RAG 检索评价有帮助。
  • Feature Engineering 对传统 ML 和 tabular modeling 有帮助。
  • Clustering 对用户分群、embedding 分析、异常检测有帮助。

20. 最小复习清单

复习这门课时,可以检查自己能不能回答这些问题:

  1. 数据仓库和普通数据库有什么区别?
  2. Star schema 中 fact table 和 dimension table 分别做什么?
  3. 为什么缺失值不能统一用均值填补?
  4. log transform 为什么常用于价格预测?
  5. Support、confidence、lift 分别衡量什么?
  6. Apriori 为什么可以剪枝?
  7. Sequential pattern mining 和普通 ARM 有什么区别?
  8. 决策树的信息增益从哪里来?
  9. Naive Bayes 为什么适合文本分类?
  10. Bagging 和 boosting 的区别是什么?
  11. k-means 的目标函数是什么?
  12. DBSCAN 如何定义 core point 和 noise?
  13. Precision 和 recall 在搜索/RAG 中为什么重要?
  14. 一个表格预测项目的完整 pipeline 应该包含哪些部分?

如果这些问题能讲清楚,你就不是只会调包,而是理解了数据挖掘项目从数据到模型再到解释的完整链路。

COMP4204 数据挖掘教程:从数据仓库、预处理、关联规则到分类与聚类

https://richardf123.github.io/2026/06/29/comp4204-data-mining-practical-guide/

作者

RichardF

发布于

2026-06-29

更新于

2026-06-29

许可协议