例如,假设我正在尝试训练一个二元分类器,该分类器采用以下形式的样本输入
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
的类别中见过“ballpoint”)(在 h2o 中:hex.genmodel.easy.exception.PredictUnknownCategoricalLevelException)
我的第一个想法是为每个样本生成“钢笔”特征的排列来训练模型。有没有更好的方法来处理这种情况?具体来说,在 h2o.ai Flow UI 解决方案中,因为这是我用来构建模型的解决方案。谢谢。
最佳答案
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);
关于machine-learning - 具有多个特征的训练模型,其值在概念上是相同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45093030/