大学里数据挖掘课,第二章往往是真正开始“劝退”的地方。第一节课还停留在“什么是数据挖掘”“能挖出什么金矿”这种概念层面,到了第二章,突然就铺开了一堆关于数据预处理、数据质量、相似度度量的内容,配合课后那十几道计算加应用题,不少同学直接在第一次作业上就卡住了。
这篇文章不打算帮你“抄答案”,而是从“Data Mining 第二章到底在考什么”这个角度出发,把课后题背后真正要练的能力拆开讲清楚。适合正在啃教材的在校生、准备转行做数据相关工作的朋友,也适合那些工作里天天和脏数据打交道、但没系统梳理过预处理方法论的从业者,刷完这章习题再去处理实际数据,思路会清晰很多。
1. 先别急着做题:这一章到底在构建什么底子
1.1 一个被严重低估的开篇章节
数据挖掘课程的结构通常都是先给总体框架,然后进入数据预处理环节。很多人觉得第二章“没有算法含量”,无非是讲讲缺数据怎么办、数据格式怎么转一转,等到第三章开始接触关联规则和分类算法,才觉得“正片开始”。这是一个很普遍的误判。
从实际业务角度看,数据预处理花掉的时间往往占到整个数据分析流程的60%到80%,而这恰好就是第二章覆盖的内容。做算法模型之前,数据质量直接决定模型上限,垃圾进垃圾出这句话每个做这行的人都应该刻在心里。课后习题编排的意图也很明确:不是让你机械构造数据集,而是逼着你理解每一个预处理操作背后的触发条件和选择理由。
第二章课后题大致可以分为三类。一类是概念辨析题,比如对比数据属性类型、解释数据质量维度;一类是计算操作题,比如给定数据表做归一化、算欧几里得距离;还有一类是设计/应用题,比如面对某个场景,提出预处理方案并给出理由。算起来不复杂,但年年都有大量学生在这些题目上丢分,不是因为不会算,而是因为没有理解操作背后的判定逻辑。
1.2 数据类型的分类为什么值得死磕
教材在第二章开头就会抛出一个核心分类框架:标称属性、序数属性、区间属性、比率属性。表面上这是四个术语,实际上它们决定了后面每一个步骤的算法选型。
标称属性就是一堆纯名字,比如性别“男”和“女”,没有大小、没有次序,你只能用是否相等来判断;序数属性有了相对顺序,比如评分中的“差、中、好、优”,但差值没有实际意义;区间属性不仅有序,而且差值是固定且有意义的,摄氏温度30度和20度的差距与40度和30度的差距相同;比率属性在区间的基础上增加了真正的零点,比如体重、距离、收入,倍数关系才有实际含义,60公斤是30公斤的两倍。
这个分类的意义非常实在。做数据预处理时,标称属性通常用独热编码或者标签编码,序数属性可以在保留顺序的前提下做映射,区间和比率属性才能直接计算均值和方差。很多课后题会在这一块出辨析题:给出一组属性,让你判断类型,并说明该用什么归一化方法。概念不牢,后面每一步都容易错。
我自己的体会是,用数据来判断比用定义去套要容易得多。拿到一个属性,先问自己三个问题:能不能比大小?两个值之间的差有没有物理意义?有没有绝对零点?三个问题答完,类型就定了。这也适合考试时的快速判断。
1.3 数据质量维度:课后题最爱埋坑的地方
数据质量是第二章的另一个高频考点,准确性、完整性、一致性、时效性、可信性、可解释性这几个维度,几乎年年出现。课本里对每个维度都有定义,但考试不会直接让你默写定义,而是给一个描述,让你判断它属于哪个维度。
比如,“某客户表中同一客户的年龄在一个字段中显示38岁,在另一字段中显示40岁”,这体现的是哪方面的数据质量问题?答案是数据不一致性。“某门店销售额字段有20%的缺失值”,这个问题对应的是完整性问题。还有一种常见考法是反过来考,给出一段文字,里面包含多种数据质量问题,要求逐一识别并给出预处理方法。
想要在这类题上拿分,不能靠死背定义。你需要从“问题现象→质量问题维度→处理手段”这条链路去理解。现象描述的是“出了什么问题”,维度回答的是“哪一类问题”,处理手段才是“怎么办”。课本上每个维度后面都附带了一系列处理方法,出题人最喜欢把三个环节混在一起,让你自己拆开。课后习题刷完,自己动手做一张现象‑维度‑方法的映射表,比反复读课本效率高得多。
2. 核心细节复盘:把课后题背后的每一处原理抠透
2.1 数据清洗:缺失值、噪声和离群点的处理逻辑
数据清洗是第二章出题量最大的一块,因为它最贴近真实业务。教材里把清洗工作拆成缺失值处理、噪声数据处理和离群点检测三部分。课后题经常要求你针对同一个小数据集,分别给出不同的处理方案并说明理由。这时候你需要判断的不是“哪种方法最好”,而是“哪种方法在这组数据的前后语境里最合理”。
缺失值处理大致有四条路线:删除记录、手动填补、自动填补、不处理。自动填补里最常用的就是均值/中位数/众数填充,考试时要注意使用哪一种统计量取决于该属性的数据类型和数据分布。如果属性服从近似正态分布且数据类型是区间或比率,均值填充比较稳妥;如果数据偏态严重,中位数更鲁棒;如果是标称属性,那众数是唯一合理选择。很多课后题会在数据集中特意埋入一个严重偏态的字段,用来区分哪些人是真的理解统计量选择,哪些人只会无脑算平均值。
噪声数据和离群点也不是一回事。噪声是数据本身的随机误差,比如传感器传输过程中产生的高频干扰;离群点是真实存在但远偏离整体模式的值,可能本身就是值得研究的对象。处理噪声常用的方法是分箱、聚类、回归平滑;处理离群点则要先判断其是否由错误引起,再决定修正还是剔除。这个概念区别在课后题里经常被混在一起出,一定要能分清楚。
做题的时候注意题目给的是单变量还是多变量数据。单变量离群点检测常用四分位距法(IQR)、3σ法则;多变量场景用的是马氏距离或者聚类方法。第二章一般不会要求手算马氏距离,但会要求你说明多变量离群点为什么不适合用单变量方法判断,这个简答考点出现的频率并不低。
2.2 数据变换:归一化到底在什么时候用哪种
数据变换这一节最核心的内容就是数据归一化。课后习题几乎必考计算题,最典型的就是给定一列数值,要求分别用最小-最大归一化和z-score标准化计算变换后的结果。
最小-最大归一化的公式是:新值 = (原值 - 最小值) / (最大值 - 最小值)。它将数据映射到[0,1]区间,问题是对异常值非常敏感——如果数据里混入一个极端大值,整个区间会被拉伸,正常数据全部挤在很小的一块区域。z-score标准化公式是:新值 = (原值 - 均值) / 标准差。它不要求数据落在固定区间,但对均值本身比较敏感,适合数据近似正态分布的场合。
有些课后题会故意设置一个偏态分布数据集,让你比较两种方法的差异。这时候不能只列计算公式,还要指出偏态场景下z-score更容易识别极端值,而最小-最大归一化会被极端值绑架。想拿全分,最好举一个具体数值来说明直观差异,比如原数据中某个正常样本在两种变换后数值上的变化趋势。
小数定标归一化也偶尔会出现在作业里,公式是除以10的j次幂,使值的绝对值小于1,但实际工业场景中用得极少,课后题中出现频率远低于前两种。核心原因是它依赖数据本身的量纲和对齐方式,不同字段间换算关系比较别扭,所以了解即可。
2.3 相似度度量:不只是欧几里得距离那么简单
第二章还有一个重点章节是“相似性和相异性度量”,课后题大多围绕数值数据、二元数据、混合类型数据的相似度计算展开。
数值数据最常用的就是闵可夫斯基距离,其中p=2退化为欧几里得距离,p=1是曼哈顿距离。很多同学记住了公式,但忽略了量纲归一化这一步。实际做题时,如果两个属性的量纲差异巨大(比如一个年龄单位是岁,一个收入单位是万元),直接算欧几里得距离会导致计算结果完全被收入字段主导,年龄字段形同虚设。所以真正的解题顺序是:先标准化,再算距离。这也是第二章把数据变换放在相似度前面的原因,教材的章节顺序是有内在逻辑的。
二元数据的相似度计算则是另一个容易出错的地方。两个二元向量比较时,会产生四个计数:同时为1的个数、同时为0的个数、一方为1另一方为0的个数。简单匹配系数(SMC)把同时为0也算作相似,而Jaccard系数不考虑同时为0的情况。考点通常集中在这个对比上。判断用哪一个,核心在于“两个对象都不具备某个属性”能不能算作相似。对于像“用户是否购买某商品”这样的数据,都没有购买并不能说明两个用户爱好一致,因此用Jaccard更合理;对于像“测试题目是否回答正确”这种数据,都答错和都答对都是相似表现,SMC更合适。
混合类型数据的相似度计算在课后题里属于进阶题型,给出的数据表中有序数属性、标称属性和数值属性混合在一起。解题思路是把所有属性统一到[0,1]区间,每个属性单独算相似度,最后加权平均。课后题如果真出这类题,给的属性数量不会太大,手算可以完成,重点是不要漏掉某个属性,并且注意序数属性要先转成排名分数再加权。
2.4 数据归约与数据离散化:容易被忽略的简答题来源
数据归约包括维归约、数量归约和数据压缩。维归约里比较出名的技术是主成分分析(PCA),数量归约则有参数方法和非参数方法,直方图、聚类、抽样都属于非参数方法。课后题在数据归约上的考核方式,更多是概念判断题和简答题,比如“为什么PCA要基于协方差矩阵”“为什么抽样时分层抽样往往比简单随机抽样效果更好”。
这里有一个高频出题点:数据离散化。连续属性在建模前经常需要离散化,具体方法有分箱、直方图分析、基于熵的离散化、基于卡方检验的离散化。分箱又分等宽和等频两种,等宽按数值范围均匀切段,等频按每个箱内样本数量尽量相等来切分。课后题青睐的是给你一堆连续值,让你分别用等宽和等频分箱,然后把每个箱内的值用箱均值或箱中位数平滑,并说明两种分箱在数据分布不均衡时的表现差异。
关于离散化有一点实操提醒:离散化一定会损失信息,它不是无代价的。为什么还要做?因为很多算法(比如朴素贝叶斯、决策树)对连续属性的处理本质上也是在做离散化,预先离散化可以减少后续计算量,有时候还能提升模型的稳定性。这个“为什么需要”的问题,是简答题里很常见的设问方向,不要只背方法名称而丢了动机。
3. 向后习题的解题思维进阶
3.1 典型计算题的三种固定模板
课后题刷多了你会发现,第二章的计算题其实逃不出几个固定模板。只要把模板里的计算逻辑吃透,做题速度能提升一个量级。
第一个模板是归一化计算。拿到题目第一眼先看字段分布和量纲,接着判断该用最小-最大还是z-score,然后再动手代入公式。有一个解题顺序很重要:先写公式,再列中间量(最小值、最大值、均值、标准差),最后代入每个数据点。考试时中间量会占步骤分,跳过直接写结果就算结果正确,也很容易丢分。
第二个模板是距离计算。判定数据是不是已经标准化,没有就先做标准化。然后根据题目要求选择距离公式,代入时注意按维度对齐,每个维度差值平方后求和在开根号。欧几里得距离的计算本身没有技术含量,真正的坑往往在“单位不一致”“有缺失值未处理”“维度没对齐”这些不起眼的地方。
第三个模板是分箱平滑。先用等宽或等频把数据切成K个箱,然后根据题目要求分别用箱均值、箱中位数和箱边界平滑。箱边界平滑有一个细节:用边界值替代时,离哪个边界近就用哪个,这个“就近原则”容易被忽略。很多参考答案直接写了输出结果,但没有解释边界选择的逻辑,导致学生模仿时一头雾水。
3.2 简答与设计题的答题结构:一定要按层次来
简答题和设计题是很多人的丢分重灾区,原因是回答结构太乱。见过太多人一上来就写“使用均值填充缺失值”,没有前提、没有可选方案对比、没有选择理由,分数自然上不去。
拿“如何处理数据集中缺失值”这类题目举例,一个标准层次型回答应该包含四层:第一层,说明缺失值需要先分析分布机制,是随机缺失还是非随机缺失;第二层,列出现有可选方案(删除、均值填充、回归插补、多重插补等);第三层,表达对具体场景的判断,比如缺失比例低于5%且缺失机制随机,则直接删除记录不会引入偏差,否则优先考虑填充方案;第四层,给出实操层面的补充,比如填充后需要做敏感性分析,观察不同填充方式对后续建模结果的影响。这种层次化的回答方式,在面试场景同样适用,值得一开始养成习惯。
设计题就更需要层次感了。给你一个业务场景,让你设计数据预处理流程,不要零散地列举操作,而是按照数据获取、数据质量评估、数据清洗、数据集成、数据变换、数据归约这条自然链路依次回答。评卷人看到这种结构,第一反应就是“这学生真的理解整章内容”,分数自然不会低。
3.3 一个重要的复习方法:把题目反向转成知识点
刷完一套课后题之后,与其再做一遍来“检验成果”,不如做一次难得多的反向操作:不看题目,把每道题考察的知识点用一句话写出来。比如一道关于卡尔森系数的题目,你写下的不是“用哪个公式”,而是“数据稀疏时,同时为0的情况不应被当作相似”。这个过程强制你把解题动作抽象成决策逻辑,而这些决策逻辑才是考试真正想考察的东西。
我在自学阶段整理过一份对照表:表格左列是课后题号,中间列是题目里的关键数据特征,右列是采用的预处理决策及其依据。做完这张表,再回头看教材,会发现每个章节的小节划分,其实都对应着实际项目里一个具体的决策环节。这种从题目反推知识框架的练习,比机械地多刷两套模拟题更有价值。
4. 把课后习题延伸到真实数据处理流程
4.1 用Python快速验证课后习题里的核心逻辑
有的同学可能会有疑问:课后题手算都会,但到了真实数据上还是发怵。很正常,因为手算和工程实现之间还有一道鸿沟。不过要跨过这道鸿沟并不难,用Python把课后题里的核心逻辑跑一遍,是最直接的过渡方式。
以数据清洗为例,Pandas里的isnull()、fillna()、dropna()三个函数就能覆盖大部分缺失值处理需求。均值填充、中位数填充、前向填充和后向填充都是参数问题,一行代码就能切换。归一化用scikit-learn里的preprocessing.MinMaxScaler和StandardScaler,前者对应最小-最大归一化,后者对应z-score标准化。课堂上手算一列数据也许只需要五分钟,但真实数据动辄几十万行,这时候手算是不可行的,工程化处理才是正道。
下面给一个完整可运行的示例,它演示了“缺失值检查→均值填充→最小-最大归一化”这条链路,你课后刷题时可以把这当作对标准答案的“程序化复现”:
import pandas as pd from sklearn.preprocessing import MinMaxScaler # 构造一个包含缺失值和量纲差异的示例数据 data = { "age": [25, 30, 35, None, 40, 45], "income": [50000, 60000, 75000, 82000, 43000, 90000] } df = pd.DataFrame(data) # 检查缺失值分布 print("缺失值统计:") print(df.isnull().sum()) # 用均值填充 age 列的缺失值 df["age"].fillna(df["age"].mean(), inplace=True) # 初始化归一化器 scaler = MinMaxScaler() normalized = scaler.fit_transform(df) print("归一化后数据:") print(normalized)这个脚本里有一个细节很值得琢磨:fit_transform内部是先计算每个特征的最小值和最大值,再执行变换。这与课堂上手算步骤完全一致,但工程实现需要额外注意一个问题——测试集和训练集必须共用同一套统计量,不能分别做归一化,否则会引入数据泄漏。这一点课本不会在第二章详细展开,但在真实建模流程里非常重要。
4.2 从课后题到项目:四种预处理决策的真实匹配
课后题做完后,可以再花点时间做一次“知识迁移”。拿“数据集成”这个章节来说,课本讲了实体识别、冗余检测、元组重复等问题,真实场景里对应的就是多张业务表合并时的主键匹配和字段冲突处理。比如用户在两个系统里的数据一张表叫name,另一张叫user_name,哪一张更可信,哪一份是冗余,这些就是在做实体识别和冗余消除。
数据归约章节里讲到的PCA,在真实项目里是用来减少特征数量、避免维度灾难的。当你处理一个几百列的特征表时,相关性很高的特征会导致模型训练时间变长且容易过拟合,PCA通过线性变换把原始特征压缩成少数几个主成分,既能保留大部分方差,又能提升模型稳定性。课后题里PCA通常只要求你理解协方差矩阵和特征值,实际项目中还要结合累计方差贡献率来决定保留几个主成分,这个从理论到实践的模块,可以后续遇到实际问题时再单独深入。
分层抽样的意义也可以在真实场景里验证。做用户调研时,如果数据集中地域分布严重不均,简单随机抽样可能漏掉某些边缘地区用户。分层抽样先把用户按地域分层,再从每层内随机抽取,这样至少能保证每个地区都有样本进入最终集。课后题里分层抽样和简单随机抽样的对比只是一道简答题,真实项目中这个差别会让你的分析结论产生方向性差异。
4.3 数据预处理的“性价比思维”:不是所有数据都需要严格清洗
第二章课后题有一个隐含前提:所有数据都是给定的、有限的、可直接操作的。真实场景里缺失值、噪声、离群点的处理,本质上是在做成本收益权衡。删除记录便宜但会丢失信息,均值填充简单但可能扭曲分布,回归插补更精细但计算开销大。做题时你可以不考虑这些开销,真实项目里你必须考虑。
一个常见的实操策略是分阶段处理。第一轮先用最轻量的手段跑通全流程,比如直接删除缺失比例超过50%的列,均值填充少量缺失值,用IQR法剔除极端离群点,快速建一个基线模型;第二轮再引入更精细的插补方法、基于模型的离群点修正、自定义归一化逻辑,对比两轮模型的指标变化。这个策略的核心思想是“先能用,再好用”,避免在一开始就陷入清洗细节而迟迟看不到模型结果。
我带过的新人在第一周往往容易犯一个同款错误:拿到数据后就一头扎进清洗环节,反复调式填充逻辑,结果一周过去还没有跑出任何一版可用的特征和模型。正确做法永远是尽早跑通一版,用结果验证数据质量的影响,再有针对性地优化预处理环节。这一点虽然不是第二章的考点,却是比考点更重要的行业常识。
5. 有人能绕开的坑都在这里,值得花几分钟看完
5.1 一道课后题引出的典型错误清单
把这几届学生常踩的坑集中做了一张速查表,翻一遍能帮你少走不少弯路。
| 常见错误 | 具体表现 | 正确做法 |
|---|---|---|
| 混淆数据属性类型 | 把温度当作比率属性,强行说20度是10度的两倍 | 用“有无绝对零点”来判断,温度没有绝对零点是区间属性 |
| 缺失值一律用均值填充 | 偏态数据用均值,导致大多数样本被拉向中心 | 偏态分布优先用中位数,标称属性用众数 |
| 归一化后直接算距离 | 忘记不同字段量纲不同,距离被大数值字段主导 | 先做标准化再算距离,这是标准操作顺序 |
| 把同时为0当相似 | 二元数据里两个都“没有购买”被当成行为一致 | 稀疏二元数据优先用Jaccard系数 |
| 等频分箱后每箱均值区域混乱 | 不理解等频分箱在分布极度不均时会让边界处的值分到同一箱 | 分箱前先观察数据分布,必要时结合业务语义调整箱数 |
| PCA只用来降维不解释方差 | 不清楚主成分是原始特征的线性组合 | 对主成分做载荷分析,理解每个主成分代表什么 |
这张表建议收藏起来,不只是应付考试,做功课、面试、初入职场都适用。这些错误方式在真实分析场景里出现的频率,远比想象的高。
5.2 关于复习节奏的一点个人建议
针对第二章这类偏理论又带操作的内容,前两遍的学习半径应该完全不同:复习不是重复读书,而是调整聚焦点。第一遍以教材为主,目的是建立术语体系和知识框架,能分清属性类型、说清数据质量维度即可;第二遍要以问题为导向,把重心放在课后题和错题分析上,重点想清楚每一道题对应哪个“决策场景”。如果时间紧张,优先把归一化计算、距离计算、分箱平滑这类必考计算题练熟,再花时间整理简答题的结构化表达框架。
还有一个容易被忽视的学习技巧是动手做笔记。笔记不要抄书上的定义,而是记录自己当时的错误理解。比如你一开始认为“区间属性也能比较大小,那就是比率属性”,后来弄明白了“比率属性需要绝对零点”,“那这个认知差就值得写下来”。自己理解偏差的部分,往往就是考试时最容易丢分的部分。
我在实际复习时还有一个习惯:把每章课后题里涉及的数据表格手抄一遍,然后不看题目,自己尝试从数据中猜测出题人想考察什么。这个习惯听起来有些“反常规”,但坚持一段时间后,你对题目考察点的敏感度会明显提升,做题时能更快锁定考点。
6. 最后聊聊数据和题目的关系
数据挖掘这门课越往后学,越容易沉浸在模型公式和算法调优里。但一旦回到真实业务,你会发现所有高级算法都要先过数据质量这一关。第二章的课后题,本质上是在用一种“人为构造的小数据集”来模拟大规模真实数据里可能出现的种种问题,让你在低风险环境里犯错、纠错、积累经验。
如果你是非计算机科班的学生,这一章的难度可能集中在代码实现和数学公式上;如果你有工程背景,这一章的难点往往在于将工程经验与课本术语对齐。无论从哪个起点出发,认真刷完课后题、动手跑通一遍简单的预处理代码,都会让后续章节学习顺手很多。
最后再分享一个我自己的操作习惯:每次拿到新数据集,先做一次极简“质量体检”,也就是用代码快速统计缺失率、唯一值数量、数据分布形态、是否有明显离群点。这一套流程做完,对数据集的整体情况就有了底,后续所有预处理决策都有了依据。这一习惯就是从第二章课后题里“数据质量维度”那一节延伸出来的,算是理论变现的典型例子。