我想了解 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
所以“增益”是从每个助推器的转储文件中提取的,但它是如何实际测量的?