在数据预处理过程中,特征选择是一个重要的过程,选择出重要的特征可以加快模型训练速度。通常可以从以下两方面来选择特征:
1.特征是否发散(对于样本区分作用的大小)
2.特征与标签的相关性
特征选择的方法主要有3种:
1.Filter Method:先根据统计量设置阈值选择特征,之后再训练模型。
2.Wrapper Method:把最终将要使用的模型的性能作为特征子集的评价标准,多次训练模型选择有利于模型性能的特征子集。
3.Embedding Method:将特征选择过程与模型训练过程融为一体,在模型训练的过程中自动进行特征选择。
常用sklearn中的feature_selection库来进行特征选择。
1. Fliter 过滤法:
Fliter的优点在于只训练一次模型,速度快。但是选择与标签相关性最强的特征子集不一定是最佳特征,甚至可能对结果负优化。
1.1 方差选择法
计算各个特征的方差,设置阈值,选择方差大于阈值的特征。
1 | from sklearn.feature_selection import VarianceThreshold |
1.2 Pearson相关系数法
计算各个特征对于标签的Pearson相关系数和p值,选择前k名的特征。
1 | from sklearn.feature_selection import SelectKBest |
Pearson法的缺陷在于只对线性相关敏感,对非线性关系不敏感。
1.3 卡方检验\互信息法等方法
也是用来评价X与y的相关性,先构建评价函数,再选择前K名的特征。
1 | #chi2 |
2. Wrapper 包装法:
Wrapper的优点在于能够识别模型最适宜的特征子集,缺点在于训练多次模型,算法复杂性高,且特征子集不一定是大多数解释变量。
Wrapper最具代表性的方法就是RFE递归消除特征法,即使用一个基模型来进行多轮训练,每轮训练都遍历所有特征,之后消除重要性(feature_importances_)低的特征,再基于新的特征集进行下一轮训练。
1 | #RFE |
3. Embedded 嵌入法
3.1 基于惩罚项的特征选择法
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。由于L1正则化会产生稀疏权值矩阵,所以其自带特征选择的特性。
1 | #L1正则 |
3.2 基于树模型的特征选择法
树模型中GBDT也可用来作为基模型进行特征选择。
1 | from sklearn.feature_selection import SelectFromModel |
4. 基于SHAP值的特征筛选
SHAP是由Shapley value启发的可加性解释模型。对于每条样本,每个特征都会对应一个SHAP value值体现其对结果的贡献。
1 | import shap |
5. 基于对抗验证(Adversarial Validation)的特征筛选
常用于训练集与测试集相差非常大的情况。实现步骤:
1.将训练集和测试集合并,分别打上0和1的标签。
2.构建模型进行训练,逐个将特征输入模型,记录AUC。
3.最后将AUC高的特征删除(将测试和训练样本差别很大的特征删除),通过删掉这些特征实现模型效果提升。