【问题标题】:Feature importance plot using xgb and also ranger. Best way to compare使用 xgb 和 ranger 的特征重要性图。最好的比较方法
【发布时间】:2020-04-30 14:40:09
【问题描述】:

我正在编写一个同时训练 Ranger 随机森林和 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()

那是使用 xgboost 库及其功能。使用游侠随机福雷斯特,如果我拟合回归模型,如果我在拟合模型时包含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。但是,ranger 在该表中返回的值与 xgb 在图中显示的比例完全不同。

是否有开箱即用的库或解决方案,我可以在其中以类似的方式绘制 xgb 或 ranger 模型的特征重要性?

【问题讨论】:

    标签: r xgboost r-ranger


    【解决方案1】:

    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)
    

    不过,ranger 还允许通过importance="permutation" 计算排列重要性,xgboost 也可以这样做。

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 2021-09-09
      • 1970-01-01
      • 2021-12-26
      • 2020-08-24
      • 1970-01-01
      • 2020-02-05
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多