☰
因果感知的无监督特征选择:从相关性陷阱到稳定可靠的特征筛选
2026/10/17 8:39:19 网站建设 项目流程

做特征选择做到一定程度,很多人都会碰到同一个尴尬局面:离线评测指标都挺漂亮,一换数据来源、一换批次,之前精心挑出来的特征组合就明显掉链子。问题往往不在模型过拟合,而是你选的特征本质上只是“跟目标变量长得像”,并不是“驱动目标变量发生变化的那些因素”。最近我在看一篇题为《Causally-Aware Unsupervised Feature Selection Learning》的工作,它把因果推断的思路塞进了无监督特征选择的流程:在没有任何标签的情况下,不看特征与数据结构的统计相关性,而是去衡量每个特征对数据内在结构到底有没有“因果贡献”。这篇工作解决的是高维无标注场景下特征选择稳定性差、可解释性弱的痛点。如果你在做探索性数据分析、想搞清楚一堆变量里到底哪些是“根因”,又不希望被人工标注束缚住,这篇东西值得认真读。下面我把核心思路拆开,讲清楚因果感知在无监督场景里到底解决什么问题,再结合我的复现经验把实验设计和避坑细节一并整理出来。

1. 无监督特征选择的“相关性陷阱”

1.1 三类常见方案是怎么运作的

先快速回顾一下无监督特征选择里最常出现的三类方法,因为它们代表了一个共同底层假设:特征的价值可以由数据自身分布的统计量来刻画。

第一类是方差过滤。这是最朴素的做法:算每个特征的方差,方差小的认为信息量低,丢掉。逻辑本身没问题,方差确实携带信息,但方差大的特征不一定在生成机制上是重要的。举个极端情况,某个传感器通道的噪声幅度很大,方差名列前茅,但它对聚类结构毫无贡献。

第二类是基于图结构的方案,代表是拉普拉斯得分和谱特征选择。它们的思路是把样本看成图上的节点,用特征构造相似度矩阵,然后衡量每个特征对局部流形结构的保留程度。这个方法在实践中效果不错,但它依赖的是特征之间的近邻关系,这种关系里混杂了大量的冗余信息和间接关联。

第三类是自表达与稀疏重建的方法。这个方法假设特征之间可以用其他特征线性组合表达,再利用稀疏回归找到表达能力强的那部分特征。它的弱点也很明显:重建能力强不等于因果作用强,一个能很好预测其他特征的变量,很可能只是某个共同原因的结果,而不是原因本身。

这三类方法名字不一样、套路不一样,但本质上都在跟“数据到数据”的相关性打交道。在没有标签的情况下,相关被默认等于有用,这个默认在数据分布稳定时勉强成立,一旦场景切换,相关性结构变化,选出来的特征集就会失效。

1.2 一个翻车案例

两年前我在一个模拟工业监测项目里被这个问题结结实实坑过一次。那批数据有几百个传感器通道,没有标注,我们的目标是对运行状态做无监督的异常分簇。当时用了拉普拉斯得分选了前二十个特征,聚类结果在第一批采集的数据上非常干净,簇间分离度很高,项目组都很满意。

后来设备批次更换,同样的特征选择流程放到新批次数据上,聚类指标直接掉下去一大截。我们把数据翻出来逐通道看,才发现当时选中的特征大致可以分成三类:一类是真正驱动状态变化的根因变量,一类是状态变化之后的伴随现象,还有一类是跟设备安装环境强相关的混淆变量。环境一变,伴随变量和混淆变量的统计关联就变了,特征集自然失效。

这个案例让我意识到一件事:聚类精度很高的特征集,未必能在分布偏移下保持稳定。真正能扛住场景变化的,往往是那些位于因果机制链路上的特征——也就是机制不变、它们和结果的关系就不变的特征。

1.3 因果感知到底感知什么

