【机器学习笔记 Ⅲ】4 特征选择
特征选择(Feature Selection)系统指南
特征选择是机器学习中优化模型性能的关键步骤,通过筛选最相关、信息量最大的特征,提高模型精度、降低过拟合风险并加速训练。以下是完整的特征选择方法论:
1. 特征选择的核心目标
- 提升模型性能:去除噪声和冗余特征,增强泛化能力。
- 降低计算成本:减少训练和预测时间。
- 增强可解释性:简化模型,便于业务理解。
2. 特征选择方法分类
(1) 过滤法(Filter Methods)
原理:基于统计指标评估特征与目标的相关性,独立于模型。
优点:计算高效,适合高维数据。
常用技术:
- 数值特征:
- 皮尔逊相关系数(线性关系):
import pandas as pd corr = df.corr()['target'].abs().sort_values(ascending=False)
- 互信息(非线性关系):
from sklearn.feature_selection import mutual_info_classif mi = mutual_info_classif(X, y)
- 皮尔逊相关系数(线性关系):
- 分类特征:
- 卡方检验(Chi-Square):
from sklearn.feature_selection import chi2 chi2_scores, _ = chi2(X, y)
- ANOVA F值(方差分析):
from sklearn.feature_selection import f_classif f_scores, _ = f_classif(X, y)
- 卡方检验(Chi-Square):
筛选阈值示例:
selected_features = corr[corr > 0.3].index.tolist()
(2) 包裹法(Wrapper Methods)
原理:通过模型性能迭代选择特征子集。
优点:考虑特征交互,效果通常更好。
常用技术:
- 递归特征消除(RFE):
from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression rfe = RFE(estimator=LogisticRegression(), n_features_to_select=10) rfe.fit(X, y) selected_features = X.columns[rfe.support_]
- 顺序特征选择(SFS):
from mlxtend.feature_selection import SequentialFeatureSelector sfs = SequentialFeatureSelector(estimator=RandomForestClassifier(),k_features=10,forward=True) # 前向或后向选择 sfs.fit(X, y)
(3) 嵌入法(Embedded Methods)
原理:模型训练过程中自动选择特征。
优点:平衡效率与效果。
常用技术:
- L1正则化(Lasso):
from sklearn.linear_model import Lasso lasso = Lasso(alpha=0.1).fit(X, y) selected_features = X.columns[lasso.coef_ != 0]
- 树模型特征重要性:
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier().fit(X, y) importance = rf.feature_importances_ selected_features = X.columns[importance > np.mean(importance)]
3. 高级技术与自动化工具
(1) 特征重要性可视化
import matplotlib.pyplot as plt
plt.barh(X.columns, rf.feature_importances_)
plt.title("Feature Importance")
plt.show()
(2) 自动化特征选择库
- Feature-engine:
from feature_engine.selection import DropCorrelatedFeatures selector = DropCorrelatedFeatures(threshold=0.8) X_train = selector.fit_transform(X_train)
- Boruta(基于阴影特征):
from boruta import BorutaPy boruta = BorutaPy(estimator=RandomForestClassifier(), n_estimators='auto', verbose=2) boruta.fit(X.values, y.values) selected_features = X.columns[boruta.support_]
4. 领域驱动的特征选择
- 业务知识优先:例如金融风控中,人工筛选与欺诈强相关的特征(如交易频率、金额突增)。
- 特征工程结合:
- 创建衍生特征(如“最近7天登录次数”)。
- 分箱处理(将连续年龄分为“青年/中年/老年”)。
5. 验证与迭代
- 交叉验证评估:对比特征选择前后的模型性能(如AUC、F1)。
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X_selected, y, cv=5, scoring='roc_auc')
- 稳定性检查:多次运行特征选择,观察高频被选中的特征。
6. 常见陷阱与解决方案
问题 | 解决方案 |
---|---|
数据泄漏 | 仅在训练集上计算统计量,避免使用测试集信息 |
高基数分类特征 | 使用目标编码或嵌入表示 |
特征间多重共线性 | 移除相关系数>0.8的特征或使用PCA降维 |
7. 总结与最佳实践
- 流程建议:
- 先过滤法快速降维 → 嵌入法优化 → 包裹法精细调优(计算资源允许时)。
- 关键原则:
- 少而精:优先选择10-20个高价值特征。
- 可解释性:确保业务方理解最终特征。
- 工具链:
通过系统化的特征选择,可显著提升模型效率与效果。实际应用中需结合数据特性和业务需求灵活调整方法。