资讯详情

资讯详情

特征选择、特征提取与聚类分析:模式识别中的三把钥匙

提到模式识别与机器学习绕过特征问题去谈算法就像不看地图谈导航。过去几年我经手过的实际项目里超过一半的模型效果瓶颈最后都不是出在分类器或者网络结构上而是出在喂进去的特征上。这一讲的内容——特征提取、特征选择与聚类分析——恰好就是解决这类问题的三把钥匙。这篇文章既是对这一讲核心内容的系统梳理也融入了我在实际项目中反复验证过的一些经验希望能给你带来比课堂笔记更立体的视角。1. 特征问题为什么是模式识别的头号难题1.1 从一张表的维度灾难说起很多人第一次接触维度灾难这个概念是在课本上看到一个指数曲线图随着特征维度增加同样规模的数据在空间里会变得极度稀疏。我当时真正被震撼是在处理一个文本分类项目的时候。那个项目里原始特征是用词袋模型统计出来的词表大小有两万多个维度。分类器选了线性支持向量机训练集上的准确率能到95%以上可一到验证集就跌到六成左右。我一开始以为是过拟合加正则、加数据增强折腾了快两周效果纹丝不动。后来才意识到问题出在特征空间的几何结构上两万多维的空间里样本之间的欧氏距离几乎没有区分意义绝大多数样本两两之间都差不多远。模型学到的只是训练集上某些偶然的局部模式根本谈不上泛化。这个经历让我真正理解了课本上那句话的含义当维度升高到一定程度基于距离度量的方法几乎都会失效。而更隐蔽的问题是维度升高带来的不只是稀疏还有计算量和存储成本的急速膨胀。在深度学习还不像今天这么普及的年代两万维特征做一次矩阵运算就能让当时的普通工作站卡顿到让人怀疑人生。所以特征工程这个词不是锦上添花的优化手段而是模式识别系统能否work的前提条件。特征选择与特征提取正是从两个互补的角度来应对维度灾难一个做减法删掉不重要的维度一个做变换把高维信息压缩进低维空间。1.2 特征选择与特征提取的本质区别先抛一个我在课堂上经常强调的区分方式特征选择是在原始特征集合中挑出一个子集保留语义、保留物理含义特征提取则是通过某种变换把原始特征映射到新的低维空间新维度往往不再有直观的语义。举个例子。假设我们要识别一张图片里有没有猫。原始特征是像素值几千甚至几万个维度。特征选择的思路是从这些像素里挑出一部分最有判别力的像素位置作为特征——但单独的一个像素点显然很难承载猫的语义。而特征提取的思路是把整张图片变换到某种基底下比如PCA主成分分析的主成分方向或者某种卷积核提取出的纹理特征用少数几个变换后的系数来代表原图。这个区别直接决定了两种方法的应用场景。当原始特征本身具有明确业务含义且我们希望模型结果能向业务方解释时特征选择是更好的选择——比如金融风控里的年龄、收入、负债率这些字段你当然希望知道最终模型用了哪几个字段而不是某个主成分得分。反过来如果原始特征是像素、声学波形、词频这类本身就没有独立解释价值的底层信号特征提取往往更合适。还有一点容易被忽略特征选择是一个组合优化问题从N个特征里选k个严格意义上有C(N,k)种可能穷举几乎不可能所以实际中我们用各种启发式策略。而特征提取本质上是一个优化投影方向的问题通常有解析解或迭代解法计算模式完全不同。理解这一点能帮你判断一个开源工具包底层在做什么避免把它当黑盒用出完全不符合预期的结果。2. 特征选择的三条技术路线与评判标准2.1 过滤式选择不依赖模型的快速粗筛过滤式Filter方法的核心思路是在建模之前先基于数据本身的性质对特征打分排序设定阈值或取Top-K。它完全不依赖下游分类器所以计算效率高适合超高维场景的第一轮筛选。我通常把过滤式方法分成两类单变量统计检验和基于信息量的度量。单变量统计检验里最常用的包括卡方检验、F检验、互信息。拿卡方检验来说它衡量某个特征与类别标签之间的独立性——卡方值越大说明特征与类别越不独立也就越有用。互信息则更通用一些不假设线性关系能捕捉到非线性相关性。这里有个经验如果特征是连续值F检验速度最快如果特征是稀疏离散的卡方和互信息更稳定。实际项目中文本分类我习惯优先用卡方连续传感器数据用F检验或互信息。基于信息量的度量则绕开特征与标签的相关性这一单一视角转而衡量特征子集的整体表现比如最小冗余最大相关性mRMR。mRMR的思路很直白希望选出来的特征与类别标签相关性尽可能高同时彼此之间的冗余尽可能小。我第一次用mRMR时觉得它有点玄后来在一个生物信息学项目里面对一万多个基因表达量特征单变量过滤选出来的特征往往高度相关实际效果远不如mRMR选出的那几十个有代表性——因为单变量排序只看每个特征单独与标签的关系完全没考虑特征之间可能高度冗余。过滤式的局限也很明显它不关心下游模型怎么用这些特征。有些特征单独看与标签几乎无关但和别的特征组合在一起却很有判别力——这在逻辑回归这类线性模型里尤其突出。所以过滤式方法适合初筛把特征从几万维砍到几百维为后续更精细的方法减轻负担而不是一锤定音。2.2 包裹式与嵌入式让模型帮你做决定与过滤式不同包裹式Wrapper方法把特征子集的选择过程与模型性能直接挂钩。典型的做法是贪心搜索前向选择从空集出发每次加入一个让模型性能提升最大的特征后向剔除则是从全集出发每次删掉一个对模型性能影响最小的特征。每评估一个子集都要训练一次模型计算开销很大但效果往往比过滤式更好因为它是按模型的口味来选特征。我在实际中真正用得多的反而是嵌入式Embedded方法。它的核心思路是在模型训练过程中同时完成特征选择最常见的就是加了L1正则的线性模型。L1正则有个非常有趣的几何性质在参数空间的菱形约束下最优解倾向于落在坐标轴上意味着某些特征的系数被精确压成0。这些系数为0的特征就等于被自动选择掉了。用L1正则做特征选择时有个参数需要仔细调正则强度C或alpha。C越小惩罚越重被置零的特征越多C越大则越接近普通线性模型。我通常的做法是用交叉验证在一条对数尺度上扫描C而不是拍脑袋定一个值。有一次项目里我把C从1改成0.05特征从原来的80个筛选到只剩9个模型在验证集上的AUC反而提升了两个百分点——这种砍掉一堆特征反而更好的现象恰恰印证了冗余特征和噪声特征对模型的干扰。树模型里的特征重要性也可以算一种嵌入式选择。基于随机森林或梯度提升树我们可以拿到每个特征在分裂中被使用的次数或带来的不纯度减少量。这类重要性得分的优势是天然考虑了特征交互和高阶关系缺点是稳定性稍差数据集稍有变动排名就可能明显变化。所以我一般不建议仅凭一次训练的重要性排序就定稿至少跑几轮交叉验证看排名的稳定性。2.3 特征数量到底选多少信息准则与工程约束这个问题是几乎每个做特征选择的人都会问的答案却常常令人沮丧没有通用答案。原因很简单最优特征数取决于数据的信噪比、样本量、模型容量和任务复杂度。不过在实践层面有一套行之有效的判断框架。第一层判断来自模型本身。如果你用的是线性模型随着特征增多方差会上升偏差会下降——这是偏差-方差权衡的直接体现。画出特征数从1到全部逐步增加时训练误差和验证误差的变化曲线验证误差的最低点基本就是合适的特征数。这个方法简单直接比任何理论公式都可靠。第二层判断来自信息准则。赤池信息准则和贝叶斯信息准则都在模型似然的基础上加了对参数数量的惩罚项。AIC的惩罚项较轻倾向于保留较多特征BIC的惩罚更重得到的选择更稀疏。在样本量较大的场景我更倾向于BIC因为它更保守更容易给出解释性好的模型。第三层是工程约束。有时候选多少特征不是模型决定的而是线上系统决定的推理延迟要求、内存上限、模型部署体积。比如嵌入式设备上的手势识别特征数量可能必须在20个以内这时候不管AIC说30个最好你也得用排序方法砍到20个以内——业界常说的特征预算就是这个意思。我自己常用的替代策略先用过滤式粗筛到500以内再用嵌入式方法精筛到50以内最后看验证误差曲线确定最终数量。这个三段式流程在多个项目里都验证过兼顾了效率和效果你可以直接拿去作为初始方案。3. 特征提取的数学本质与主力算法3.1 PCA不是把二维变一维那么简单的工具很多人对PCA的理解停留在降维两个字上但PCA的本质其实是坐标系的旋转和投影。它找到一组正交基使得原始数据在这组基下的投影方差尽可能大。第一个主成分是数据方差最大的方向第二个主成分是与第一个正交且方差次大的方向以此类推。为什么要找方差最大的方向这里有个容易被忽略的信息论视角在没有任何标签信息的情况下方差可以看作数据所携带信息量的一个近似度量。方差越大说明数据在这个方向上的区分度越高保留这个方向的投影等于保留了最多的数据结构信息。这个视角也解释了PCA为什么是无监督的——它不需要标签只看数据本身的分布形状。PCA的实际计算路径通常是先对数据做中心化再计算协方差矩阵然后对协方差矩阵做特征值分解。特征值的大小对应各主成分方向上的方差贡献。实践中我很少手写这套过程都是直接用现成库但有些关键细节需要留意特征值分解前数据是否做了标准化处理直接影响结果。特征量纲差异大的情况下没标准化就做PCA主成分会被量纲大的特征主导结果几乎没有实用价值。主成分数量的选择常用累计方差贡献率来衡量一般保留到累计贡献率85%到95%。但这不是铁律有些任务主成分到50%就够用了因为后面的成分可能主要捕捉噪声。PCA对离群点敏感。个别极端值可能形成自己的伪主成分方向把真正的主方向带偏。所以我习惯在PCA之前做一次离群点筛查至少也做一次稳健标准化。3.2 LDA用类别信息指导投影方向如果说PCA是在无标签条件下最大化方差那么LDA就是在有标签条件下寻找最能区分类别的投影方向。它的优化目标是投影后类间距离尽可能大类内距离尽可能小。翻译成数学语言就是最大化类间散度矩阵与类内散度矩阵的比值。LDA和PCA有一个非常经典的对照场景——二分类问题。假设两类数据分别服从两个椭圆分布PCA选的第一个主成分方向可能是两类数据沿椭圆长轴的重叠方向而LDA选的投影方向则是穿过两类中心连线的方向在这个方向上两类数据重叠最少。用一句通俗的话说PCA关心数据怎么分布LDA关心类别怎么分开。LDA的典型限制有三点类内散度矩阵不可逆时典型的高维小样本问题LDA计算会直接崩溃。解决方案之一是先做PCA降维再做LDA虽然这个做法被学术界批评为各自为政但工程上确实管用。LDA假设各类别的协方差结构相同也就是各类数据形状差不多。如果有一类比另一类分散得多LDA的线性边界就会失效。当类别数很多时LDA最多能提取出类别数减一个有效判别方向。比如三分类LDA最多给出两个判别方向。这是一个硬性约束设计特征方案时需要提前知道。3.3 非线性情形核方法与流形思想的引入PCA和LDA都是线性变换。遇到非线性分布的数据比如瑞士卷形状、同心圆嵌套线性方法会在投影时丢失关键结构。这时候就该核方法和流形学习登场了。核PCA的思路是先把数据隐式映射到高维特征空间在那个空间里做PCA再通过核技巧避免显式计算映射后的坐标。这招在处理非线性关系时效果显著。我印象很深的一个例子是手写数字数据里的0和6原始像素空间里的结构很复杂但用高斯核做核PCA之后前两个成分就能把这两类大致分开。流形学习则更进一步它假设高维数据实际上分布在一个低维流形上。等距映射ISOMAP、局部线性嵌入LLE都是这类方法。它们的共同点是依赖局部邻域关系来恢复全局结构。在可视化任务上t-SNE几乎是无冕之王它特别擅长把高维数据中的局部结构映射到二维平面上让聚类结构一眼可见。但我要提醒一句t-SNE的坐标没有稳定语义换一版数据或参数困惑度、学习率结果就可能明显变化它适合探索和可视化不适合作为下游模型的输入特征。选择核方法还是流形方法不能只看流行程度。核PCA保留了核函数选择的自由度计算相对可控适合中等规模数据流形方法对邻域参数的敏感性很高小数据上很容易出现看着美观、实则失真的可视化结果。我的经验是先问自己是要可视化、降维去噪还是提取特征给下游模型吃不同的目标选的方法完全不同。4. 聚类分析无监督视角下的结构发现4.1 聚类问题在数学上到底在优化什么聚类问题和分类问题最本质的区别是它没有标签信号。所有聚类算法本质上都是在某种相似性度量下寻找数据的一个划分使得同一个簇内的样本尽可能相似不同簇的样本尽可能不同。但这个尽可能落到数学上不同算法给出了完全不同的形式化。K-means优化的是簇内平方误差和——每个样本到它所属簇中心的欧氏距离平方和层次聚类优化的则是一系列合并/分裂准则比如最小化合并后簇间距离的增量DBSCAN则根本不走划分中心的路线它直接根据密度可达关系定义簇。理解每个算法在优化什么是选对聚类方法的前提。K-means假设簇形状是凸的也就是近似球形遇到半月形、环形簇就基本失效层次聚类不假设簇形状但计算复杂度高对离群点敏感DBSCAN能发现任意形状的簇还能顺手标出离群点但对密度差异大的数据有的簇密、有的簇疏表现不佳。不过我想先泼一点冷水现实中完美簇结构是很少见的。我经手的大部分真实数据簇与簇之间都有重叠边界模糊。与其纠结哪个聚类算法理论最优不如先想清楚我要拿聚类结果做什么——如果是做用户分群画像簇的可解释性比簇间距离紧密度更重要如果是做异常检测密度型方法往往比划分型方法实用得多。4.2 相似度度量比算法选择更关键的隐藏变量聚类算法选来选去最后往往发现瓶颈出在相似度怎么算。K-means默认用欧氏距离这背后其实隐含了一个假设各特征维度的重要性相同且彼此独立。现实中这个假设几乎不成立。我在一个客户分群项目里踩过这样一个坑原始特征里包含消费金额和消费频次两个变量消费金额的量纲动辄几千消费频次是个位数。直接计算欧氏距离聚类结果几乎完全被消费金额主导消费频次形同虚设。我一开始还以为是K-means不好用后来做了z-score标准化再跑聚类结果立刻发生了变化分群结构明显合理了很多。这个经历让我养成一个习惯任何基于距离的聚类第一步永远先检查特征的量纲和离散度。另一个容易忽略的问题是特征间的相关性。两个强相关的特征相当于在距离计算里被重复计权。比如一个用户分群场景里同时放进消费总金额和消费笔均金额它们高度相关结果就是这两个因素在距离计算里占了双重权重。遇到这种情况我通常先做PCA把相关结构打掉或者直接基于相关性做一次特征选择再进聚类。这一步虽然不起眼但经常决定了聚类结果的成败。所以深入一点讲用什么度量和要不要先标准化这两个问题比选哪个聚类算法更值得花时间。我自己的标准流程是先标准化再看特征相关性做粗筛最后才考虑算法选择。4.3 K-means、层次聚类与DBSCAN的实操决策点具体聊三个主流算法的实操决策点。K-means最让人头疼的是K怎么定。手肘法是教科书答案画出不同K下的簇内平方误差和找拐点。但现实数据大多没有明显的肘曲线一路平滑下降。这时候我通常结合业务约束来定K分群数量要能映射到运营策略比如电商场景里你只有三种优惠策略那K3或4就是合理的选择。也可以用轮廓系数辅助判断它同时衡量簇内紧密度和簇间分离度数值越接近1越好。注意轮廓系数的计算需要样本间距离数据量大时会很慢。层次聚类里 linkage 的选择是最关键的超参数。Ward法倾向于产生大小相近的簇适合均匀结构的场景单链接最小距离容易产生链条状的簇对噪声敏感完全链接最大距离偏向紧凑球形的簇。实际中我一般先试Ward因为它的目标函数与K-means有精神上的类似结果通常更均衡。DBSCAN的两个参数——邻域半径eps和最小样本数minPts——直接影响簇的数量和形状。eps太小会把一个簇拆散成噪声太大会把多个簇糊成一团。凭经验调这两个参数非常难受我常用的方案是先算数据集中所有样本的k近邻距离分布画出k距离图在曲线拐弯处选eps大约能获得一个不错的初值。minPts一般取特征维度数的两倍左右数据量小时可以适当下调。顺带提一句不同聚类算法的结果对同一份数据可能有截然不同的刻画。一个常用的做法是同时跑两种聚类算法比如K-means和DBSCAN然后对比分群结果在业务口径上的一致性。如果两个差异极大的算法给出的分群高度一致说明数据里确实存在坚实结构如果分歧很大那就要反思特征和相似度度量是不是有问题。4.4 聚类效果评估好坏到底怎么判断很多人问聚类没有标签怎么知道做得好不好这个问题的答案分两条路内部指标和外部指标。外部指标适用于有参考标签的场景即使聚类本身用不到标签。常用的有调整兰德指数ARI、标准化互信息NMI、同质性/完整性分数。ARI的取值范围是-1到1越接近1说明聚类结果与参考标签越一致。需要注意的是外部指标衡量的一致性不等于聚类的正确性因为参考标签本身也可能有噪声或主观性。内部指标不依赖任何标签直接从聚类结果的结构出发打分。最常用的就是前面提到过的轮廓系数它计算每个样本与自身簇内其他样本的平均距离a和与最近的其他簇样本的平均距离b得分(b-a)/max(a,b)。这个指标对K-means这类凸簇算法比较友好对DBSCAN这类任意形状簇则不太公平——所以内部指标比较适合同一算法不同参数的横向对比不太适合不同算法之间的跨方法对比。还有一类实践方法也值得提一句业务可解释性验证。把聚类结果输出成每个簇的特征画像——比如每个簇的特征均值、分布差异、典型样本——然后请业务方或领域专家来判断这些簇是否说得通。在客户分群这类真实项目里这种验证往往比任何数学指标都更有说服力。一个数学上最优的K如果分出来的簇连业务方都无法命名这个聚类结果很难真正用起来。5. 从课程到实战的衔接特征与聚类中的常见坑5.1 归一化与标量级的隐形影响这一讲内容里特征工程和聚类分析对数据尺度都极度敏感但课程讲义里往往只是一笔带过。我自己后来才发现数据是否归一化对不同的模型影响程度完全不同——基于距离的模型K近邻、K-means、SVM对尺度敏感而基于树的模型几乎不受影响。这意味着如果你用随机森林做特征重要性排序不做归一化问题不大但如果你用同样的数据去做聚类或K近邻归一化就是必做操作。归一化的具体形式也有讲究。MinMax把数据压缩到[0,1]但对离群点敏感z-score标准化把数据转化为均值0、方差1更适合有离群点的场景如果是稀疏数据直接用z-score可能会破坏稀疏结构此时可以用MaxAbsScaler只做尺度缩放。选择哪个取决于后续算法是否依赖距离的绝对值以及数据本身的分布形态。5.2 高维数据下的距离失效与聚类骗局高维场景下距离度量会退化。这不是直觉而是有数学支撑的在高维空间中任意两个样本之间的欧氏距离都趋近于相同最大值和最小值的比值接近1。换句话说距离本身失去了判别能力。如果这时候你直接跑K-means聚类结果基本等于随机划分甚至更差——这是我在高维文本聚类项目里真实踩过的坑。应对的方法有两条路正好扣回这一讲的特征选择与特征提取先用特征选择去掉噪声维度再用PCA或t-SNE把维度压缩到几十维内然后再做聚类。这两步做完距离度量的有效性会明显恢复。不过副作用是降维本身也是一种信息损失压缩后的聚类结果可能不再精确反映原始空间的结构。所以高维聚类的完整链路应该是特征选择粗筛 → 特征提取压缩 → 聚类 → 用轮廓系数或业务验证确认结果。5.3 课程不会明说的三件小事最后分享三个比较具体的实操经验这些在课本和讲义里很少会写但项目中非常容易撞上第一特征选择的结果不要只看一次。我习惯对同一份数据做5折交叉验证每次记录选中特征的频次。只有那些在5折中至少出现4次的特征才被认定为稳定特征。只跑一次就定稿很容易被数据的偶然性欺骗。第二标准化要在切分训练集和测试集之后只用训练集的统计量去变换测试集。如果先对全量数据做标准化再划分就引入了数据泄露验证指标会虚高。这个错误非常隐蔽我见过不止一个人在这里翻车。第三聚类结果的可复现性要重视。K-means的初始化带有随机性同一份数据每次运行结果可能不同。我在生成线上聚类标签时会固定随机种子或者用K-means的确定性变体确保同一输入永远得到同一输出。否则下游系统跟随聚类标签做决策时就可能出现标签漂移的诡异问题。写到最后特征选择、特征提取和聚类分析这三块内容恰好串起了模式识别里从原始数据到可用模式的完整链条。回头看我自己的项目经历凡是早期没重视这三块的几乎都在后续埋了雷——要么模型过拟合要么聚类结果无法解释要么特征数爆炸导致线上服务成本失控。而先花足够时间理清数据里到底有什么结构、哪些维度真正携带信息、要保留语义还是接受变换后的抽象特征后续的建模工作通常会顺畅很多。这一讲的内容在整门课程里属于承上启下的位置前面学的概率论、线性代数和最优化方法几乎都在这里派上用场后面要学的分类器设计、模型评估和深度学习又都建立在特征表示的基础上。所以建议你在学完这一讲之后亲手跑一个完整的小项目拿一份高维数据集依次完成特征选择、特征提取和聚类分析每一步都对比处理前后的模型或簇质量变化。这个过程做完你对这三块内容的理解会远超会做题的层面。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →