做特征选择做到一定程度很多人都会碰到同一个尴尬局面离线评测指标都挺漂亮一换数据来源、一换批次之前精心挑出来的特征组合就明显掉链子。问题往往不在模型过拟合而是你选的特征本质上只是“跟目标变量长得像”并不是“驱动目标变量发生变化的那些因素”。最近我在看一篇题为《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_j1 的组和 T_j0 的组在其余特征上没有分布差异此时两组的 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] \ [fnoise_{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.05FDR 校正后保留显著特征。如果最终选出的特征数量太少可以放宽到 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之间做搜索。我实际跑下来的体会是因果感知方法不是要给你一个“绝对因果”的承诺它是在无监督条件下用一个更严格的筛选器替代相关矩阵。它真正的价值在于把那些靠混淆关系存活的伪相关特征剔除掉把能经得起子群变换检验的特征留下来。最后再分享一个小技巧如果真实数据上没办法做精确的模拟验证至少做一个“子群体稳定性检验”把样本按某个无关属性分成两份分别跑特征选择流程算特征集合的重合度。重合度明显偏低的那几维特征哪怕因果分数再高也别急着采用。这个检验成本极低却能在你拿因果结论去向业务方解释之前提前帮你挡住一次翻车。