使用xgb和Ranger的功能重要性图。比较的最佳方法

问题描述 投票:0回答:1

我正在研究一个脚本,该脚本既可以训练护林员随机森林又可以训练xgb回归。取决于哪个基于rmse的性能最佳,一个或另一个用于测试保持数据。

我也想以可比的方式返回两者的功能重要性。

通过xgboost库,我可以像这样获得特征重要性表和图表:

> xgb.importance(model = regression_model)
                 Feature        Gain       Cover  Frequency
1:              spend_7d 0.981006272 0.982513621 0.79219969
2:                   IOS 0.006824499 0.011105014 0.08112324
3:  is_publisher_organic 0.006379284 0.002917203 0.06770671
4: is_publisher_facebook 0.005789945 0.003464162 0.05897036

然后我可以像这样绘制它:

> xgb.importance(model = regression_model) %>% xgb.plot.importance()

enter image description here

那是使用xgboost库及其功能。使用游侠随机forrest,如果我拟合回归模型,则在拟合模型时包括importance = 'impurity'时,可以获得特征重要性。然后:

regression_model$variable.importance
             spend_7d        d7_utility_sum  recent_utility_ratio                   IOS  is_publisher_organic is_publisher_facebook 
         437951687132                     0                     0             775177421             600401959            1306174807 

我可以创建一个ggplot。但是,在该表中返回的护林员与在绘图中显示的xgb之间,比例完全不同。

是否有现成的库或解决方案,可以以类似的方式绘制xgb或Ranger模型的功能重要性?

r xgboost r-ranger
1个回答
0
投票

[XGboost的“增益”列和带参数“杂质”的测距仪的重要性都是通过给定变量拆分的总杂质减少量(因此获得增益)构造的。

唯一的区别似乎是,尽管XGboost会自动以百分比形式显示重要性,但Ranger会将其保留为原始值,因此平方和并不很容易绘制。因此,您可以通过将护林重要度的值除以总和来转换其值,以便获得与Xgboost中相同的百分比。

由于使用杂质减少有时可能会引起误解,因此我建议您(对于两个模型)通过置换来计算变量的重要性。这使您可以轻松地获得与不同模型相当的重要性,并且更加稳定。

我建议this incredibly helpful post

这是排列重要性,如其中所定义(对不起,它是Python,而不是R):

def permutation_importances(rf, X_train, y_train, metric):
  baseline = metric(rf, X_train, y_train)
  imp = []
  for col in X_train.columns:
    save = X_train[col].copy()
    X_train[col] = np.random.permutation(X_train[col])
    m = metric(rf, X_train, y_train)
    X_train[col] = save
    imp.append(baseline - m)
return np.array(imp)

但是,护林员还允许通过importance="permutation"计算置换重要性,而xgboost也可以这样做。

© www.soinside.com 2019 - 2024. All rights reserved.