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

11
我希望了解xgboost中“增益”计算特征重要性的方法。根据https://towardsdatascience.com/be-careful-when-interpreting-your-features-importance-in-xgboost-6e16132588e7的说法,“增益”是指特征对所在分支准确性的提高值。其思想是,在将特征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

所以“gain”是从每个增强器的转储文件中提取出来的,但它实际上是如何测量的?
1个回答

14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接