例如,假设我正在尝试训练一个二进制分类器,它采用表格的样本输入
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解决方案中,因为我正在使用它来构建模型。感谢。
答案 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);