因果感知不是要你画出一张完整的因果图,而是要把特征选择和因果机制之间的桥搭起来。在因果推断里,一个核心概念叫马尔可夫毯。简单理解,目标变量的马尔可夫毯就是能完全刻画它的最小变量集合:只要给定这个集合里的变量,目标变量的分布就不再受集合外任何变量的影响。用人话说,这就是“描述这个人的最小朋友圈”,圈里的人足以唯一刻画他,圈外的人不加任何额外信息。

但在无监督场景里问题就来了:我们没有目标变量。整个数据集里只有一堆特征,没有“要预测的那个Y”。所以当我把因果感知技术用进来时,第一步要想清楚的是——把什么当作结果变量。

常见做法是把无监督聚类得到的离散簇当作伪结果,再用因果推断工具去估计每个特征对这个伪结果的因果贡献。这样做有一个天然缺陷:伪标签本身是估计出来的,可能被混淆结构污染。所以不能只跑一轮,需要在特征筛选之后重新聚类,更新伪标签,再重新评估,迭代着把因果信号从噪声里剥出来。这篇TIP-2026的工作,核心贡献就是把这一整套流程变成了一个可计算、可收敛的学习框架。

2. 核心方案:因果感知如何嵌入无监督流程

2.1 整体框架:伪标签 + 因果效应评估 + 迭代

整个方法框架可以概括成“伪标签 + 因果效应评估 + 迭代更新”三个部分咬合起来。

第一步先用一个标准的无监督聚类算法,比如谱聚类,在原始特征上跑出一组伪标签。这组标签质量不一定高,但它提供了一个可用的结果变量。

第二步是逐特征做因果评估。对每个候选特征,把它当作处理变量,把它之外的其他特征当作混淆变量,把伪标签当作结局变量,然后通过协变量平衡的手段估计这个特征对伪标签的平均处理效应。得到的效应大小和显著性就是该特征“因果价值”的分数。

第三步按照分数重排特征,筛掉那些因果效应不显著的特征,用剩下的特征子集重新做聚类,得到新的伪标签。

第四步循环前面两步,直到特征集合不再发生明显变化。

为什么要迭代?因为第一轮的伪标签很可能是被混淆结构扭曲过的。比如某个混淆变量同时影响着大量特征和数据的簇结构,第一轮聚类结果就会偏向它,导致它被误判为高因果特征。等第一轮筛掉一部分无关特征后,重新聚类得到的伪标签会更接近真实的底层结构,因果评估的准确性会逐步提升。实际调试中我发现,迭代一般五到十轮就能稳定,特征集合在早期变化明显,后期基本不动。

2.2 两条技术路线:因果发现还是潜在结果

实现“因果感知”有两条可以落地的技术路线,这个选择会直接决定方法的上限和复杂度。

第一条路线是因果发现。直接对观测数据跑因果结构学习算法,比如约束类方法、基于得分的搜索,或者更现代的直接因果结构学习,得到一个变量间的部分因果图,再依据马尔可夫毯筛选特征。这条路线信息量最大,能告诉你变量之间谁是谁的父节点、谁是谁的子节点。但代价也很大:高维数据下独立性检验的可信度会断崖式下降,计算开销大,而且很多算法输出的图不是完全有向的,很难直接转换成特征重要性分数。

第二条路线是潜在结果框架。它是把一个特征当作“干预”,其他特征当作“需要控制的混淆”,伪标签当作“结局”,然后通过平衡混淆变量来估计该特征的处理效应。这条路线不追求恢复完整的因果图,它的产出就是每个特征的一个因果分数和显著性水平。

就无监督高维特征选择这个任务来说,第二条路线更务实。原因很简单:我们最终要的是一个Ranking,而不是一张复杂的图。潜在结果框架天然产出排序分数,而且可以和高维统计工具衔接,通过正则项控制复杂度。这篇工作最终落在潜在结果框架上,我认为是合理选择。

2.3 为什么协变量平衡适合高维无监督数据

