python打卡 DAY 19 常见的特征筛选算法
取值范围:[-1, 1],绝对值越大相关性越强。基于决策树的特征分裂增益评估重要性。常用模型:随机森林、XGBoost。:对候选特征集使用RFE/SHAP。:正则化强度(越大选择特征越少)计算特征与目标变量的线性相关性。优势:捕捉非线性关系和交互作用。:使用方差筛选去除明显无关特征。假设:低方差特征包含信息量少。可能误删重要但取值稳定的特征。:交叉验证自动确定最优特征数。适用于:高维数据,线性关系
目录
特征筛选算法笔记
一、方差筛选 (Variance Threshold)
1.1 基本原理
-
移除方差低于阈值的特征
-
假设:低方差特征包含信息量少
-
适用于:数值型特征
1.2 实现代码
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1) # 移除方差<0.1的特征
X_high_variance = selector.fit_transform(X)
# 查看被保留的特征
selected_features = X.columns[selector.get_support()]
print(f"保留特征数: {len(selected_features)}")
1.3 注意事项
-
需先进行特征标准化(避免量纲影响)
-
对二值特征设置
threshold=0.8*(1-0.8) -
可能误删重要但取值稳定的特征
二、皮尔逊相关系数筛选
2.1 基本原理
-
计算特征与目标变量的线性相关性
-
取值范围:[-1, 1],绝对值越大相关性越强
-
公式:

2.2 实现代码
import pandas as pd
# 计算相关系数
correlations = X.corrwith(y).abs().sort_values(ascending=False)
# 选择前k个特征
top_k = 10
selected_features = correlations[:top_k].index
X_selected = X[selected_features]
2.3 优缺点
-
优点:计算高效,结果易解释
-
缺点:
-
只能检测线性关系
-
忽略特征间交互作用
-
对异常值敏感
-
三、Lasso回归筛选
3.1 基本原理
-
使用L1正则化使部分系数归零
-
适用于:高维数据,线性关系
-
目标函数:

3.2 实现代码
from sklearn.linear_model import LassoCV
# 使用交叉验证选择最佳alpha
lasso = LassoCV(cv=5, random_state=42)
lasso.fit(X, y)
# 获取非零系数特征
selected_features = X.columns[lasso.coef_ != 0]
print(f"Lasso选择特征数: {len(selected_features)}")
3.3 参数选择
-
alpha:正则化强度(越大选择特征越少) -
建议使用
LassoCV自动优化alpha
四、树模型特征重要性
4.1 基本原理
-
基于决策树的特征分裂增益评估重要性
-
常用模型:随机森林、XGBoost
-
两种评估方式:
-
Gini重要性:基于不纯度减少
-
Permutation重要性:基于随机置换后的精度下降
-
4.2 实现代码
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)
# 获取特征重要性
importances = pd.Series(rf.feature_importances_, index=X.columns)
top_features = importances.sort_values(ascending=False)[:10]
# 可视化
top_features.plot(kind='barh')
plt.title('Top 10 Important Features')
plt.show()
4.3 注意事项
-
可能偏向高基数特征
-
不同模型的重要性不可直接比较
-
建议多次运行观察稳定性
五、SHAP重要性
5.1 基本原理
-
基于博弈论的Shapley值
-
量化每个特征对预测的贡献度
-
优势:捕捉非线性关系和交互作用
5.2 实现代码
import shap
# 创建解释器
explainer = shap.Explainer(rf)
shap_values = explainer(X)
# 全局重要性
shap.plots.bar(shap_values)
# 获取重要性值
shap_importance = pd.DataFrame({
'features': X.columns,
'importance': np.abs(shap_values.values).mean(axis=0)
}).sort_values('importance', ascending=False)
5.3 高级应用
-
分析特征交互作用:
shap_interaction_values() -
识别样本级特征贡献:
force_plot()
六、递归特征消除(RFE)
6.1 基本原理
-
训练模型并获取特征重要性
-
移除最不重要特征
-
重复直到达到指定特征数
-
适用于:中小规模数据集
6.2 实现代码
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
estimator = LogisticRegression(max_iter=1000)
selector = RFE(estimator, n_features_to_select=10, step=1)
selector.fit(X, y)
# 查看选择结果
selected_features = X.columns[selector.support_]
print(f"RFE选择特征: {list(selected_features)}")
6.3 变体方法
-
RFECV:交叉验证自动确定最优特征数
from sklearn.feature_selection import RFECV rfecv = RFECV(estimator, cv=5) rfecv.fit(X, y)
七、方法对比与选型指南
7.1 方法对比表
| 方法 | 适用场景 | 是否监督 | 计算成本 | 主要优势 |
|---|---|---|---|---|
| 方差筛选 | 预处理阶段 | 无 | 低 | 快速去除低信息量特征 |
| 皮尔逊相关 | 线性关系 | 有 | 低 | 结果直观易解释 |
| Lasso | 高维线性数据 | 有 | 中 | 内置特征选择 |
| 树模型重要性 | 非线性关系 | 有 | 中高 | 捕捉复杂模式 |
| SHAP | 模型解释 | 有 | 高 | 细粒度贡献分析 |
| RFE | 中小规模数据 | 有 | 高 | 系统性特征淘汰 |
7.2 选型决策树
八、实战建议
8.1 组合策略
-
预处理阶段:使用方差筛选去除明显无关特征
-
初步筛选:结合皮尔逊和树模型重要性
-
精细筛选:对候选特征集使用RFE/SHAP
-
最终验证:比较不同特征集的模型表现
8.2 评估方法
from sklearn.model_selection import cross_val_score
def evaluate_features(X_selected):
model = RandomForestClassifier()
scores = cross_val_score(model, X_selected, y, cv=5, scoring='f1')
return np.mean(scores)
# 比较不同特征集
score_full = evaluate_features(X)
score_selected = evaluate_features(X_selected)
print(f"全特征F1: {score_full:.3f}, 筛选后F1: {score_selected:.3f}")
8.3 自动化工具
from sklearn.pipeline import Pipeline
from sklearn.feature_selection import SelectFromModel
# 自动化特征选择流水线
pipe = Pipeline([
('scaler', StandardScaler()),
('selector', SelectFromModel(RandomForestClassifier())),
('classifier', LogisticRegression())
])
通过系统掌握这些特征筛选方法:
-
有效降低数据维度
-
提升模型训练效率
-
增强模型可解释性
-
发现关键业务特征
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐




所有评论(0)