2

我正在尝试使用石灰在我正在开发的包的输出中添加 ML 解释。我的解决方案使用库 gbm 中的梯度提升模型。石灰不支持这种类型的模型,所以我需要向泛型添加一个 gbm 方法:-model_type -predict_model

如果我手动执行此操作,逐行运行我的代码,我没有问题。
但是,一旦将石灰包含在函数中并且我尝试运行它,该函数似乎无法分配“gbm”方法。.

有人知道如何解决这个问题吗?

我也尝试过使用 setMethod,但随后我会收到一条消息说环境已锁定

我在包函数之外训练我的模型:

    lime_model<-gbm(train_target ~. ,
                 data = train,
                 distribution="bernoulli",
                 n.trees = N_trees,
                 interaction.depth = Int.depth,
                 shrinkage=Learn_rate,
                 n.minobsinnode=Min.obs.node)

然后将其传递给函数:

    explanation<-        
    lime_gbm(train_data=train,test_data=test,model=lime_model,Conf, 
                            n_trees=N_trees)

定义为:

    #' @param train_data a dataframe containing the data to train the model on
    #' @param test_data a dataframe containing the data to test test the model on
    #' @param Conf a config file to extract general variable names
    #' @param n_trees number of trees in the model
    #' @param model the model to be explained
    #' 
    #' @import dplyr
    #' @import lime 
    #'
    #' @return list
    #' @export

    lime_gbm<-function(train_data,test_data,model,Conf, n_trees){

      if(!is.data.frame(train_data) | !is.data.frame(test_data)){
        stop("data must be a data.frame")
      }

      if(!is.numeric(n_trees)){
        stop("model parameters must be numeric")
      }

      if(!class(model)=="gbm"){
        stop("model must be of class gbm")
      }

      fit.gbm=model

      #create model type for gbm
      model_type.gbm <- function(x,...){
        return("classification")
      }

      #setMethod("model_type","gbm",function(x,...) "classification")

      predict_model.gbm <- function(x, newdata, type="prob",...) {

        res <- predict.gbm(x,newdata = newdata, type="response",
                       n.trees=n_trees)
        res <-as.data.frame(res)

        colnames(res)<-"predictions"#c("Yes","No")
        return(res)

      }
      #setMethod("predict_model","gbm",function(x,...) as.data.frame(x))

      explainer <- lime::lime(train_data, 
                              fit.gbm, 
                              bin_continous=T, 
                              quantile_bins=F)

     explanation <- lime::explain(test_data,
                                   explainer,
                                   n.trees=n_trees,
                                   n_labels=1,
                                   #model_type="classification",
                                   n_features=ncol(test_data),
                                   n_permutations = 10,#500, 
                                   feature_select='lasso_path',
                                   dist_fun="manhattan")

      return(explanation)
    }

代码原样给出错误消息:“错误:模型类必须有一个 model_type 方法。请参阅 ?model_type 以获得开箱即用支持的模型的概述”

或者,如果我在分配方法时删除“.gbm”并删除前面的#

   #setMethod()

setMethod("model_type", "gbm", function(x, ...) "classification") 中的错误:环境 'SiteViewModelling' 被锁定;无法为函数“model_type”分配方法</p>

4

0 回答 0