潜在结果框架里,最核心的操作是协变量平衡。它的思想可以这样理解:如果两个样本除了处理变量不同,其他可能造成干扰的变量分布都一样,那么它们的结局差异就只能归因于处理变量。协变量平衡就是通过重新加权样本,强行把处理组和对照组在其他特征上的分布拉平。

这个思路在无监督高维场景里有三个突出好处。

第一,不依赖倾向得分模型的正确形式。传统倾向得分加权需要先建模预测每个样本被“处理”的概率,模型错了偏差就很大。协变量平衡直接优化平衡条件,相当于绕开了模型设定这一步,对高维数据的适应性强很多。

第二,可以自然地加正则。平衡权重时加入L1或L2正则,能有效防止权重膨胀,这在特征维度非常高的时候尤其重要。

第三,平均行为对伪标签噪声不敏感。伪标签必然有错,但协变量平衡关注的是两组之间的统计差异,少量的标签错误会被平均掉。我试过在伪标签里随机翻转一部分标签,只要比例不高,最终的因果分数排序依然稳定。

3. 从理论到代码:特征因果效应的估计细节

3.1 把特征选择翻译成处理效应估计

落地这个思路,第一步是把每个特征“翻译”成处理变量。对于连续性特征,我习惯用中位数把它分成高值和低值两组,得到一个二值的处理变量。为什么不直接用原始数值回归?因为在因果推断里,二值处理变量能更明确地对应“干预”语言,也方便后续做协变量平衡和显著性检验。如果特征本身是类别变量,直接使用原始类别即可,不需要再做离散化。

这里的核心表达式是:

ATE_j = E[Y | do(T_j = 1)] - E[Y | do(T_j = 0)]

其中 Y 是伪标签,T_j 是第 j 个特征的离散化处理变量。由于没有真实干预,我们无法直接观察 do 算子,于是用观测数据的加权平衡来近似:通过对样本加权,让 T_j=1 的组和 T_j=0 的组在其余特征上没有分布差异,此时两组的 Y 均值差异就可以视为该特征对数据结构的因果贡献。

需要特别注意的是,这里的 Y 在多分类聚类场景下不能直接求均值。要么把它转换成“样本属于主簇的信心分数”,要么对每个簇分别估计效应再聚合。实测下来,用属于主簇的概率作为结果变量最稳,效果比直接用簇编号回归好很多。

3.2 三种估计策略我都跑了一遍

在实现阶段,我对比了三种估计策略:倾向得分加权、熵平衡、双重稳健估计。

倾向得分加权最直观:先用逻辑回归拟合每个特征被分为高组的概率,然后以倾向得分的倒数作为样本权重,再比较两组的结果均值。优点是实现简单,跑一遍就有结果。缺点是逻辑回归模型只要有一点设定错误,偏差就会被放大;高维稀疏特征下,很多样本的倾向得分会接近0或1,权重自动爆炸。

熵平衡是另一种思路,不拟合倾向得分,而是直接求解一组样本权重,使得加权后处理组和对照组在各混淆变量上的均值、方差这些矩条件一致。它本质上是一个带矩约束的最优化问题。我在实验里最常用它,因为不需要先验设定概率模型,稳定性好得多。

双重稳健估计是把前两者组合起来:先用倾向得分加权,再同时用结果回归模型做一个残差修正。只要倾向得分模型和结果回归模型有一个是正确的,估计就是一致的。理论上最漂亮,但实现起来稍复杂,需要对每个特征分别拟合回归模型,计算成本较高。

策略优点缺点我的推荐场景
倾向得分加权简单直接,容易理解倾向模型错误时偏差大,权重易极端快速验证、特征量少
熵平衡不依赖模型设定,高维稳定需要求解最优化,特征极多时需正则高维无监督数据的主力手段
双重稳健理论性质好,容错高实现和计算成本高样本量充足、追求论文级严谨性

3.3 显著性检验与特征融合打分

只看效应大小排序是不够的。高维数据噪声大,有些特征效应值不小,但置信区间宽得能装下一整座山。所以一定要做显著性检验。

