ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数据挖掘基础复习:数据预处理与定性归纳核心要点

数据挖掘基础复习:数据预处理与定性归纳核心要点

期末复习周又到了,我又一次翻开《数据挖掘导论》的前三块内容:课程介绍、数据预处理方法、定性归纳。说实话,这门课第一轮复习最容易让人犯的错误就是“只看后面的算法”,觉得介绍部分是废话、预处理是体力活、定性归纳背背概念就行。但实际做项目或者应付考试之后你就会发现,这三块恰恰是整门课的骨架,不把它们串起来理解,后面学关联规则、聚类、神经网络都会觉得像浮在空中。

这篇文章就是我自己的复习笔记,只围绕“介绍+数据预处理方法+定性归纳”这条主线展开。我会把每个知识点的来龙去脉、为什么这么设计、考试怎么考、做完项目踩过哪些坑都写清楚。适合期末突击、面试前速过、或者项目里需要快速建立数据挖掘基础的朋友。

1. 为什么要从这三块开始复习

1.1 这三块内容的内在关系

很多人把第一章“介绍”当成纯文科内容,背几句定义就过了。实际上,理解数据挖掘的整体框架,是后面所有章节的坐标系。你能在脑中画出一张图:输入什么数据、经过哪些处理、用什么任务、输出什么模式,后面学到的大部分方法都能在这张图上找到位置。没有这张图,学一个算法就是一个孤岛。

数据预处理方法则是连接原始数据和模型之间的桥梁。真实场景里,原始数据几乎没有能直接进模型的,缺值、噪声、单位不一致、维度太高,这些都是常态。课上也许只花两周讲预处理,但真实项目里至少一半时间都在做这件事。考试里它经常以“给出某个场景,选择最合理的处理策略”的形式出现,这种题没有标准答案,拼的就是你理解每种方法背后的适用边界。

定性归纳是第一类真正意义上的“挖掘”思路。它把数据总结成一组“如果满足什么条件,就属于哪个类别”的规则,典型的代表就是决策树和规则归纳。我的复习经验是:先理解规则的形式,再理解决策树是怎么生成规则的,最后理解如何用覆盖算法直接学规则。这条线顺下来,分类问题的主干就有了。

1.2 复习重点与优先级

复习之初,我先划清主次,防止在细节上浪费时间。下面这张表是我自己梳理的复习优先级,供你参考:

板块核心考点常见题型我的复习优先级
数据挖掘介绍定义、流程、任务类型简答、概念辨析中,但必须先过一遍
数据预处理缺失值处理、噪声处理、归一化与标准化、维规约场景选择、计算、简答高,工程价值最高
定性归纳熵、信息增益、增益率、基尼指数、剪枝、规则归纳手算推导、构造决策树、简答最高,计算量相对大且易出错

我的建议是:先花半天时间把介绍部分读成“一个完整故事”,再花一天重点刷预处理的场景题和定性归纳的计算题。不要一上来就背ID3、C4.5、CART的公式区别,先把每个公式在解决什么问题弄明白。

1.3 一次复习的节奏建议

我自己复习这门课,一般分成三步。第一步,把讲义里所有概念用一句话写在白纸上,能默写出来就代表记住;第二步,手工推导一遍决策树的信息增益计算,从熵的定义开始,每个数字都亲自算;第三步,找一个公开的表格数据集,写代码跑一遍预处理管线,再跑一次决策树,看参数变化对树结构的影响。这三步做完,基本可以应付大部分考试和面试问题。

2. 数据挖掘介绍:先把整张地图刻在脑子里

2.1 一句话定义,但别小看它

数据挖掘课程里最经典的定义是:从大量数据中发现潜在的、事先未知的、有价值的信息模式。我在复习时喜欢拆成三个关键词来记:大量、未知、有价值。

“大量”强调的是数据规模足够大,小样本上的统计规律往往不可靠,这也是数据挖掘和传统统计分析的重要差异之一。“未知”表示这些模式是事先不知道的,不是简单的查询或报表,比如“上季度华东区销售额是多少”就不是数据挖掘问题,但“找出华东区销售额异常下降的客户群体特征”就有点像了。“有价值”就更直接了,模式的最终价值要看能不能带来决策上的改变,比如降低流失率、提高转化率,或者帮助业务发现新的增长点。

