如何从 sparklyr 中的交叉验证器获取最佳模型的特征重要性?

How to get feature importance of the best model from cross validator in sparklyr?

我能够在 sparklyr 中训练随机森林交叉验证器,但找不到获得最佳模型特征重要性的方法。

如果我训练一个简单的随机森林模型,我可以使用:

fit <- ml_random_forest(...)
feature_imp <- ml_tree_feature_importance(fit)

但是,如果我对来自交叉验证器的最佳模型做同样的事情,我会得到错误:

> cv_model <- ml_fit(cv, df_training)
> feature_imp <- ml_tree_feature_importance(cv_model$best_model)
Error in UseMethod("ml_feature_importances") : 
no applicable method for 'ml_feature_importances' applied to an object of class "c('ml_pipeline_model', 'ml_transformer', 'ml_pipeline_stage')"

有没有办法从交叉验证器中获取最佳模型的特征重要性?

这道题的关键是,

  1. model_fit的输出和ml_random_forest的输出有什么区别?
  2. 一个可以应用什么功能,另一个可以应用什么?
  3. 可以互相转换吗?

我仔细研究了交叉验证器中最佳模型的结构。

对于基于树的模型(我检查了 GBT 和 RF),在算法阶段有一个名为 feature_importances 的组件,它包含所有 真实变量的值 (不同于feature assembler阶段给出的变量名,其中一个热变量不展开)

遗憾的是这个feature_importances向量没有命名,我必须为每个值找出对应的变量名。

我的想法是,从特征组装器我们可以得到一个简化的列名向量,其中一个热编码变量没有扩展,对于每个热编码变量,我们只需要用一组变量名替换它最终得出完整的列名向量的级别——我假设变量的顺序与特征汇编器给出的顺序相同

为了得到一个热变量的水平,我们可以回到uid包含one_hot_encoder_的阶段,首先得到一个热编码变量,然后回到uid包含string_indexer_的阶段得到每个热编码变量的级别(存储在名为 labels 的子列表中)。请注意,由于这本质上是虚拟编码,其中一个级别用作参考级别,不会显示为单独的变量,我假设 遇到并记录在 labels 中的第一个级别是参考水平真实变量的顺序对于一个特定的热编码变量与labels[中给出的顺序相同=36=].

在这 3 个假设下,我能够重建列名称向量并将其附加到特征重要性向量以形成特征重要性 table,就像我在 ml_feature_importances() 上应用得到的一样在没有交叉验证器的情况下训练的 GBT 或 RF 模型。