我常用的做法是置换检验:随机打乱特征和伪标签之间的对应关系,重复几百次,构造零分布,然后看真实效应值落在零分布的哪个位置,得到p值。这个方法的优势是不需要对数据分布做具体假设,适合无监督场景。如果需要控制多重比较,再对p值做一次FDR校正。

特征融合打分的公式可以写成:

score_j = rank(causal_effect_j) + alpha * rank(structure_consistency_j)

其中 causal_effect_j 是因果效应强度,structure_consistency_j 是特征在聚类结构上的保留程度。alpha 这个系数要控制得很小,比如0.1到0.2之间,否则结构项会喧宾夺主,又滑回传统的相关性选择去了。我在调参时习惯先只跑因果项,确认排序合理后再一点点加入结构项。

4. 实验怎么设计才能验证“因果”这件事

4.1 可控模拟数据生成:验证因果感知的唯一铁证

要验证方法真的学到了因果信号,最扎实的办法是造一批我们完全知道因果结构的数据。这样能精确回答一个问题:到底有没有把根因特征选出来、把混淆和效应特征丢掉。

我常用的模拟结构是四类变量:一个隐变量作为外在干扰,一个根因特征直接影响伪标签,一个效应特征是伪标签的伴随变量,一个混淆特征同时受隐变量和数据集环境影响。外加几百个纯噪声特征。

下面这个代码片段可以直接跑:

import numpy as np rng = np.random.default_rng(42) n = 2000 p_noise = 300 # 隐混淆变量 H H = rng.normal(size=(n, 1)) # 根因特征 X1:只由 H 部分影响,主要独立生成 X1 = 0.3 * H + rng.normal(size=(n, 1)) # 通过 X1 生成“真实标签” Y score = 0.8 * X1 + rng.normal(size=(n, 1)) y_true = (score > np.median(score)).astype(int) # 效应特征 X2:受 Y 影响(是结果,不是原因) X2 = 0.6 * y_true.reshape(-1, 1) + rng.normal(size=(n, 1)) # 混淆特征 X3:只受环境 H 影响,与 X1、Y 都是伪相关 X3 = 0.9 * H + rng.normal(size=(n, 1)) # 纯噪声 X_noise = rng.normal(size=(n, p_noise)) X = np.hstack([X1, X2, X3, X_noise]) feature_names = ["X1_root"] + ["X2_effect"] + ["X3_confound"] + \ [f"noise_{i}" for i in range(p_noise)]

这套数据里,真实的“因果特征集”是 X1(根因),但传统的相关性方法很容易把 X2、X3 也当成重要变量,因为它们和 X1、Y 的相关系数都挺高。如果你的方法只在 X1 上给出显著因果分数,而在 X2、X3 上不显著,那就说明因果感知机制真正生效了。

4.2 评估指标体系:别再只看NMI

评估无监督特征选择效果,最常被提到的指标是NMI和ARI。但我要说一句:在因果感知这个方向,只看NMI非常冤枉。因为聚类指标关心的是分组质量和真实标签的对齐程度,它不区分特征之间的因果关系。某些噪声特征甚至可能和伪标签碰巧构成一个能提高NMI的结构,但它没有任何机制意义。

所以至少要用三组指标看全:

指标组具体指标评估重点
因果准确性根因特征召回率、F1是否真的找回已知因果特征
聚类效果NMI、ARI、簇间分离度特征子集在无监督任务上的水平
稳定性多次抽样特征重合度、跨场景精度差异面对分布变化时的鲁棒性

其中因果召回率只有用模拟数据才能算出来,这就是可控实验不可替代的原因。稳定性方面的做法是把样本随机切成两份,分别跑一遍特征选择流程,然后计算两次选出的特征集合的Jaccard系数。这个系数高,说明方法不是碰运气,而是真正抓着稳定的机制。

4.3 一组可参考的超参设置

