如何进行特征选择,避开那些机器学习的“坑”!

点击上方关注,All in AI中国

使用特征选择实现高效的机器学习工作流程

如何进行特征选择,避开那些机器学习的“坑”!

特征选择是查找和选择数据集中最有用特征的过程,是机器学习管道的关键步骤。不必要的功能降低了训练速度,降低了模型的可解释性,并且最重要的是降低了测试集的泛化性能。

受特殊功能选择方法的困扰,我发现自己在机器学习问题上反复应用这些方法,我在GitHub(https://github.com/WillKoehrsen/feature-selector)上为Python中的特征选择构建了一个类。包含一些最常见的特征选择方法:

  1. 缺少值的百分比高的特征
  2. 共线(高度相关)特征
  3. 在基于树的模型中不重要性的特征
  4. 低重要性的特征
  5. 具有单一独特价值的功能

在本文中,我们将介绍在示例机器学习数据集上使用特征选择。我们将看到它如何让我们快速实施这些方法,从而实现更高效的工作流程。

示例数据集

在这个例子中,我们将使用Kaggle的Home Credit Default Risk机器学习竞赛中的一个数据样本。 (要开始比赛,请参阅此文章(https://medium.com/m/global-identity?redirectUrl=https://towardsdatascience.com/machine-learning-kaggle-competition-part-one-getting-started-32fb9ff47426))。整个数据集可供下载,在这里我们将使用一个样本进行说明。

如何进行特征选择,避开那些机器学习的“坑”!

竞争是一个监督分类问题,这是一个很好的数据集,因为它有许多缺失值,众多高度相关的(共线)特征,以及一些无助于机器学习模型的不相关特征。

创建一个实例

要创建FeatureSelector类的实例,我们需要传入一个结构化数据集,其中包含列中行和特征的观察值。我们可以仅使用一些功能的方法,但基于重要性的方法也需要训练标签。由于我们有监督分类任务,因此我们将使用一组功能和一组标签。

方法

它有五种方法来查找要移除的功能。我们可以访问任何已识别的功能并手动从数据中删除它们,或使用功能选择器中的删除功能。

在这里,我们将通过每种识别方法,展示如何全部运行5次。 FeatureSelector还具有多种绘图功能,因为视觉检查数据是机器学习的关键组件。

缺少值

查找删除要素的第一种方法很简单:找到缺少高于指定阈值的部分缺失值的要素。以下调用识别缺失值超过60%的特征(输出为粗体)。

如何进行特征选择,避开那些机器学习的“坑”!

我们可以在数据框的每一列中看到缺失值的一小部分:

如何进行特征选择,避开那些机器学习的“坑”!

如何进行特征选择,避开那些机器学习的“坑”!

要查看确定要删除的功能,我们访问FeatureSelector的ops属性,这是一个Python字典,其中的值为列表中的功能。

如何进行特征选择,避开那些机器学习的“坑”!

最后,我们绘制了所有特征中缺失值的分布图:

如何进行特征选择,避开那些机器学习的“坑”!

如何进行特征选择,避开那些机器学习的“坑”!

共线特征

共线特征是相互高度相关的特征。在机器学习中,由于方差高和模型可解释性低,导致测试集上泛化性能下降。

identify_collinear方法根据指定的相关系数值查找共线特征。对于每对相关特征,它标识出要删除的特征(因为我们只需要删除一个特征):

如何进行特征选择,避开那些机器学习的“坑”!

我们可以使用相关性制作一个简洁的可视化图,它是一个热度图。这显示了在阈值以上至少有一个相关性的所有特征:

如何进行特征选择,避开那些机器学习的“坑”!

如何进行特征选择,避开那些机器学习的“坑”!

像以前一样,我们可以访问将被删除的整个关联特征列表,或者查看数据框中高度相关的特征对。

如何进行特征选择,避开那些机器学习的“坑”!

如果我们想调查我们的数据集,我们还可以通过将plot_all = True传递给调用来绘制数据中所有相关性的图:

如何进行特征选择,避开那些机器学习的“坑”!

如何进行特征选择,避开那些机器学习的“坑”!

重要性为零的特征

前两种方法可以应用于任何结构化数据集,并且是确定性的,每次对于给定的阈值,结果都是相同的。下一个方法仅针对监督机器学习问题而设计,其中我们有训练模型的标签并且是非确定性的。 identify_zero_importance函数根据梯度提升机器(GBM)学习模型查找具有零重要性的特征。

使用基于树的机器学习模型(例如增强型合奏),我们可以找到特征重要性。重要性的绝对值并不像相对值那么重要,我们可以用它来确定任务的最相关特征。我们还可以通过删除零重要性功能来使用功能重要性进行功能选择。在基于树的模型中,重要性为零的特征不用于分割任何节点,因此我们可以在不影响模型性能的情况下将其删除。

FeatureSelector使用LightGBM库中的梯度提升机器查找要素重要性。特征重要性在GBM的10次训练运行中进行平均以减少差异。此外,该模型通过使用验证集提前停止(有一个选项可以关闭此功能)来训练,以防止过度训练数据。

下面的代码调用方法并提取零重要性功能:

如何进行特征选择,避开那些机器学习的“坑”!

这次我们得到了两个plot_feature_importances的图:

如何进行特征选择,避开那些机器学习的“坑”!

在左边,我们有plot_n最重要的特征(根据标准化重要性绘制,其中总和为1)。 在右侧,我们对功能数量具有累积重要性。 垂直线绘制在累积重要性的阈值处,在这种情况下为99%。

如何进行特征选择,避开那些机器学习的“坑”!

对于基于重要性的方法,需要记住两点:

  • 训练梯度提升机器是随机的,意味着每次模型运行时,要素重要性都会发生变化

这应该不会产生重大影响(最重要的功能不会突然变得至少),但它会改变某些功能的排序。 它也会影响识别的零重要性特征的数量。 如果功能重要性每次都改变,不要感到惊讶!

  • 为了训练机器学习模型,这些特征首先是一个热点编码。 这意味着被认为具有0重要性的一些特征可能是在建模期间添加的一个热门编码特征。

当我们进入功能删除阶段时,可以选择删除所有添加的热门编码功能。 但是,如果我们在特征选择之后进行机器学习,那么我们必须对特征进行热编码!

低重要性功能

下一个方法基于零重要性函数,使用模型中的要素重要性进一步选择。 函数identify_low_importance发现没有对指定的全部重要性做出贡献的最重要的特性。

如何进行特征选择,避开那些机器学习的“坑”!

例如,下面的调用找到了达到总重要性99%所不需要的最不重要的功能:

根据累积重要性和这些信息的情节,梯度提升机器认为许多特征与学习无关。 再次,这种方法的结果将在每次训练中发生变化。

要查看数据框中的所有要素重要性,请执行以下操作:

如何进行特征选择,避开那些机器学习的“坑”!

如何进行特征选择,避开那些机器学习的“坑”!

low_importance方法借鉴了使用主成分分析(PCA)的一种方法,通常只保留一定比例方差(例如95%)所需的PC。占总重要性的百分比是基于相同的想法。

基于特征重要性的方法只有在我们要使用基于树的模型进行预测时才适用。除了随机性之外,基于重要性的方法是一种黑盒测试,因为我们并不真正知道为什么模型认为这些特征是无关紧要的。如果使用这些方法,请多次运行它们以查看结果如何变化,并可能创建具有不同参数的多个数据集进行测试!

单一的价值特征

最后的方法非常基础:找到任何具有单一唯一值的列。仅具有一个唯一值的特征对于机器学习不具有用处,因为此特征具有零差异。例如,基于树的模型不能仅使用一个值对特征进行分割(因为没有组将观察分割)。

这里没有参数可供选择,它与其他方法不同:

我们可以绘制每个类别中唯一值数量的直方图:

需要记住的一点是,默认情况下,在计算Pandas中的唯一值之前,NaN会被丢弃。

删除功能

一旦我们确定要丢弃的功能,我们有两个选项可以将其删除。所有要移除的要素都存储在FeatureSelector的操作符中,我们可以使用这些列表手动移除要素。另一种选择是使用删除内置功能。

对于这种方法,我们传入用于删除特征的方法。如果我们想要使用所有实现的方法,只需传入methods =‘all'。

此方法返回删除了要素的数据帧。还要删除在机器学习期间创建的一个热门编码功能:

在继续操作之前检查将要删除的功能可能是一个好主意!原始数据集作为备份存储在FeatureSelector的数据属性中!

一次运行所有方法

我们可以将所有这些方法与identify_all一起使用,而不是单独使用这些方法。这需要每个方法的参数字典:

请注意,由于我们重新运行模型,总功能数量将发生变化。然后可以调用remove函数来放弃这些功能。

结论

特征选择器类在训练机器学习模型之前需要执行几个常用的操作以去除特征。它提供了识别删除功能以及可视化的功能。方法可以单独运行或同时运行,以实现高效的工作流程。

缺失、共线和single_unique方法是确定性的,而基于特征重要性的方法将随着每次运行而改变。特征选择很像机器学习领域,很大程度上是经验性的,需要测试多个组合才能找到最佳答案。在流水线中尝试多种配置是最佳实践,并且“特征选择器”提供了快速评估特征选择参数的方法。

如何进行特征选择,避开那些机器学习的“坑”!

相关推荐