2.2 数据挖掘能解决的问题类型

数据挖掘任务通常被分成两大类:预测性任务和描述性任务。

预测性任务的典型代表是分类、回归和异常检测。分类是预测离散标签,比如判断一封邮件是垃圾邮件还是正常邮件;回归是预测连续数值,比如根据房屋面积、位置预测房价;异常检测是找出与大多数样本明显不同的对象,常用于欺诈识别。描述性任务的代表是聚类、关联规则和序列模式挖掘,聚类是把相似的样本分到同一组中,但分组标准事先不知道;关联规则最经典的场景就是购物篮分析,发现“买尿布的顾客很可能也买啤酒”这种模式。

复习时要特别注意“分类”和“聚类”的区别:分类是有监督的,样本标签已知,目标是对新样本进行预测;聚类是无监督的,标签未知,目标是发现内部结构。这个辨析题几乎每年都会出现。

2.3 标准流程:CRISP-DM 六阶段

课程里介绍的标准流程是CRISP-DM,六个阶段分别是:业务理解、数据理解、数据准备、建模、评估、部署。

业务理解就是搞清楚要解决什么业务问题、成功的标准是什么;数据理解是熟悉数据、收集数据、探索数据;数据准备包括清洗、集成、变换、归约等,也就是我们接下来要细聊的内容;建模是选择和应用各种模型;评估是从业务角度判断模型是否达到预期;部署是把挖掘结果落地到实际业务流程里。

我在复习时特别提醒自己注意两点:第一,这个过程不是单向线性的,经常要往回迭代,比如评估阶段发现数据不行,要退回数据准备阶段;第二,数据准备通常占据整个项目的大部分时间和精力,这不是“没本事的人做的活”,而是决定模型上限的关键环节。

2.4 哪些情况不适合数据挖掘

教材常讲适用条件,但考试的难点反而在于“不适合”的场景。数据挖掘不适合的情况有这几种:数据量太小,统计分析就能解决问题;数据本身噪声极大,可信度很低;问题非常明确,直接写SQL查就能得到答案;领域规则已经被专家完整总结过,再去挖掘属于重复造轮子。

理解“不适用”边界非常重要,因为实际项目中很多人拿到一个任务就急着上复杂模型,结果资源和时间都浪费了。面试时如果能主动说清楚“这里为什么不适合用数据挖掘”,通常能给面试官留下不错的印象。

3. 数据预处理方法:真正决定结果上限的脏活累活

3.1 为什么预处理比建模更能影响效果

数据挖掘圈有句话叫“垃圾进,垃圾出”。模型再强,喂给它的数据不干净,结果也好不到哪去。更加反直觉的是,清洗和变换数据时做的每一个选择,最后都会在模型结果里放大。你选了均值填充还是中位数填充,你做了min-max归一化还是z-score标准化,都会直接影响后续模型的表现。

课程里讲的数据预处理方法,大致可以归为四个方向:数据清洗、数据集成、数据变换、数据归约。复习时不要只背名词,要能把它们按“为什么要做、用什么方法、方法之间的区别”串起来。

3.2 数据清洗:缺失值、噪声与离群点

缺失值处理是最常见也最关键的预处理步骤。复习的时候,老师通常会给一张各种填充策略的对比表,但实际使用时,我的决策思路是这样的:

  • 如果某一列的缺失率极高,比如超过40%甚至60%,这列的可用信息已经很有限,一般直接删除该列;如果某一行缺失的字段太多,也考虑删除该行。
  • 如果缺失率很低,比如低于5%,直接删除缺失行影响不大;但如果样本量本身很少,删除行会很可惜,就要考虑填充。
  • 中间情况,用填充策略。数值变量常用均值或中位数填充,类别变量常用众数填充。带时间序列特征的数据,前向填充也是常用手段。