关于超参,我整理了一份可以直接作为起点的配置,但不建议照抄所有值,最好在自己的数据上做一轮小网格搜索。

聚类数 K:对数据做谱聚类,观察拉普拉斯矩阵特征值的下降斜率,取下降明显放缓的位置作为 K。不要拍脑袋固定 K,伪标签的簇数对因果评估影响很大。

熵平衡正则化系数 lambda:在 1e-3 到 1e-1 之间搜索。lambda 太大,协变量平衡形同虚设;太小,权重会爆炸。

特征离散化阈值:对于连续特征,用中位数分组。数据量小于五百时可以用三分位数,不过按我的经验,中位数分组的稳定性普遍更好。

显著性阈值:置换检验的 p 值取 0.05,FDR 校正后保留显著特征。如果最终选出的特征数量太少,可以放宽到 0.1,但要记得在报告里说明。

迭代轮数:默认跑十轮,连续两轮选出的特征集合重合度高于 95% 就提前停止。这个指标比固定轮数更合理。

5. 复现过程里我踩过的坑

5.1 权重爆炸与平衡失败

第一次跑熵平衡的时候,我拿到一组非常离谱的权重:某些样本的权重冲到上万,某些趋近于零。结果后续的效应估计方差巨大,特征分数完全不可信。

这个问题的根源是最优化过程为了完美满足矩约束,不惜给少量极端样本分配极端权重。解决办法有三个,我建议按顺序尝试:先对权重做区间限制,比如截断到 [0.3, 3];增加正则项,把权重的对数方差写进目标函数;如果还不收敛,就用分位点裁剪,把超过 99% 分位的权重统一缩回到该分位值。实际跑下来,正则项加权重裁剪组合最稳。

5.2 伪标签震荡

迭代到了第四轮还是第五轮,特征集突然发生一次大跳变,选出来的特征直接从三十个变成十五个,而且语义完全不搭。后来我发现这是伪标签更新引发的连锁反应:特征子集变化导致聚类结果变化,聚类结果变化又导致下一轮特征排序变化,形成震荡。

处理伪标签震荡,我试过比较有效的做法是:固定聚类数 K 绝不随意调整;前两轮不要做严格筛选,先用比较宽的阈值保留特征,等聚类结构稳定后再收紧;引入早停,连续两轮特征集合重合度超过九成直接停止,不要为了跑满迭代轮数而继续折腾。

另一个提升稳定性的思路是用集成伪标签,把多次随机初始化聚类的结果做一个投票表决,用稳定的共识标签替代一次性的聚类输出。这个方案在效果和计算成本之间比较划算。

5.3 混淆变量没控住,因果结论照样翻车

这是最容易被忽视的坑。在真实观测数据里,你无法保证所有混淆变量都被观测到,也无法保证它们都被放进平衡模型里。如果某个未观测变量同时驱动着某个特征和数据结构的走向,因果效应估计就会偏。

我在某个数据集上就遇到过这种情况:有一个环境温度变量没有被记录,但它同时影响了大批特征,导致这些特征在因果分数上的排名虚高。后来我把温度和特征之间的关联模式找出来,才意识到问题的严重性。

处理办法是给结论加一道“敏感性分析”。做法是人为构造一个未观测混淆变量,给它设定几个不同强度的影响系数,再看因果分数的排名会不会发生变化。如果排名稳定,那结论相对扎实;如果排名被扰动得很厉害,说明因果结论依赖“不存在未观测混淆”这个假设,要谨慎下判断。

5.4 高维小样本怎么办

当特征数量 p 远大于样本数量 n 时,熵平衡的矩约束条件本身就令人头疼,因为能获得自由度的样本太少了,强行平衡会把模型的方差拉到天上。

我目前比较认可的做法是两阶段策略。第一阶段用拉普拉斯得分或方差筛选,把特征压到 k 个,k 的上限取 n 的三分之一,最多不要超过三百。第二阶段对剩下的 k 个特征做因果感知评估。这样既保住了因果分析的严谨性,又不会陷入高维稀疏带来的数值灾难。

