在采用决策树算法建立模型的场景中,例如GBDT、XGBoost、LightGBM、Random Forest等,我们习惯通过Feature Importance指标作为特征筛选的重要方法之一。从特征定量分析的可解释性角度来讲,这种方法实现过程方便,且评估逻辑简单,因此在决策树的实际建模场景中应用较为广泛。
针对Feature Importance的应用,虽然实践效果较好,但仍存在一定的缺点,主要体现在以下两个方面:
(1)Feature Importance的数值量化体现,对于连续型特征或高维度的离散型特征比较偏好,原因是分布平缓或均匀的特征变量,更容易在树节点上呈现出合适的切分点,这样反映出的信息权重可以更客观的描述当前特征对模型的重要性。如果某些离散特征的取值类型分布较少,这样得到的重要性系数可能存在较大偏差。
(2)Feature Importance结果反映的是模型拟合的结果,也就是建模训练样本数据的特征属性,若将变量重要性系数直接作为测试样本数据的特征属性,在某些场景中难以说明模型变量的泛化能力,尤其是在测试数据与训练数据分布存在较大偏差的情况下,显然通过模型训练数据得到的Importance系数,在测试数据上验证是显得不太合理的。
围绕以上Feature Importance的应用场景与特点属性,本文将介绍一种更优的特征筛选方法:Permutation Importance(排列重要性),此方法本质上同样反映的是特征重要性系数,但可以有效解决上文介绍Feature Importance系数存在的缺点。对于Permutation Importance,核心思想是将特征的取值分布随机打乱,同一个特征有了不同的数据排列属性,自变量与因变量的关系也有所区别,这样目的是为了更全面的检验当前特征变量对目标变量的影响程度,通过特征重要性系数Permutation Importance筛选得到的特征,能够较好的保证模型对新测试数据的泛化能力。通过对特征变量的取值分布进行随机打乱,如果在测试数据上可以较明显的增加模型损失,说明此特征对模型很重要;如果在测试数据上对模型的损失影响不大,说明对此特征对模型不重要。这里简要说明Permutation Importance场景下特征分布随机排列的情形,图1所示为特征Var1数据重新随机排列的示意图,在实际场景中算Permutation Importance系数时,往往会对特征变量进行多次排列,从而算出重要性系数的平均值,这样在一定程度避免分布的偶然性,特征系数结果显得更为客观。
图1 特征数据重新排列
为了更直观的体现特征Permutation Importance系数的应用价值,接下来我们围绕具体的样本数据来实现Permutation Importance的生成过程,并展示其系数分布结果。同时,我们同步实现常规的Feature Importance系数,将两种特征重要性系数的结果进行对比分析。
本文选取的样本数据包含5000条样本与12个字段,具体数据样例如图2所示。其中,字段ID为样本主键;Var01~Var10为特征变量,分布类型均为数值型;Target为目标变量,取值类型为二分类型(0/1)。为了保证特征重要性系数的生成,我们采用XGBoost分类算法来的构建模型,模型训练过程如图3所示。
图2 样本数据样例
图3 XGBoost模型构建
当XGBoost模型训练成功后,便可以实现特征重要性的输出,我们首先通过调用feature_importances_属性来生成特征的Feature Importances系数。同时,为了更形象的展示特征重要性系数分布,这里采取可视化方式将其结果进行呈现,具体实现过程如图4所示,输出的重要性系数与可视化图表分别如图5、图6所示。
图4 Feature Importances系数实现
图5 Feature Importances系数结果
图6 Feature Importances系数分布
由上图的Feature Importances系数结果与分布对比可知,特征Var05对当前模型的重要性是最高的(0.111396),而贡献度最低的为特征Var09(0.092068)。这种方法是我们日常习惯用来评估特征变量对模型的重要性,从而便于模型解释或特征筛选,此指标的分析意义是比较好的,但前边我们已经介绍,Feature Importances仍然存在一定缺点,也并非本文介绍重点,接下来我们通过以上XGBoost模型来输出Permutation Importance排列重要性系数,从而与Feature Importances进行对比分析。
特征的Permutation Importance系数,由于需要对特征变量的取值随机排序,且重新排列次数可以自定义设置,排列循环次数越多得到的系数分布更能客观反映特征对模型的重要性,一般情况下排列次数可以设置为5~10。特征变量的Permutation Importance系数可以直接通过调用sklearn库的permutation_importance类函数来实现,其中排列次数根据n_repeats来定义,特征Permutation Importance的具体实现过程如图7所示。
图7 Permutation Importances系数实现
由于生成的特征Permutation Importance结果是一个Dictionary,里边包含了3个数组,分别为importances(n次排列的重要性系数)、importances_mean(平均排列重要性系数)、importances_std(排列重要性系数标准差)。对其输出数据,我们重点希望获取的结果是平均排列重要性系数importances_mean,这里为了说明排列重要性系数的实现过程,我们将importances、importances_mean依次提权并转化为DataFrame来分析,其中importances的排列系数分布结果如图8所示。
图8 Importances排列系数分布
对于上图展示的特征5次排列后importances系数分布结果,其中per1~per5表示排列次数,可以看出对于个别特征变量,重新排列后对模型的重要性系数有一定波动,例如特征Var01、Var02等,而特征Var03、Var08等相对较为平稳。正因如此,Permutation Importance可以更全面的反映特征对模型的重要性,考虑了未来测试数据分布对特征重要性的影响,从而体现特征变量重要性的泛化能力。由于特征多次排列会输出多个系数值,我们最终是希望通过某个统一值来量化评测,因此采用系数的平均值较为合理,这也是图7过程输出的importances_mean结果,具体系数分布如图9所示,同时通过可视化形式将其结果进行展现,如图10所示。
图9 Importances系数平均值
图10 Permutation Importance系数分布
通过上图展现的特征Permutation Importance系数结果可知,对模型重要性最高的特征变量是Var06(0.14272),对模型重要性最高的特征变量是Var10(0.06920),这个分析结果与前边特征Feature Importances系数结果(图5)是有一定区别的。同时,根据Feature Importances系数分布(图6)与Permutation Importances的系数分布(图10)的对比可以直观了解到,二者分布形态还是有较明显差异。对于图6展示的Feature Importances系数分布,体现出各特征变量的重要性比较接近,而图10展示的Permutation Importances系数分布可以将特征变量的重要性进行了较好的区分,显然后者更有利于特征变量的筛选,以及对模型特征重要性的客观评估,这也是Permutation Importances系数的优势。
通过以上实践,我们围绕具体样本数据对比分析了特征Feature Importances与Permutation Importances的结果,也客观认识到Permutation Importances系数的独特之处与应用价值。因此,在建立树模型的实际场景中,我们可以尝试优先使用特征的排列重要性系数Permutation Importances来评估变量的贡献能力。当然,特征Feature Importances仍然也可以作为特征筛选方法之一。为了更全面分析特征变量对模型的重要性能影响,我们可以同步采用Feature Importances与Permutation Importances来实现特征重要性系数,这也是从事数据分析的重要思路与方法。
为了便于大家对特征Permutation Importance排列重要性系数的进一步熟悉与理解