我能够在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')"
有没有办法从交叉验证器获得最佳模型的特征重要性?
这个问题的关键是,
model_fit
的输出与ml_random_forest
的输出之间有什么区别? 答案 0 :(得分:1)
我仔细检查了交叉验证器中最佳模型的结构。
对于基于树的模型(我检查了GBT和RF),在算法阶段有一个名为feature_importances
的组件,其中包含所有真实变量(与变量不同)的值由功能汇编器阶段指定的名称,其中一个热变量不会扩展。
可悲的是,这个feature_importances
向量没有命名,我必须为每个值找出相应的变量名称。
我的想法是,从特征汇编器中,我们可以获得列名称的简化矢量,其中不扩展一个热编码变量,对于每个热编码变量,我们只需要用一组具有以下级别的变量名称替换即可:最终提出完整的列名称向量-我假设变量的顺序与功能汇编器给出的顺序相同。
要获取一个热门变量的级别,我们可以返回包含one_hot_encoder_
的uid的阶段,首先获取一个热门编码变量,然后返回包含string_indexer_
的uid的阶段以获取级别(存储在名为labels
的子列表中的每个热编码变量。请注意,由于这实际上是伪编码,因此其中一个级别用作参考级别,不会显示为单独的变量,并且我假设在labels
中遇到并记录的第一个级别是参考级别,以及特定热编码变量的实变量的顺序与labels
中给出的顺序相同。
在这三个假设下,我能够重构列名称向量并将其附加到特征重要性向量上,以形成特征重要性表,就像我将ml_feature_importances()
应用于在GBT或经过训练的RF模型上得到的结果一样没有交叉验证器。