4.6 用随机森林评估特征的重要性
在前面的章节中,我们学习了如何通过逻辑回归,用L1正则化来消除那些不相关的特征,用SBS算法做特征选择,并将其应用到KNN算法。另一个用来从数据集中选择相关特征的有用方法是随机森林,即在第3章中介绍过的集成技术。可以用随机森林的方法计算所有决策树的平均杂质度衰减,来测量特征的重要性,而不必考虑数据是否线性可分。更加方便的是,scikit-learn中实现的随机森林已经为我们收集好了特征的重要性值,在完成RandomForestClassifier
拟合后,我们可以通过访问feature_importances_
属性取得它们。下面的代码将在葡萄酒数据集上训练拥有500棵树的森林,并根据13个特征各自的重要性为其排序,还记得在第3章中讨论过的基于树的模型并不需要使用标准或归一化的特征:
执行代码后我们可以画出一张图,把葡萄酒数据集中不同的特征按其相对重要性进行排序。请注意,特征重要性值的总和为1,而且呈正态分布,如图4-9所示。
图 4-9
我们可以得出这样的结论:脯氨酸和黄酮的含量、颜色强度、OD280/OD315衍射和酒精浓度是数据集中基于500棵决策树根据平均杂质度衰减而确定的最具差异性的特征。有趣的是,结果中排在前两位的特征(乙醇浓度和稀释葡萄酒的OD280/OD315)也包括在用上节实现的SBS算法得出的三特征子集中。
然而,就可解释性而言,随机森林是值得一提的重要技术。如果两个或多个特征高度相关,那么一个特征就可能排得很靠前,而其他特征的信息可能根本无法完全捕获。另一方面,如果我们所关心的只是模型的预测性能,而不是对特征重要值的解释,那就不需要关心这个问题了。
总结特征的重要值和随机森林,值得一提的是,scikit-learn也实现了SelectFromModel
对象,我们可以在模型拟合后,根据用户指定的阈值选择特征,这对想用RandomForestClassifier
作为特征选择器以及scikit-learn的Pipeline
对象的中间步骤很有用,它允许通过一个估计器连接不同的预处理步骤,在第6章中,我们将对此进行详细介绍。例如,我们可以在以下的代码中,通过将threshhod
设置为0.1
把数据集减少到只包含五个最重要的特征: