XGBoost 中的特征重要性“增益”

Posted

技术标签:

【中文标题】XGBoost 中的特征重要性“增益”【英文标题】:Feature importance 'gain' in XGBoost 【发布时间】:2019-12-13 02:26:33 【问题描述】:

我想了解 xgboost 中的特征重要性是如何通过“增益”计算的。来自https://towardsdatascience.com/be-careful-when-interpreting-your-features-importance-in-xgboost-6e16132588e7:

“增益”是特征对其所在分支带来的准确性提高。这个想法是,在将特征 X 上的新拆分添加到分支之前,有一些错误分类的元素,在此特征上添加拆分后,有两个新分支,每个分支都更准确(一个分支说如果你的观察是在这个分支上,那么它应该被归类为 1,而另一个分支则完全相反)。

在scikit-learn中,特征重要性是通过使用变量拆分后每个节点的gini杂质/信息增益减少来计算的,即节点的加权杂质平均值-左子节点的加权杂质平均值-右子节点的加权杂质平均值节点(另见:https://stats.stackexchange.com/questions/162162/relative-variable-importance-for-boosting)

我想知道 xgboost 是否也使用上述引用中所述的信息增益或准确性的这种方法。我已经尝试在xgboost的代码中挖掘并发现了这个方法(已经切断了不相关的部分):

def get_score(self, fmap='', importance_type='gain'):
    trees = self.get_dump(fmap, with_stats=True)

    importance_type += '='
    fmap = 
    gmap = 
    for tree in trees:
        for line in tree.split('\n'):
            # look for the opening square bracket
            arr = line.split('[')
            # if no opening bracket (leaf node), ignore this line
            if len(arr) == 1:
                continue

            # look for the closing bracket, extract only info within that bracket
            fid = arr[1].split(']')

            # extract gain or cover from string after closing bracket
            g = float(fid[1].split(importance_type)[1].split(',')[0])

            # extract feature name from string before closing bracket
            fid = fid[0].split('<')[0]

            if fid not in fmap:
                # if the feature hasn't been seen yet
                fmap[fid] = 1
                gmap[fid] = g
            else:
                fmap[fid] += 1
                gmap[fid] += g

    return gmap

所以“增益”是从每个助推器的转储文件中提取的,但它是如何实际测量的?

【问题讨论】:

【参考方案1】:

好问题。使用以下公式计算增益:

如需深入解释,请阅读:https://xgboost.readthedocs.io/en/latest/tutorials/model.html

【讨论】:

以上是关于XGBoost 中的特征重要性“增益”的主要内容,如果未能解决你的问题,请参考以下文章

Xgboost中特征重要性计算方法详解

XGBoost 输出特征重要性以及筛选特征

使用 XGBoost 特征重要性分数打印出特征选择中使用的特征

xgboost 特征重要性计算

XGBoost 输出特征重要性以及筛选特征

XGBoost三种特征重要性计算方法对比