有没有办法在R包中向函数添加方法?

时间:2019-07-12 11:53:03

标签: r methods package gbm lime

我正在尝试使用石灰在软件包的输出中添加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”分配方法

0 个答案:

没有答案