COMP4204 数据挖掘教程:从数据仓库、预处理、关联规则到分类与聚类
这篇文章根据 COMP 4204 / DSAI 4204 课程资料整理,主题是数据挖掘的完整工作流。它不是只讲模型,而是从数据仓库、数据预处理和特征工程开始,再进入关联规则挖掘、分类、集成学习、聚类、DBSCAN 和 Web Mining,形成一条从数据组织到模式发现的学习路线。
如果说统计机器学习更关心“模型为什么有效”,数据挖掘更关心的是:
面对真实、混乱、不完整的数据,如何把它整理成可以被分析、建模、解释和部署的知识。
原始资料:
- Data Warehousing
- Data Preprocessing
- Feature Engineering
- Association Rule Mining I
- Association Rule Mining II: Sequential Analysis
- Classification I
- Classification II
- Clustering I
- Clustering II: DBSCAN
- Web Mining
- COMP4204 Midterm Cheatsheet
1. 数据挖掘到底在挖什么
数据挖掘不是简单地“套模型”。它更像一个从原始数据到知识的流水线:
这里的每一步都有明确作用:
- Raw Data:原始数据,可能缺失、重复、噪声大、格式混乱。
- Clean Data:经过清洗、对齐、去噪、补缺的数据。
- Features:模型真正能使用的变量。
- Patterns / Models:关联规则、分类器、聚类结构、回归模型等。
- Decision:业务解释、风险判断、推荐策略或预测结果。
所以数据挖掘的核心不是单个算法,而是一个问题:
如何把数据里的结构变成可解释、可复现、可使用的知识?
这也是为什么课程会从 Data Warehousing 和 Data Preprocessing 讲起,而不是一上来就讲 XGBoost。
2. 数据仓库:为什么要先组织数据
真实场景里,数据常常分散在多个系统中:
- 销售系统记录订单。
- 用户系统记录画像。
- 日志系统记录访问行为。
- 财务系统记录收入和成本。
- 客服系统记录投诉和反馈。
如果每次分析都直接从这些系统临时抓数据,会遇到很多问题:
- 数据格式不统一。
- 字段含义不一致。
- 不同系统更新时间不同。
- 历史数据难以追踪。
- 查询会影响业务系统性能。
数据仓库的目标是把分散的数据整理到一个面向分析的环境中。它不是为了替代业务数据库,而是为了支持 OLAP 和决策分析。
一个经典数据仓库可以理解为:
其中 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 可能是:
于是一个分析问题可以写成:
在 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.
数据质量通常可以从几个维度看:
- Accuracy:值是否正确。
- Completeness:是否缺失。
- Consistency:不同来源是否一致。
- Timeliness:是否及时。
- Interpretability:字段是否可解释。
- Accessibility:是否容易获取。
举例来说,一个交易数据集里 discount 缺失,不一定表示折扣为 0,也可能只是没有记录;用户行为数据里某个类别编码是 1, 2, 3,也不一定说明类别之间有天然大小关系。如果没有理解字段含义,直接把所有列丢进模型,就很容易得到看似准确但解释错误的结果。
因此,数据预处理不是“赛前清洁”,而是模型质量的一部分。
5. 缺失值处理:为什么不能无脑填均值
设一个特征为 ,存在缺失值。最简单的处理是均值填补:
均值填补的优点是简单,但它有几个问题:
- 会压缩方差。
- 会改变变量分布。
- 会弱化变量和目标之间的关系。
- 如果缺失本身有含义,会丢掉信息。
例如房价数据中的 PoolQC 缺失,往往表示没有泳池,而不是质量未知。此时更合理的处理是:
1 | df["PoolQC"] = df["PoolQC"].fillna("None") |
而不是用众数填补。
对数值变量,可以按业务语义处理:
- 面积类变量缺失:可能表示不存在,填 0。
- 连续测量变量缺失:可以用 median。
- 分组相关变量缺失:可以按 neighborhood 或 category 分组填补。
例如:
1 | df["LotFrontage"] = ( |
这里的逻辑是:临街长度更可能和所在社区相关,而不是全局均值相关。
6. 噪声与异常值:什么时候删,什么时候保留
异常值不一定是错误。它可能是:
- 数据录入错误。
- 罕见但真实的样本。
- 对模型非常重要的极端情况。
例如房价预测中,如果 GrLivArea 很大但 SalePrice 很低,可能是异常交易;也可能是特殊房产类型。处理异常值前要先问:
这个异常点是 measurement error,还是 population 中真实存在的 tail case?
常用检查方式包括:
1 | import seaborn as sns |
如果少数样本明显违背整体趋势,且业务上难以解释,可以考虑删除。但要记录原因,避免为了提高分数而随意“修剪数据”。
7. 特征工程:模型性能往往来自这里
Feature engineering 是把原始字段转化为更有预测力的输入。
它的目标不是“制造更多列”,而是:
让特征更接近目标变量背后的机制。
以房价预测为例,原始数据可能有:
TotalBsmtSF1stFlrSF2ndFlrSFGarageAreaYearBuiltYearRemodAdd
可以构造:
1 | df["TotalSF"] = df["TotalBsmtSF"] + df["1stFlrSF"] + df["2ndFlrSF"] |
这些特征更贴近房价逻辑:
- 总面积比单独楼层面积更直接影响价格。
- 房龄影响折旧。
- 翻修年龄反映维护状况。
- 是否有车库是一种结构性差异。
特征工程可以分成几类:
| 类型 | 作用 | 例子 |
|---|---|---|
| Encoding | 把类别变量变成模型可用格式 | one-hot, ordinal encoding |
| Imputation | 处理缺失值 | median, mode, None |
| Transformation | 改变分布 | log, Box-Cox |
| Aggregation | 合成更强特征 | TotalSF |
| Interaction | 建模变量交互 | quality × area |
8. 为什么要做 log transform
很多价格、收入、面积类变量右偏严重。以房价 为例,如果分布长尾明显,直接建模可能让模型过度关注高价房。
常用变换是:
Python 中:
1 | import numpy as np |
为什么这样有用?
如果误差是乘法型:
取 log 后:
乘法误差变成加法误差,更符合很多回归模型的假设。
在 Kaggle 房价预测中,评价指标 RMSLE 本身也鼓励对价格取 log,因为它关心相对误差而不是绝对误差:
9. 关联规则挖掘:从共现中发现模式
Association Rule Mining 关注的是这样的规则:
例如:
buys(diapers) => buys(beer)
这里 和 都是 itemsets。
两个核心指标是 support 和 confidence。
Support 衡量规则涉及的 itemset 出现得有多频繁:
Confidence 衡量在 出现时, 出现的概率:
举例:如果 1000 笔交易中有 100 笔包含面包和牛奶,有 200 笔包含面包,则:
但 confidence 有缺陷。如果 milk 本来在所有交易中就很常见,那么高 confidence 不一定说明 bread 和 milk 有强关系。
因此常用 lift:
如果 lift > 1,说明 出现会提高 出现的概率;如果 lift = 1,说明二者近似独立。
10. Apriori:为什么可以剪枝
Apriori 算法依赖一个关键性质:
如果一个 itemset 是 frequent,那么它的所有子集也一定 frequent。
反过来说:
如果一个 itemset 不 frequent,那么包含它的任何更大 itemset 都不可能 frequent。
证明很简单。设
只要交易包含 ,就一定包含 。所以
如果 的 support 已经低于阈值,那么 的 support 只会更低,不可能成为 frequent itemset。
Apriori 的流程是:
- 找 frequent 1-itemsets。
- 用它们生成 candidate 2-itemsets。
- 计算 support,保留 frequent 2-itemsets。
- 继续生成更大的 candidates。
- 用非频繁子集剪枝。
这本质上是在搜索 itemset lattice,但用 support 的单调性减少搜索空间。
11. 序列模式挖掘:从共现到顺序
普通 ARM 只关心“是否一起出现”,Sequential Pattern Mining 关心“按什么顺序出现”。
例如:
这表示用户先看 Avengers,再看 Infinity War,再看 Endgame。
序列模式更适合:
- 用户行为路径
- 股票状态变化
- 网页点击流
- 商品复购路径
- 医疗事件序列
它比普通关联规则多了时间结构:
这也是推荐系统和用户旅程分析中很重要的思想。
12. 分类:从训练集到决策边界
分类任务的目标是学习一个函数:
其中 是离散类别。例如在三分类文本任务中:
一般流程是:
- 用训练集构建模型。
- 在验证集或测试集上评估。
- 用模型预测新样本。
一个分类器不仅要训练准确,还要能泛化。训练准确率很高但测试准确率低,说明模型过拟合。
常见指标包括:
| 指标 | 含义 |
|---|---|
| Accuracy | 整体预测正确比例 |
| Precision | 预测为正的样本中有多少是真的正 |
| Recall | 真正样本中有多少被找出来 |
| F1 | Precision 和 Recall 的调和平均 |
对于医疗风险预测,Recall 往往比 Accuracy 更重要,因为漏诊的代价可能更高。
13. 决策树:用信息增益选择切分
决策树通过一系列 if-else 规则进行分类。它的关键问题是:
每一步应该选择哪个特征来切分?
ID3 使用 information gain。先定义 entropy:
如果一个节点里样本类别很混乱,entropy 高;如果几乎都是同一类,entropy 低。
用特征 切分后,条件熵是:
信息增益:
选择信息增益最大的特征,就是选择让类别混乱程度下降最多的特征。
直观地说,决策树每一步都在问:
哪个问题最能把当前样本分得更纯?
14. Bayes 分类器:概率视角下的最优判断
Bayes 定理:
分类时,我们比较每个类别的 posterior probability:
由于 对所有类别相同,可以忽略:
Naive Bayes 进一步假设特征条件独立:
这个假设通常不完全真实,但它让模型非常快,而且在文本分类中效果很好。
为什么文本分类适合 Naive Bayes?因为 bag-of-words 表示中,模型只需要估计词在不同类别下出现的概率:
这和 Web Mining、Information Retrieval 中的文本表示有天然联系。
15. Ensemble:为什么多个弱模型能变强
集成学习的思想是:
多个模型的错误如果不完全相同,组合起来可能比单个模型更稳定。
Bagging 的代表是 Random Forest。它通过 bootstrap sample 训练多棵树:
每棵树给出预测 ,最终分类用投票:
回归用平均:
Bagging 主要降低 variance。
Boosting 的思路不同,它让后面的模型更关注前面错的样本。AdaBoost 可以写成加权模型:
其中表现好的弱分类器获得更大的权重 。
XGBoost、LightGBM、CatBoost 都属于 gradient boosting 家族,它们在表格数据中非常强。你房价预测项目里 CatBoost 表现最好,也符合这个经验:类别特征多、表格结构强、样本量中等时,boosting 方法常常是强 baseline。
16. 聚类:没有标签时如何发现结构
Clustering 是 unsupervised learning。它没有标签 ,只有特征 。目标是把相似样本放到同一组。
最基本的 k-means 目标函数是:
其中 是第 个 cluster 的中心。
k-means 迭代两步:
- Assignment:把每个点分到最近的中心。
- Update:用当前 cluster 的均值更新中心。
数学上:
k-means 适合球形、大小相近的 cluster。但如果 cluster 是弯曲形状,或者有很多噪声点,k-means 就不够好。
17. DBSCAN:用密度定义 cluster
DBSCAN 不要求提前指定 cluster 数量,而是用密度定义簇。
两个核心参数:
- :邻域半径。
- MinPts:成为 core point 至少需要的邻居数。
对一个点 ,它的 -neighborhood 是:
如果
则 是 core point。
DBSCAN 的思想是:
- 从 core point 出发。
- 把密度可达的点扩展进同一个 cluster。
- 无法归入任何 cluster 的点视为 noise。
DBSCAN 的优势是可以发现任意形状的簇,也能识别噪声。缺点是对参数敏感,并且不同密度的 cluster 难处理。
18. Web Mining:文本、链接和用户行为
Web Mining 可以粗略分成三类:
- Web Content Mining:挖掘网页内容,例如文本分类、主题提取。
- Web Structure Mining:挖掘链接结构,例如 PageRank。
- Web Usage Mining:挖掘用户访问行为,例如点击流和 session pattern。
Information Retrieval 中最基本的两个指标是 precision 和 recall:
搜索系统通常要在二者之间权衡。返回结果太少,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. 最小复习清单
复习这门课时,可以检查自己能不能回答这些问题:
- 数据仓库和普通数据库有什么区别?
- Star schema 中 fact table 和 dimension table 分别做什么?
- 为什么缺失值不能统一用均值填补?
- log transform 为什么常用于价格预测?
- Support、confidence、lift 分别衡量什么?
- Apriori 为什么可以剪枝?
- Sequential pattern mining 和普通 ARM 有什么区别?
- 决策树的信息增益从哪里来?
- Naive Bayes 为什么适合文本分类?
- Bagging 和 boosting 的区别是什么?
- k-means 的目标函数是什么?
- DBSCAN 如何定义 core point 和 noise?
- Precision 和 recall 在搜索/RAG 中为什么重要?
- 一个表格预测项目的完整 pipeline 应该包含哪些部分?
如果这些问题能讲清楚,你就不是只会调包,而是理解了数据挖掘项目从数据到模型再到解释的完整链路。
COMP4204 数据挖掘教程:从数据仓库、预处理、关联规则到分类与聚类
https://richardf123.github.io/2026/06/29/comp4204-data-mining-practical-guide/