特征选择方法
过滤法(方差、相关性)、封装法(RFE)和嵌入法(L1 正则化)
特征选择方法 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
为何要选择特征
特征选择只保留最有用的列。特征更少意味着训练更快、过拟合更少,也更容易解释。移除噪声通常还能提升准确率。
三类方法
选择方法分为三组:
- 过滤式根据统计量对特征进行排序(速度快,不依赖模型)
- 包裹式通过训练模型搜索特征子集(速度慢,但准确)
- 嵌入式在模型拟合过程中完成选择
VarianceThreshold
最简单的过滤方法:VarianceThreshold 会删除方差低于截断值的特征。近似恒定的列不包含任何信息。
from sklearn.feature_selection import VarianceThreshold
sel = VarianceThreshold(threshold=0.01)
X_reduced = sel.fit_transform(X)
print("Kept:", X_reduced.shape[1], "of", X.shape[1])使用 f_classif 的 SelectKBest
SelectKBest 会保留得分最高的 K 个特征。结合 f_classif 时,它会使用 ANOVA F 检验,衡量每个特征与类别标签的关联强度。
from sklearn.feature_selection import SelectKBest, f_classif
sel = SelectKBest(score_func=f_classif, k=10)
X_best = sel.fit_transform(X, y)
print(sel.get_support(indices=True))互信息
mutual_info_classif 会衡量特征与目标之间的任意依赖关系,包括非线性依赖。与 F 检验不同,它能够捕捉 ANOVA 无法发现的非线性关系。
from sklearn.feature_selection import SelectKBest, mutual_info_classif
sel = SelectKBest(score_func=mutual_info_classif, k=10)
X_mi = sel.fit_transform(X, y)f_classif 与 mutual_info 的对比
f_classif 速度快,可以检测线性关系;mutual_info_classif 速度较慢,但能够捕捉非线性关系。如果您怀疑存在复杂关系,应优先使用互信息。
import numpy as np
from sklearn.feature_selection import f_classif, mutual_info_classif
f_scores, _ = f_classif(X, y)
mi_scores = mutual_info_classif(X, y)
print("F-test top:", np.argsort(f_scores)[::-1][:5])
print("MI top:", np.argsort(mi_scores)[::-1][:5])递归特征消除
RFE 是一种包裹式方法:它先训练模型,移除最弱的特征,然后重复这一过程。它利用模型自身的重要性信号对特征进行排序。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
rfe = RFE(estimator=LogisticRegression(max_iter=1000), n_features_to_select=10)
rfe.fit(X, y)
print(rfe.support_)RFECV:自动选择特征数量
RFECV 为 RFE 增加了交叉验证,因此它会根据验证分数找到最佳的特征数量,而不是依赖固定猜测。
from sklearn.feature_selection import RFECV
from sklearn.ensemble import RandomForestClassifier
rfecv = RFECV(
estimator=RandomForestClassifier(),
cv=5,
scoring="accuracy",
)
rfecv.fit(X, y)
print("Optimal features:", rfecv.n_features_)使用套索回归的 SelectFromModel
嵌入式选择:套索回归(L1)会将不重要的系数压缩到恰好为零。SelectFromModel 随后只保留非零系数对应的特征。
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso
sel = SelectFromModel(Lasso(alpha=0.01))
sel.fit(X, y)
X_lasso = sel.transform(X)
print("Kept:", X_lasso.shape[1])使用树模型重要性的 SelectFromModel
SelectFromModel 也适用于任何提供 feature_importances_ 的估计器,例如随机森林。可以设置 threshold,如 "mean" 或 "median"。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
sel = SelectFromModel(
RandomForestClassifier(n_estimators=200),
threshold="median",
)
sel.fit(X, y)选择合适的方法
先使用廉价的过滤方法(VarianceThreshold、SelectKBest)删除明显无用的特征。使用嵌入式的 SelectFromModel 可以取得良好平衡。只有在准确率最重要且计算资源允许时,才使用 RFECV。
快速检查
测试您对特征选择的掌握情况。
总结
总结:特征选择包括过滤式方法(VarianceThreshold、使用 f_classif 或 mutual_info_classif 的 SelectKBest)、包裹式方法(RFECV)和嵌入式方法(使用套索回归或树模型重要性的 SelectFromModel)。过滤方法速度最快;RFECV 最准确。对于非线性关系,应使用互信息。
常见问题解答
「特征选择方法」课时是免费的吗?
是的 — 「特征选择方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「特征选择方法」这节课中我会学到什么?
过滤法(方差、相关性)、封装法(RFE)和嵌入法(L1 正则化) 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「特征选择方法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。