Math-02.相关性检验-20.特征选择中的相关

特征选择(feature selection)中,相关分析常作为 Filter 方法的第一步:保留与标签/表型相关、且彼此低冗余的属性。本篇衔接 05 偏相关与矩阵 与存量 相关分析-相关系数,并对接蛋白 ML 实践(如 酶改造-06)。

段末注释Filter 指先用统计量(如 $|r|$)筛特征,再训练模型;与 Wrapper、Embedded 方法并列。

系列01 总论 | 多重比较:Math-01-20


1. 属性 vs 特征(D1)

图 1 属性到特征

概念 含义
属性 数据集每一列(原始变量)
特征 对预测/分类有益的属性子集

相关 Filter:$|r(X_j, Y)|$ 大 → $X_j$ 更可能为特征;$|r(X_i,X_j)|$ 过大 → 冗余,可删其一。


2. Filter 流程(D2–D3)

图 2 相关 Filter 流程

1
2
3
4
5
6
原始 p 个属性
↓ (1) 与标签 Y 的相关 + p 值 / FDR
保留 |r| > θ 或 q < 0.05 的 m 个
↓ (2) 特征间 |r| > ρ_redundant(如 0.9)
剔除冗余,得 k 个特征
↓ (3) 下游模型(回归/分类)

Y 类型

  • 连续表型(酶活、$\log_{10}(\mathrm{activity}/\mathrm{WT})$)→ Pearson / Spearman
  • 二分类(高/低活性)→ 点二列 / Phi
  • 多分类 → Cramér’s V / ANOVA $\eta^2$

3. 共线性与 VIF(D4)

指标 含义 阈值经验
$ r_{X_i,X_j} $
VIF(variance inflation factor) 回归中 $X_i$ 被其余 $X$ 解释程度 $>5\sim10$ 警告

VIF$_i = 1/(1-R_i^2)$,$R_i^2$ 为 $X_i$ 对其余自变量回归的 $R^2$。


4. 适用场景(D5–D7)

图 3 适用场景

场景 做法
biomarker 初筛 $
PLM 嵌入维度 嵌入列与活性 Spearman
多组学冗余 相关矩阵聚类去冗余
酶改造 ML 酶改造-06 表征质控配合

5. 局限与误用(D8)

图 4 局限与误用

误用 后果
全数据做相关再划分 train/test 数据泄漏
只 Filter 不验证模型 漏非线性特征
不 FDR 高维假阳性
$ r
相关特征当因果 错误生物学解读

正确做法:在训练集内算 $r$、选特征;测试集仅评估最终模型。


6. 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import numpy as np
import pandas as pd
from scipy import stats
from statsmodels.stats.multitest import multipletests
from sklearn.model_selection import train_test_split

rng = np.random.default_rng(42)
n, p = 120, 50
X = rng.normal(0, 1, (n, p))
# 仅 3 个与 Y 真相关
beta = np.zeros(p)
beta[[2, 7, 15]] = [1.2, -0.9, 0.7]
Y = X @ beta + rng.normal(0, 0.5, n)

X_tr, X_te, y_tr, y_te = train_test_split(X, Y, test_size=0.25, random_state=0)

# Step 1: 与 Y 的 |r| + FDR(仅在 train)
pvals, rs = [], []
for j in range(p):
r, pval = stats.pearsonr(X_tr[:, j], y_tr)
rs.append(abs(r))
pvals.append(pval)
reject, qvals, _, _ = multipletests(pvals, alpha=0.05, method="fdr_bh")
selected = np.where(reject)[0]
print(f"FDR selected {len(selected)} features, true idx in:", set([2,7,15]) & set(selected))

# Step 2: 冗余剔除(train 内相关矩阵)
def drop_redundant(X_sub, idx, thresh=0.9):
keep = []
for j in idx:
if not keep:
keep.append(j); continue
corr_ok = all(abs(stats.pearsonr(X_sub[:, j], X_sub[:, k])[0]) < thresh for k in keep)
if corr_ok:
keep.append(j)
return keep

final_idx = drop_redundant(X_tr, selected, thresh=0.85)
print("after redundancy removal:", final_idx)

# 简单验证:用选中列做线性回归 R²
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
lr = LinearRegression().fit(X_tr[:, final_idx], y_tr)
print(f"test R2={r2_score(y_te, lr.predict(X_te[:, final_idx])):.3f}")

7. 小结

  • Filter 特征选择:标签相关(+FDR)→ 特征间去冗余 → 下游建模。
  • 必须在训练集内完成;共线性用 $|r|$ 或 VIF 诊断。
  • 与 Wrapper(RFE)、Embedded(Lasso)可串联,相关 Filter 成本低、可解释。

系列导航05 偏相关 | 10 分类相关 | 00 规划


参考文献

  1. Guyon I., Elisseeff A. An Introduction to Variable and Feature Selection. JMLR 2003.
  2. sklearn.feature_selection
-------------本文结束感谢您的阅读-------------