很多人会忽略的是:填充规则只能用训练集去拟合并应用到测试集,不能拿全部数据算均值和标准差再回填。这个知识点在后面的“易错点”里我会再强调一遍。

噪声数据处理常见的办法是分箱和平滑。分箱就是把连续值按区间切成几个箱,再对每个箱内的值做均值平滑、中值平滑或边界平滑。比如一组价格数据[100,120,150,210,230],按等宽分成两个箱,第一个箱均值是123,那么箱内值都换成123,这就是均值平滑。分箱复习时要注意等宽和等频的区别:等宽按值域切成相等间隔,缺点是可能某个箱里样本特别少;等频按数量切成每箱样本数相等的箱,缺点是区间宽度可能差异很大。

离群点的识别方法常考的有3σ原则、四分位数间距IQR方法和基于聚类的检测。这里我要特别提醒:离群点不一定是噪声,它可能是真正的异常模式。在欺诈检测场景中,离群点恰恰是我们最想找的目标。所以“先识别离群点然后一律删除”是非常粗暴的处理方式,正确的做法是结合业务判断。

3.3 数据集成:多个数据源合并时的坑

数据集成是把来自多个系统的数据合并到一起,比如把交易表、用户表、商品表拼成一个宽表。实际项目中这步最费精力,因为不同系统的数据口径经常不一样。

实体识别是第一个难题,同一用户在不同系统里可能表示成不同字段,需要靠主键或者匹配规则去对齐;第二是数值冲突,同一指标在不同数据源里单位不同,例如一个系统记录金额单位是“元”,另一个是“万元”,合并前必须统一;第三是数据冗余,不同来源的字段之间可能存在高度相关,比如“年龄”和“出生日期”本质上是同一信息,保留其一即可,否则会给模型引入冗余和多重共线性问题。

复习教材里讲到可以用相关系数矩阵来判断数值字段的冗余程度,当两个字段间的绝对值超过0.85时,通常建议只保留其中一个。这不仅是理论题,也是实际项目中特征工程的第一步。

3.4 数据变换:归一化、标准化与离散化

数据变换是预处理方法里计算量最大、考得也最细的一块。首先要分清归一化和标准化。

min-max归一化的公式是:

X' = (X - min) / (max - min)

它的作用是把数值映射到[0,1]区间,适合数据本身范围固定、没有太多极端值的情况。它的致命缺点是:一旦新数据超出了原来的min或max,归一化结果就不再是[0,1]范围,整个数值相对关系都会变化。所以使用min-max归一化时,一定要保存训练集上的min和max,应用时直接用训练集的统计量,而不是重新计算。

z-score标准化的公式是:

X' = (X - mean) / std

它在数据近似正态分布、或存在少量离群点时更为稳健,因为均值和标准差受极端值的影响比min和max小。很多距离类算法,比如K近邻、K-means,以及神经网络,都会优先推荐标准化。

离散化是另一类变换方法。把连续变量变成有序类别,比如把“年龄”分成“青年、中年、老年”,常用方法有等宽法、等频法和基于聚类或决策树的方法。离散化的价值在于:某些算法只能处理类别型数据,比如朴素贝叶斯处理类别变量更自然;离散化还能增强模型可解释性,比如“年龄在18到25之间”比“年龄等于23.5”更容易向业务解释。

我个人在复习时会用一小段Python示例来串起这些预处理操作。假设我们有一个类表格结构的数据集,大致逻辑如下:

# 数据预处理逻辑示例:缺失值检查与填充 for col in dataset.columns: missing_rate = dataset[col].isna().mean() if missing_rate > 0.6: dataset.drop(col, axis=1, inplace=True) elif missing_rate < 0.05: dataset.dropna(subset=[col], inplace=True) else: if dataset[col].dtype == 'object': dataset[col].fillna(dataset[col].mode()[0], inplace=True) else: dataset[col].fillna(dataset[col].median(), inplace=True) # 对数值列做z-score标准化 for col in numeric_cols: mu = dataset[col].mean() sigma = dataset[col].std() dataset[col] = (dataset[col] - mu) / sigma

