XGBoost功能重要性“获得”

时间:2019-08-05 14:30:20

标签: python scikit-learn xgboost boosting information-gain

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

  

“增益”是指功能对其所处分支的准确性的提高。这个想法是,在将特征X上的新拆分添加到分支之前,存在一些错误分类的元素,在对特征X上添加拆分后,有两个新分支,并且每个分支都更准确(一个分支表示是否您的观察结果在该分支上,则应将其分类为1,而在另一分支上则正好相反。

在scikit-learn中,特征重要性是通过使用变量(即节点的加权杂质平均值-左子节点的加权杂质平均值-右子节点的加权杂质平均值)拆分后每个节点的基尼杂质/信息增益降低来计算的节点(另请参见: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 个答案:

答案 0 :(得分:2)

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

enter image description here

有关详细说明,请阅读:https://xgboost.readthedocs.io/en/latest/tutorials/model.html