具有多个功能的培训模型,其价值在概念上是相同的

时间:2017-07-14 01:00:07

标签: machine-learning h2o

例如,假设我正在尝试训练一个二进制分类器,它采用表格的样本输入

x = {d=(type of desk), p1=(type of pen on desk), p2=(type of *another* pen on desk)}

说我然后训练样本上的模型:

x1 = {wood, ballpoint, gel},      y1 = {0}

x2 = {wood, ballpoint, ink-well}, y2 = {1}.

并尝试预测新样本:x3 = {wood, gel, ballpoint}。在这种情况下,我希望的答案是y3 = {0},因为从概念上讲,它应该无关紧要(即我不想让它变得重要)将哪支笔指定为p1或p2。

当尝试运行此模型时(在我的情况下,使用h2o.ai生成的模型),我得到p2的类别枚举无效的错误(因为模型从未见过'圆珠笔''在训练期间在p2的类别中)(在h2o: hex.genmodel.easy.exception.PredictUnknownCategoricalLevelException

我的第一个想法是为每个样本生成“笔”特征的排列以训练模型。有没有更好的方法来处理这种情况?具体来说,在h2o.ai Flow UI解决方案中,因为我正在使用它来构建模型。感谢。

1 个答案:

答案 0 :(得分:0)

H2O二进制模型(在H2O集群中运行的模型)将自动处理看不见的分类级别,但是,当您使用纯Java POJO模型方法(如您的情况)生成预测时,这是一个可配置选项。在EasyPredictModelWrapper中,默认行为是未知的分类级别抛出 PredictUnknownCategoricalLevelException ,这就是您看到错误的原因。

EasyPredictModelWrapper Javadocs中有更多相关信息。 这是一个例子:

生成的POJO和MOJO模型的简易预测API。使用方法如下: 1.实例化EasyPredictModelWrapper 2.创建新的数据行 3.调用其中一种预测方法

以下是一个例子:

// Step 1.
modelClassName = "your_pojo_model_downloaded_from_h2o";
GenModel rawModel;
rawModel = (GenModel) Class.forName(modelClassName).newInstance();

EasyPredictModelWrapper model = new EasyPredictModelWrapper(
                                    new EasyPredictModelWrapper.Config()
                                        .setModel(rawModel)
                         .setConvertUnknownCategoricalLevelsToNa(true));

// Step 2.
RowData row = new RowData();
row.put(new String("CategoricalColumnName"), new String("LevelName"));
row.put(new String("NumericColumnName1"), new String("42.0"));
row.put(new String("NumericColumnName2"), new Double(42.0));

// Step 3.
BinomialModelPrediction p = model.predictBinomial(row);