Python 特征重要性';增益';在XGBoost

Python 特征重要性';增益';在XGBoost,python,scikit-learn,xgboost,boosting,information-gain,Python,Scikit Learn,Xgboost,Boosting,Information Gain,我想了解xgboost中的功能重要性是如何通过“增益”计算的。发件人: “增益”是指特征对其所在分支带来的精度提高。其思想是,在向分支添加特征X上的新拆分之前,存在一些分类错误的元素,在添加此特征上的拆分之后,有两个新分支,每个分支都更准确(一个分支说如果你的观察是在这个分支上,那么它应该被归类为1,另一个分支说的正好相反) 在scikit learn中,通过使用变量(即节点的加权杂质平均值-左子节点的加权杂质平均值-右子节点的加权杂质平均值)拆分后每个节点的基尼杂质/信息增益减少来计算特征重要

我想了解xgboost中的功能重要性是如何通过“增益”计算的。发件人:

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

在scikit learn中,通过使用变量(即节点的加权杂质平均值-左子节点的加权杂质平均值-右子节点的加权杂质平均值)拆分后每个节点的基尼杂质/信息增益减少来计算特征重要性(另请参见:)

我想知道xgboost是否也使用上述引文中所述的信息增益或准确性来使用这种方法。我试着挖掘xgboost的代码,并找到了这种方法(已经切掉了不相关的部分):

def get_score(self,fmap='',重要性\'u type='gain'):
trees=self.get\u dump(fmap,其中\u stats=True)
重要性类型+='='
fmap={}
gmap={}
对于树中树:
对于树中的行。拆分('\n'):
#寻找开口方括号
arr=行分割(“[”)
#如果没有开口括号(叶节点),则忽略此行
如果len(arr)==1:
持续
#查找结束括号,仅提取该括号内的信息
fid=arr[1]。拆分(']')
#关闭支架后,从管柱中取出增益或盖
g=float(fid[1]。拆分(重要性类型)[1]。拆分(',')[0])
#在结束括号之前从字符串中提取要素名称

fid=fid[0]。拆分('Nice question)。使用以下等式计算增益:

要获得更深入的解释,请阅读以下内容:

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