现象可能原因处理方案
权重极端矩约束过于严格权重裁剪 + 正则项
伪标签震荡聚类数波动或特征集突变固定K + 集成标签 + 早停
因果排名虚高未观测混淆敏感性分析验证结论
高维不收敛p 远大于 n两阶段筛选,上限 min(300, n/3)

6. 应用场景与落地边界

6.1 三处最值得用的场景

第一处是探索性科研场景,典型代表是基因表达数据和脑影像数据。这类数据天然没有可靠的标签,研究者想在几千个变量里找出少数几个和某种生理过程真正相关的维度。传统方法给出的是“相关性最强的一批基因”,因果感知给出的是“在机制层面最值得优先验证的一批基因”。两者在生产效率上的差别很大。

第二处是跨批次稳定性要求高的工业场景。我之前处理过的设备监测数据,目标是从大量传感器通道里挑出一组在不同批次、不同现场都能稳定工作的特征,用于无监督状态分簇。因果感知在这类任务里的价值不是提高某个离线指标,而是让特征子集在批次切换时不崩。

第三处是可解释性要求高的运营分析。比如被要求从匿名客户行为数据里挑出“跟风险最相关”的维度,因果感知筛出来的特征能补充一句更有说服力的解释:某些特征的效应在控制了其他因素后依然存在。虽然不能断言绝对因果,但它比单纯的相关性证据强得多。

6.2 不建议硬套的场景

因果感知不是万能的。在三种场景里,我一般会劝人绕道。

第一种是环境变化极其剧烈、连因果机制本身都在改变的动态系统。如果数据生成的底层结构会随外部条件发生本质变化,任何基于静态观测的方法都很难给出可靠答案,这时候应该去考虑在线学习和时序状态建模。

第二种是特征缺失率极高的数据集。因果效应估计非常依赖特征之间的联合分布,缺失太多相当于揉碎了一张完整地图,硬补出来的特征关系大多是噪声。

第三种是高质量标签充分、样本量也充足的场景。如果有可靠标签,直接用有监督的因果特征选择方法,效果通常比先做无监督聚类、再用伪标签绕一圈要好得多。伪标签再准也是代理,能用真标签就不需要走弯路。

6.3 工程化改造的几点想法

把论文里的方法落到工程流程里,我一般会做三处调整。

第一,用深度聚类替代谱聚类来生成伪标签。深度聚类在高维非结构化数据上往往能得到比传统谱聚类更好的簇结构,伪标签质量提高,因果分数的可信度也会跟着提高。代价是引入了深度模型的稳定性和训练开销问题。

第二,增加环境不变性约束。如果数据里有可用的批次或场景标签,可以额外要求“特征在每一个场景下的因果效应方向一致”。这个约束能进一步抑制那些只在特定环境下有效的伪因果特征,最终选出的特征子集在跨场景测试里会更稳。

第三,特征数量要和下游任务一起定,而不是先选完再想怎么用。因果分数排在前面的特征当然重要,但下游分类器、聚类算法对特征数量的敏感度不同,实际落地时我会把特征数量当成超参,在因果分数的Top10到Top100之间做搜索。

我实际跑下来的体会是,因果感知方法不是要给你一个“绝对因果”的承诺,它是在无监督条件下用一个更严格的筛选器替代相关矩阵。它真正的价值在于把那些靠混淆关系存活的伪相关特征剔除掉,把能经得起子群变换检验的特征留下来。最后再分享一个小技巧:如果真实数据上没办法做精确的模拟验证,至少做一个“子群体稳定性检验”,把样本按某个无关属性分成两份,分别跑特征选择流程,算特征集合的重合度。重合度明显偏低的那几维特征,哪怕因果分数再高,也别急着采用。这个检验成本极低,却能在你拿因果结论去向业务方解释之前,提前帮你挡住一次翻车。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询