目录
特征筛选算法笔记
一、方差筛选 (Variance Threshold)
1.1 基本原理
1.2 实现代码
1.3 注意事项
二、皮尔逊相关系数筛选
2.1 基本原理
2.2 实现代码
2.3 优缺点
三、Lasso回归筛选
3.1 基本原理
3.2 实现代码
3.3 参数选择
四、树模型特征重要性
4.1 基本原理
4.2 实现代码
4.3 注意事项
五、SHAP重要性
5.1 基本原理
5.2 实现代码
5.3 高级应用
六、递归特征消除(RFE)
6.1 基本原理
6.2 实现代码
6.3 变体方法
七、方法对比与选型指南
7.1 方法对比表
7.2 选型决策树
八、实战建议
8.1 组合策略
8.2 评估方法
8.3 自动化工具
特征筛选算法笔记
一、方差筛选 (Variance Threshold)
1.1 基本原理
-
移除方差低于阈值的特征
-
假设:低方差特征包含信息量少
-
适用于:数值型特征
1.2 实现代码
from sklearn.feature_selection import VarianceThresholdselector = 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 RandomForestClassifierrf = 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 LogisticRegressionestimator = 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_scoredef 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())
])
通过系统掌握这些特征筛选方法:
-
有效降低数据维度
-
提升模型训练效率
-
增强模型可解释性
-
发现关键业务特征
@浙大疏锦行