如何处理R的预测函数中的错误?

时间:2016-09-27 10:01:21

标签: r try-catch predict

我有一个数据帧df,我正在构建一个机器学习模型(C5.0决策树)来预测一个列的类(loan_approved):

结构(不是真实数据):

id occupation income  loan_approved
1  business   4214214 yes
2  business   32134   yes
3  business   43255   no
4  sailor     5642    yes
5  teacher    53335   no
6  teacher    6342    no

流程:

  • 我随机将数据框分成测试和训练,在火车上学习 数据集(第1,2,3,5,6行和第4行作为测试)
  • 为了在一列或多列中考虑新的分类级别,我使用了try function

功能:

    error_free_predict = function(x){
    output = tryCatch({
    predict(C50_model, newdata = test[x,], type = "class")
    }, error = function(e) {
    "no"
    })
    return(output)
    }

应用预测功能:

test <- mutate(test, predicted_class = error_free_predict(1:NROW(test)))

问题:

id occupation income loan_approved predicted_class
1  business   4214214 yes          no
2  business   32134   yes          no
3  business   43255   no           no
4  sailor     5642    yes          no
5  teacher    53335   no           no
6  teacher    6342    no           no

问题:

我知道这是因为测试数据框架有一个新的级别,而这个级别在列车数据中没有出现,但除了这个以外我的所有情况都不应该起作用吗?

P.S:没有使用sapply,因为它太慢了

2 个答案:

答案 0 :(得分:1)

这个问题有两部分。

  1. 问题的第一部分出现在训练模型期间,因为如果进行随机分裂,分类变量在训练和测试之间不是平均分配的。在你的情况下,说你只有一个职业记录&#34;水手&#34;那么当你进行随机分割时,它可能会在测试集中结束。使用火车数据集建立的模型从未见过占领的影响&#34;水手&#34;因此它会抛出错误。在更一般化的情况下,可能有一些其他分类变量级别在随机分割后完全用于测试集。
  2. 因此,不是在列车和测试之间随机分割数据,而是可以进行分层抽样。使用data.table进行70:30分割的代码是:

    ind <- total_data[, sample(.I, round(0.3*.N), FALSE),by="occupation"]$V1
    train <- total_data[-ind,]
    test <- total_data[ind,]
    

    这可以确保任何级别在训练和测试数据集之间平均分配。所以你不会得到新的&#34;测试数据集中的分类级别;在随机分裂的情况下可能存在。

    1. 问题的第二部分出现在模型处于生产状态并遇到一个全新的变量,甚至在训练或测试集中都没有。为了解决这个问题,可以使用维护所有分类变量的所有级别的列表 lvl_cat_var1 <- unique(cat_var1)lvl_cat_var2 <- unique(cat_var2)等。然后在预测之前可以检查新级别并过滤:

      new_lvl_data <- total_data[!(var1 %in% lvl_cat_var1 & var2 %in% lvl_cat_var2)] 
      pred_data <- total_data[(var1 %in% lvl_cat_var1 & var2 %in% lvl_cat_var2)] 
      
    2. 然后进行默认预测:

      new_lvl_data$predicted_class <- "no" 
      

      和pred_data的全面预测。

答案 1 :(得分:0)

我通常使用循环来执行此操作,其中列车外的任何级别将通过此函数重新编码为NA。这里训练是用于训练模型的数据,测试是用于预测的数据。

for(i in 1:ncol(train)){
  if(is.factor(train[,i])){
    test[,i] <- factor(test[,i],levels=levels(train[,i]))
  }
}

Trycatch是一种错误处理机制,即在遇到错误之后。除非您在遇到错误后想要做一些不同的事情,否则它将不适用。但是你仍然希望运行该模型,然后这个循环将处理新的级别。