【问题标题】:h2o randomforest not predicting on a categorical value which not seen during training, It's giving exceptionh2o randomforest 没有预测在训练期间没有看到的分类值,它给出了异常
【发布时间】:2018-02-20 18:42:50
【问题描述】:

我们通过使用 Java POJO 来使用 Prediction Service Builder 来为我们的模型提供服务。但是当我们传递一个新的分类值时,模型在训练时从未见过。它给出了一个例外。我该如何处理?

【问题讨论】:

  • 我认为最简单的解决方法可能是选择一个包含所有类别的训练集。您还可以清理现实世界的数据,将从未见过的异常​​值映射到已知类别。
  • 这个问题也在这里得到解答:stackoverflow.com/questions/45093030/…

标签: random-forest h2o


【解决方案1】:

H2O-3 的 Java POJO 和 MOJO 文档在这里:

下面贴上POJO级别的相关示例:

String modelClassName = "gbm_pojo_test";
hex.genmodel.GenModel rawModel;
rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance();

// By default, unknown categorical levels throw PredictUnknownCategoricalLevelException.
// Optionally configure the wrapper to treat unknown categorical levels as N/A instead
// and strings that cannot be converted to numbers also to N/As:
EasyPredictModelWrapper model = new EasyPredictModelWrapper(
         new EasyPredictModelWrapper.Config()
             .setModel(rawModel)
             .setConvertUnknownCategoricalLevelsToNa(true)
             .setConvertInvalidNumbersToNa(true)
);


顺便说一句,如果您使用 MOJO 而不是 POJO,则根本不需要编译任何 DRF Java 模型代码,这对于大型模型来说可能是个问题。这是一个构建树模型、导出 MOJO、创建 WAR 文件并将其部署在一个非常简单的 Java servlet 容器中的示例项目:

【讨论】:

    【解决方案2】:

    我在 R 中进行预测时也遇到了这个问题。我需要使用与版本无关的模型(POJO 或 MOJO),并且没有运行 h2o 集群是一个好处。

    我认为,如果您将模型保存为 MOJO(此解决方法在 POJO 中不起作用),并且在调用 h2o.predict_json() 函数时不提供引发错误的变量,则模型将按预期工作。

    我根据 .csv 文件的输入进行预测(回归)的代码可以总结为:

    dataset <- read.csv(<filepath>)
    dataset$error_column <- ""
    dataset$prediction <- 0
    dataset_good <- dataset[0,]
    dataset_error <- dataset[0,]
    variables <- c(<variable1>, <variable2>, <...>, <variableN>)
    
    while (length(dataset[,1]>0){
    
        # make predictions without feeding variables identified as problematic #
        dataset$prediction <- setNames(unlist(h2o.predict_json(model = <model_path>, 
                              json = toJSON(dataset[, setdiff(variables, unlist(strsplit(dataset$error_column, split="; ")))]))), "prediction")
    
        # save good predictions in one table #
        dataset_good <- rbind(dataset_good, dataset[!is.na(as.numeric(dataset$prediction)),])
    
        # save errors in another dataset #
        dataset_error <- rbind(dataset_error, dataset[is.na(as.numeric(dataset$prediction)),])
    
        # identify problematic variable in message #
        dataset_error$error_column <- paste(dataset_error$error_column,
                                      substr(dataset_error$prediction, start = regexpr("\\(", dataset_error$prediction)+1, 
                                                                       stop = regexpr(",", dataset_error$prediction)-1 ), sep = "; ")
    
        # rerun rows that generated errors #
        dataset <- dataset_error
    }
    

    别忘了你需要 h2o-genmodel 和 MOJO。

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 2019-04-27
      • 2012-04-05
      • 2020-03-14
      • 2023-03-07
      • 2019-09-30
      • 2019-12-22
      • 2020-02-15
      • 2018-05-31
      相关资源
      最近更新 更多