怅然|不容忽视!机器学习中的特征选择初探【sklearn实战】

一、特征选择的重要性机器学习过程中 , 特征选择是非常重要的一步 。 可以说 , 选到了合适的特征 , 那么模型的训练就成功了一半 。
一方面 , 遗漏掉重要特征肯定是我们无法接受的 , 这会导致我们的模型拟合能力不足;另一方面冗余特征也可能会造成严重的后果 , 比如:

  • 带来额外的计算量 , 导致训练时间过长;
  • 模型过拟合 , 对新样本泛化能力不足;
  • 模型可读性(解释性)差 。

怅然|不容忽视!机器学习中的特征选择初探【sklearn实战】所谓大浪淘沙始见金 , 在训练模型的过程中 , 我们不光要考虑模型、参数等的选择与调优 , 还要花足够的时间来选取合适的特征 。
二、特征选择的方法在现在的业界共识中 , 特征选择方法基本上可以归类为三种:过滤法、包裹法和嵌入法 。
1. 过滤法
过滤法最好理解 , 就是通过一定的统计测量方法对每个特征进行评分和排序 , 然后按照一定的标准过滤出最优的特征子集 。 过滤法不用考虑后续的学习器 , 因此计算性能比较好 。
2. 包裹法
包裹法的开销会大一些 , 效果一般也更好一些 , 因为这种方法是针对特定的模型量身定制的 。 使用包裹法时 , 要先确定准备采纳的学习器(模型) , 然后使用该学习器的性能指标作为特征子集的评价准则 。 也就是说 , 包裹法的目标就是为了给特定学习器选择最有利于其性能的特征子集 。
3. 嵌入法
嵌入法则更进一步 , 将特征选择和学习器(模型)训练的过程合二为一 , 在训练的过程中自动完成了特征选择 。
三、scikit-learn中的特征选择下边两张图罗列了scikit-learn中提供的一些特征选择的方法 , 我先来为大家简单介绍一下 。
  • 方差阈值法隶属于过滤法 , 这种方法最为简单 , 但其效果并不是十分稳定、可靠 。 这种方法认为低方差的特征所蕴含的信息量较少 , 应该丢弃;而高方差的特征蕴含信息较多 , 应予以保留 。 但是在实践过程中 , 我们会经常遇到删除了低方差的特征 , 但是模型性能不升反降的情况 。 因此这种方法仅适用于作为一个探索性的选择;
  • sklearn中提供了一系列用于单变量选择的方法 , 这些方法的原理是根据某些特定的统计指标来分别评测每一个特征 , 并根据得分、排序或者p-value来完成筛选 。 根据IV、AUC、相关系数等来进行特征选择的方法需要我们自己来实现 , sklearn中并没有现成的工具可用(不用担心 , 我会教大家的);
  • sklearn中也提供了包裹式的特征选择方法 , 比如SelectFromModel、RFE(递归消除法)、RFECV(RFE的交叉验证版) , 它们都需要我们指定一个评估器(estimator , 比如LogisticRegression) , 然后针对这个评估器 , 它们会自动选择最佳的特征子集 。
  • sklearn中也有嵌入式的特征选择方法 , 如RandomizedLasso、RandomizedLogisticRegression等 , 它们在模型训练的过程中会自动完成特征选择的过程 。
后续我们会详细探讨它们各自的原理、实践等更多细节 , 今天我们就拿最简单的方差阈值法来为大家演示一下特征选择的过程 。
怅然|不容忽视!机器学习中的特征选择初探【sklearn实战】
怅然|不容忽视!机器学习中的特征选择初探【sklearn实战】四、一个方差阈值法的简单例子我们以sklearn中的iris数据集为例 , 该数据集一共有4个特征 。 我们使用numpy.var()方法来计算每个特征的方差并打印出来 , 并且通过数据的.shape属性来获取特征数 。


推荐阅读