这段代码虽然只是概念示意,但包含了我认为最重要的两个习惯:一是先看缺失率再决定删还是填;二是所有填充和标准化统计量都只是在训练部分计算,不能拿全量数据去算,否则会造成数据泄漏。

3.5 数据归约:给数据做减法

数据归约的目标是在不显著损失信息的前提下,减少数据规模,从而降低计算开销。课程里主要讲两类:维度归约(降维)和数值归约。

维度归约的代表是主成分分析(PCA)。PCA的思想很直观:把原始高维数据投影到少数几个方差最大的方向上,用投影后的坐标代替原始特征。形象地说,就像把三维物体拍成一张二维照片,虽然丢了些信息,但保留了主要形状。复习PCA时,需要理解协方差矩阵、特征值和特征向量的关系,主成分的方差贡献率概念经常考。维度的选择通常以累积方差贡献率达到70%到85%为参考标准。

特征选择是另一个方向,和特征抽取不同,它不改变原特征,只是从所有特征中选一个子集。课程里把特征选择方法分成三类:过滤式、包裹式和嵌入式。过滤式独立于学习算法,先按统计指标(卡方、相关系数、互信息)筛特征;包裹式直接在候选特征子集上训练模型,用模型表现来评价;嵌入式在模型训练过程中自动完成特征选择,比如决策树的特征重要性、带L1正则化的模型。

数值归约则包括直方图、聚类质心和抽样。抽样方法里有不放回简单随机抽样、放回抽样和分层抽样,分层抽样保证每个类别的样本按比例被抽到,在不平衡数据中非常重要。

4. 定性归纳:从数据里提炼if-then规则的经典路线

4.1 定性归纳到底在归纳什么

“定性归纳”这个名字听起来有点学术,其实本质很简单:从数据中归纳出一组描述性的规则,每条规则的形式是“如果满足条件A且条件B且条件C,那么属于类别D”。比如“如果天气=晴且湿度=低,那么去打球”。它能回答“什么样的样本会被分到哪个类别”这种定性问题。

复习时要注意它和定量归纳的区别。定量归纳得到的是数值关系,比如回归方程 ( y = a + bx );定性归纳得到的是分类规则或概念描述,它更强调可解释性。有些教材会把它归入分类任务的范畴,有些则单独作为概念描述来考,但不管归到哪儿,核心都是“规则学习”这条线。

4.2 决策树复习主线:从ID3到CART

决策树是定性归纳最重要的实现方式。树从根到叶子的每条路径,都可以改写成一个if-then规则。复习决策树的关键,就是搞清楚每一代算法到底在“选择划分属性”上做了什么改进。

先看信息熵。熵度量的是数据集的不确定性或混乱程度,公式是:

Entropy(S) = -Σ p_i log₂ p_i

其中 ( p_i ) 是第 ( i ) 类样本所占比例。如果数据只属于一类,熵为0,纯度最高;如果两类各占一半,熵为1,最混乱。

ID3算法用信息增益选择划分属性。信息增益的公式是:

Gain(S, A) = Entropy(S) - Σ (|S_v| / |S|) × Entropy(S_v)

其中 ( S_v ) 是属性A取值为v时划分出的子集。信息增益越大,说明用属性A划分后,纯度提升越多。

考试时经常给出一个小数据集,让你手工计算信息增益。我复习时用的例子是一组天气数据,包含14个样本,正例(打球)9个,负例(不打球)5个。总熵是:

Entropy(S) = - (9/14) log₂(9/14) - (5/14) log₂(5/14) ≈ 0.940

以Outlook属性为例,它有Sunny、Overcast、Rain三个取值。Sunny有5个样本,其中正例2个、负例3个,熵约为0.971;Overcast有4个样本,全是正例,熵为0;Rain有5个样本,其中正例3个、负例2个,熵约0.971。条件熵为:

(5/14) × 0.971 + (4/14) × 0 + (5/14) × 0.971 ≈ 0.693

所以Outlook的信息增益是:

Gain = 0.940 - 0.693 ≈ 0.247

