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

时间:2018-06-19 11:03:22

标签: r random-forest 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. 他们可以相互转换吗?

1 个答案:

答案 0 :(得分:1)

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

对于基于树的模型(我检查了GBT和RF),在算法阶段有一个名为feature_importances的组件,其中包含所有真实变量(与变量不同)的值由功能汇编器阶段指定的名称,其中一个热变量不会扩展。

可悲的是,这个feature_importances向量没有命名,我必须为每个值找出相应的变量名称。

我的想法是,从特征汇编器中,我们可以获得列名称的简化矢量,其中不扩展一个热编码变量,对于每个热编码变量,我们只需要用一组具有以下级别的变量名称替换即可:最终提出完整的列名称向量-我假设变量的顺序与功能汇编器给出的顺序相同

要获取一个热门变量的级别,我们可以返回包含one_hot_encoder_的uid的阶段,首先获取一个热门编码变量,然后返回包含string_indexer_的uid的阶段以获取级别(存储在名为labels的子列表中的每个热编码变量。请注意,由于这实际上是伪编码,因此其中一个级别用作参考级别,不会显示为单独的变量,并且我假设labels中遇到并记录的第一个级别是参考级别,以及特定热编码变量的实变量的顺序与labels 中给出的顺序相同。

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