Feature selection in machine learning

原文:HTML
作者:Tatiana Gabruseva, PhD


文章目录


Introduction

梯度增强决策树( gradient boosted decision trees),例如XGBoost和LightGBM [1-2],已成为表格数据和时间序列的分类和回归任务的流行选择。通常,首先提取代表数据的特征,然后将它们用作树的输入。该特征是数据集中单个可测量的属性或特征[3],可能包括各种统计信息(平均值,标准差,中位数,百分位数,最小值,最大值等),趋势(上升和衰减),峰分析(周期,平均峰宽,峰数,频率),自相关和互相关等。

一旦从数据中提取了特征,就将它们用作梯度增强决策树(GBDT)的输入[8]。但是,GBDT容易过拟合,对于相对较小的数据集,重要的是减少的数量,只保留那些有助于分类器的。具有决策树的管道的重要部分是特征选择过程。特征选择有助于减少过度拟合,删除多余特征并避免混淆分类器。在这里,我描述了几种流行的方法,用于选择与任务最相关的。


1. Automated Recursive feature elimination

sklearn库[9]中消除递归的自动工具可以删除额外的特征。带交叉验证的递归特征消除[10]比没有交叉验证的被更多地使用。该工具的目标是通过递归考虑越来越少的特征集来选择特征。

  • 首先,在初始特征集上训练估计器,并获得每个特征的重要性。
  • 然后,从当前特征集中删除最不重要的特征,并再次检查分类指标。
  • 递归地重复该过程,直到最终达到所需的要选择的特征数量。

该工具提供了有用特征集的第一近似值。但是,自动消除特征并非总是最佳的,并且常常需要进行进一步的微调。在通过上述递归消除选择了初始特征集之后,我将使用置换重要性选择特征。


2. Permutation importance

Breiman等人[11]提出了称为排列重要性(permutation importance)或均值降低精度(Mean Decrease Accuracy)的方法。当特征值被置换(成为噪声)时,置换重要性为计算降低的分数

衡量特征重要性的一种方法是完全删除特征,训练没有该特征的分类器,然后看这样做如何影响得分。然而,这种方法需要针对每个特征重新训练分类器,这在计算上是昂贵的。解决方法是仅从验证集中删除有问题的特征,然后计算不具有该特征的验证集的分数。由于训练有素的分类器仍希望可以使用此特征,因此可以使用相同分布中的随机噪声代替初始特征值来代替删除该特征。获得这种分布的最简单方法是简单地改组(或置换)原始特征值。这正是排列重要性的实现方式。分类器仍具有该特征,但其中不包含任何有用的信息。

排列重要性可以使用eli5软件包计算[12]。它提供了特征的等级,然后我删除了那些负面或次要的特征。eli5软件包提供了一种方法,可通过测量不可用特征时分数如何降低来计算任何黑盒估计量的特征重要性

Example:

import eli5 
from eli5.sklearn import PermutationImportance
from lightgbm import LGBMClassifier
# set data and targets, split, and metric
# set a classifier
clf = LGBMClassifier(**best_params)
# fit the classifier model
clf.fit(x_train, y_train, 
        eval_set=[(x_train, y_train), (x_valid, y_valid)],
        eval_metric=lgbm_multi_weighted_logloss, 
        verbose=100,
        early_stopping_rounds=400, 
        sample_weight=y_train.map(weights), )
# calculate permitation importance for the classifier
perm = PermutationImportance(
			clf, scoring=permutation_scorer, 
            random_state=1).fit(x_valid, y_valid)        
expl = eli5.explain_weights(
			perm, feature_names=x_valid.columns.tolist(), top=None)        
print(eli5.format_as_text(expl))        
print(expl.feature_importances)
# save importances to html 
text_file = open("importance.html", "w")
text_file.write(eli5.format_as_html(expl))
text_file.close()

当许多特征数量不是很多时,该方法最适合于计算特征重要性。否则可能会占用大量资源。因此,我将其用作上述初始自动化特征消除之后的第二步。

在检查模型性能的改进时,我删除了排列重要性低或为负的特征。一些特征可能具有很高的排列重要性,但定义了数据的非常相似的方面。在这种情况下,找到特征之间的相关性可以帮助识别冗余特征。


3. Removing redundant features

相关性(Correlation)是一种统计技术,可以显示变量对是否相关以及关联程度如何。当相关性等于1表示完全相关,当相关性等于零时表示特征完全独立。

具有高相关性的特征更具线性相关性,因此对因变量的影响几乎相同。因此,当两个特征高度相关时,我们可以删除其中之一

相关矩阵可以简单地计算为 corr = X.corr(),其中向量X包含具有考虑特征的所有列。所有特征之间的相关矩阵在对角线元素上等于1,因为特征与其自身100%相关。具有高相关值的非对角线元素表示冗余特征

sns.heatmap(corr)

Feature selection in machine learning

Author: A. Hubin, License: MIT

在检查验证指标时,一对一地手动删除冗余特征(那些高度相关的特征)有助于减少特征集并提高GBDT的性能。为此,只需比较不同特征(非对角线元素)之间的相关性,然后尝试删除相关性高于某个阈值(例如0.9)的两个特征之一


4.Principle component analysis

减少特征数量的另一种方法是使用主成分分析(PCA)[13]。此技术可以减少特征空间的维数,同时从特征组合中找到最突出的部分。

Feature selection in machine learning

Source: scikit-learn.org, BSD license

PCA的主要思想是减少包含彼此相互关联的变量的数据集的维数,无论是重度还是轻度,同时最大程度地保留数据集中存在的变化

使用sklearn库[14]可以轻松实现它。 PCA对缩放敏感,在应用此算法之前需要对特征进行规范化。一个例子:

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
features = [‘feat_a’, ‘feat_b’, ‘feat_c’, ‘feat_d’]
# Scale the features
x = StandardScaler().fit_transform(features)
# decide on the number of components
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)

有许多课程和博客文章,你可以在其中详细阅读有关此技术的信息,例如[15]。


Final words

当然,还有其他用于特征选择的方法,例如使用自动编码器,P值,LightGBM重要性等。在这里,我描述了我个人选择的子集,这是我在Kaggle上进行竞争性机器学习时开发的。

我对特征选择执行步骤1-2-3。这是在Kaggle竞赛PLAsTiCC天文学分类中应用特征选择技术的示例[16]。首先,使用具有交叉验证特征的自动递归特征消除特征选择特征[10],得到167个特征。然后,使用eli5中实现的置换重要性算法对其余特征进行排名,并选择顶部特征。我们可以看到,对于该数据集,只有50个特征不足,而100个特征的性能更好。最终,使用相关性将冗余特征从前100个中删除,剩下82个特征[17]。

与自动特征选择相比,这种多步骤方法可提高模型性能,但效果不明显。定义和设计最相关的特征仍然是使用GBDT分类器/回归器获得最佳模型的首要任务

上一篇:sklearn.model_selection.RandomizedSearchCV随机搜索超参数


下一篇:Selection sort in Java Max-min sorting