这个计算过程几乎每年都考,一定要亲自手算一遍,尤其是log₂的计算要熟练。

ID3有个著名缺点:它偏好取值较多的属性。比如“日期编号”这种属性,每个样本取值都不同,划分后每个子集都特别纯,信息增益会非常高,但这样的划分没有泛化意义。C4.5引入了增益率来修正这个问题:

GainRatio(S, A) = Gain(S, A) / SplitInfo(S, A)

其中 SplitInfo 也叫分裂信息,它考虑的是属性A取值的多样性。继续用Outlook这个例子,按照Sunny、Overcast、Rain各占5、4、5个样本计算:

SplitInfo = - (5/14) log₂(5/14) - (4/14) log₂(4/14) - (5/14) log₂(5/14) ≈ 1.577

所以增益率为:

GainRatio ≈ 0.247 / 1.577 ≈ 0.157

CART算法则是另一条路线,它用基尼指数代替熵。二分类问题中,基尼指数的公式是:

Gini(D) = 1 - Σ p_i²

基尼指数越小,纯度越高。对二分类来说,Gini = 2p(1-p),其中p是一类样本占比。CART选择划分时,会计算每个候选划分的基尼指数,选择加权基尼指数最小的属性。CART和ID3/C4.5还有一个重要区别:CART生成的始终是二叉树。

复习决策树时还必须把剪枝搞明白。不剪枝的决策树会把训练集噪声也学进去,这就是过拟合。预剪枝在建树过程中判断“当前划分是否带来泛化能力提升”,常用方式包括限制树的最大深度、设置节点最小样本数;后剪枝是先把树建完,再从下往上合并节点或用验证集评估剪掉某些子树。课程里提到的悲观剪枝和代价复杂度剪枝属于后剪枝。

4.3 规则归纳与顺序覆盖算法

除了决策树,定性归纳还包含直接学规则的方法。最经典的思路是顺序覆盖算法,也叫逐步覆盖算法。它的核心逻辑很简单:循环学习一条规则,每学到一条规则,就把它覆盖的样本从训练集中去掉,再在剩余样本上学下一条规则,直到覆盖完某个类别的所有样本。

我复习时会把顺序覆盖写成伪代码来帮助记忆:

# 顺序覆盖算法逻辑 learned_rules = [] remaining_samples = train_set while positive_samples_in(remaining_samples) is not empty: rule = learn_one_rule(remaining_samples) learned_rules.append(rule) remaining_samples = remove_samples_covered_by(rule, remaining_samples) return learned_rules

一个规则覆盖了哪些样本,定义要清楚:如果某样本的特征满足规则的“条件部分”,并且该规则预测的类别与样本真实类别一致,这个样本就被规则“正确覆盖”。学习单条规则时,常用爬山搜索:从空条件开始,逐步添加能显著提升规则纯度的条件,直到规则覆盖的样本足够纯。课程里提到的CN2算法就是在这种框架下,用拉普拉斯估计或似然比来评价规则质量。

这种规则学习和决策树的区别在哪里?决策树是“分而治之”,每次选一个属性划分整个数据集,然后递归;顺序覆盖是“逐个攻克”,每次只针对一个类别学一条独立规则。理解这个区别,简答题基本就能拿分。

4.4 支持度、置信度与规则评价

有了规则,还要能评价它好不好。课程里定义了三个关键指标,以规则 ( X \rightarrow Y ) 为例:

指标公式含义备注
支持度P(X ∪ Y)X和Y同时出现的样本比例支持度低说明规则覆盖范围小
置信度P(Y | X)X出现时Y出现的条件概率置信度高不代表规则一定有效
提升度P(X ∪ Y) / (P(X) × P(Y))X对Y出现概率的提升倍数大于1才有正相关意义

这组指标常出现在关联规则章节,但定性归纳里的规则评价也会用到,复习时不要以为只要记住“支持度、置信度”就行。还需要区分两类规则:关联规则是没有目标变量的,购物篮里“A→B”只是同时出现,不指向某个预定类别;分类规则则有明确的目标类别,后件是类别标签。这两个概念弄混是考试最常见的失分点。

