具有多个特征的训练模型,其值在概念上相同



例如,假设我正在尝试训练一个二元分类器,该分类器采用以下形式的样本输入

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 解决方案中,因为这是我用来构建模型的。谢谢。

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

在 EasyPredictModelWrapper Javadocs 中有关于此内容的更多信息。 下面是一个示例:

用于生成的 POJO 和 MOJO 模型的简单预测 API。按如下方式使用: 1. 实例化一个简单预测模型包装器 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);

最新更新