树模型本身具有特征筛选能力,为什么不能直接用树模型选重要特征?

412 阅读3分钟

导言

刷狗乎时候看到了一个问题:

image.png 有感而发,针对于树模型的特征筛选说一下个人理解。

树模型的特征重要性是有问题的

首先,树模型的特征选择并不是完美的,树类模型的Feature Importance主要有两个问题:

  1. 会偏好连续型变量或高基数(high cardinality)的类型型变量

Strobl[1]在2007年就提出:树类模型默认的Feature Importance会偏好连续型变量或高基数(high cardinality)的类型型变量。这也很好理解,因为连续型变量或高基数的类型变量在树节点上更容易找到一个切分点,换言之更容易过拟合

ps. 高基数变量指的是本身虽然是离散型,但是取值茫茫多的变量,如用户id,信用卡id,订单id这种可能每行数据的取值都不同的变量。

2. 无法代表特征在测试集上的泛化能力

Feature Importance体现的是训练完成的模型对特征的依赖程度,它说明的是训练集的信息但不代表特征在测试集上的泛化能力。特别当训练集和测试集的分布有显著差异时,模型默认的Feature Importance的偏差和测试集实际需要的特征可能有极大的差异。

举一个极端的例子,如果我们随机生成一些X和二分类标签y,并用XGB不断迭代。随着迭代次数的增加,训练集的AUC将接近1,但是验证集上的AUC仍然会在0.5附近徘徊。如果我们查看模型的Feature Importance,就会发现,即使全部训练数据都是随机生成的,仍然会有一些特征的重要性特别高。 这些特征导致模型过拟合,从而在训练集上实现了接近1的AUC。但实际上这些特征是无意义的。

转回狗乎问题:

  1. 减少计算资源是树模型特征选择的一部分意义,但绝不是最大意义:个人理解树模型做特征选择时的作用主要是完成一个特征的粗筛,比如打kaggle通过暴力交叉等方式产生巨量特征时,就可以通过树模型加优化后的特征选择算法(如Permutation importance[1],null importance[2],Boruta[3])来粗筛特征,然后再做精细化的特征选择。

  2. 简单粗暴地选择特征重要性前20%的特征则有可能会丢失泛化性较好的特征:虽然决策树有一定的特征选择能力,但当训练集和测试集分布差异较大时,其选出的特征可能是在训练集上过拟合的特征,导致模型在测试集上的效果较差。

[1] Strobl C, Boulesteix A L, Zeileis A, et al. Bias in random forest variable importance measures: Illustrations, sources and a solution[J]. BMC bioinformatics, 2007, 8(1): 1-21.
[2] www.kaggle.com/ogrellier/f…null-importances
[3] Kursa M B, Rudnicki W R. Feature selection with the Boruta package[J]. Journal of statistical software, 2010, 36: 1-13.