5. 复习时最容易踩的坑与高频易错点

5.1 数据泄漏:先切分还是先预处理

数据泄漏是个考得深也考得多的点。很多初学者喜欢在完整数据集上先做缺失值填充、标准化、特征选择,然后再划分训练集和测试集。这个顺序是错的,原因在于你用全量数据算出来的均值、标准差、填充值已经“看到了”测试集的信息,测试集就不再是未见数据,模型的性能估计会虚高。

正确流程是先划分训练集和测试集,所有预处理参数都只在训练集上拟合并保存,然后直接应用到训练集和测试集。特征选择的流程也如此,特征子集只能在训练集上筛选,绝不能把测试集的信息提前引入。考试里如果给一个“先预处理后切分”的流程让你找问题,答案就是数据泄漏。

5.2 归一化和标准化的选择对照

复习时我给自己总结了一个简洁的选择逻辑:

场景推荐方法理由
数据有严格上下界min-max归一化映射到固定区间,相对距离保留
数据近似正态分布z-score标准化均值和方差有意义,结果更稳定
数据有离群点z-score标准化优先min-max会被极端值拉伸区间
使用距离类算法归一化或标准化皆可,但要统一量纲不一致会扭曲距离计算
使用树模型通常不需要归一化树模型按阈值划分,对单调变换不敏感

树模型不擅长外推但擅长捕捉非线性,对数据的绝对值不敏感,所以做不做归一化对决策树影响不大。但如果你用的是KNN、SVM或者神经网络,量纲不一致会严重影响模型结果,这一点复习时要牢牢记住。

5.3 缺失值填充的副作用

均值填充是很多人的默认操作,但它会降低数据方差,让分布变得更集中,可能掩盖掉变量原本的波动。对类别变量用众数填充也可能引入偏差。更稳妥的思路是:除了简单填充,还可以考虑增加一个“是否缺失”的指示特征,让模型自己学习缺失模式。这个方法考试不一定会考,但在项目里非常实用。

5.4 决策树过拟合与手工构建小坑

考试里手工构建决策树时,有几件事特别容易扣分。第一,划分属性时如果没有说明使用的指标,默认要写出熵或基尼的计算过程,不能只写结论;第二,剪枝决策不能只看训练集准确率,要用验证集或估计泛化误差,很多题会在这里设陷阱;第三,连续属性的划分阈值要排序后逐一尝试相邻值的中点,而不是拿离散值直接套公式。

5.5 考前自测清单

我复习到最后会做一次快速自测,如果你能比较流畅地回答下面这些问题,说明这块基础是稳的。

  • 数据挖掘的定义中,“潜在”“事先未知”“有价值”分别强调什么?
  • CRISP-DM的六个阶段是什么?哪个阶段通常耗时最长?
  • 缺失值处理策略有哪些?各自适用什么场景?
  • 离群点一定都是噪声吗?如果不是,能举一个实际场景吗?
  • min-max归一化和z-score标准化的公式分别是什么?各有什么优缺点?
  • 什么是数据泄漏?正确的预处理和划分顺序是什么?
  • 熵、信息增益、增益率、基尼指数的公式和用途是什么?
  • ID3、C4.5、CART的主要区别有哪些?
  • 为什么不剪枝的决策树容易过拟合?
  • 顺序覆盖算法的基本流程是什么?
  • 支持度、置信度、提升度的公式是什么?提升度大于1意味着什么?
  • 分类规则和关联规则的根本区别是什么?

这几个问题如果能不看笔记写出来,复习效果基本及格了。

我个人复习时的体会是:数据预处理和定性归纳这两块,千万不能只背概念,一定要亲手算和亲手跑。信息增益的log计算,填过一次和没填过是完全不同的记忆深度;预处理管线自己在小数据集上跑一遍,就能真正理解为什么每个环节的顺序那么重要。这门课的复习一到这里,后面还有聚类、关联规则、模型评估等更精彩的内容,咱们下一篇继续聊。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进