Machine learning 具有多个功能的培训模型who';s值在概念上是相同的

Machine learning 具有多个功能的培训模型who';s值在概念上是相同的,machine-learning,h2o,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,ballpo

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

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,这就是您看到该错误的原因

有关这方面的更多信息,请参阅。 以下是一个例子:

// 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);
用于生成POJO和MOJO模型的简单预测API。使用方法如下: 1.实例化EasyPredictModelWrapper 2.创建一个新的数据行 3.调用其中一个predict方法

以下是一个例子:

// 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);
H2O二进制模型(在H2O集群中运行的模型)将自动处理看不见的分类级别,但是,在使用纯Java POJO模型方法生成预测时(就像在您的案例中),这是一个可配置的选项。在
EasyPredictModelWrapper
中,默认行为是未知类别级别抛出PredictUnknownCategoricalLevelException,这就是您看到该错误的原因

有关这方面的更多信息,请参阅。 以下是一个例子:

// 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);
用于生成POJO和MOJO模型的简单预测API。使用方法如下: 1.实例化EasyPredictModelWrapper 2.创建一个新的数据行 3.调用其中一个predict方法

以下是一个例子:

// 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);

我目前正在使用EasyPredictionWrapper中的
.setConvertUnknownCategoricalLevelsToNa(true)
配置来忽略您所建议的未知类别,但我想进一步了解如何让模型识别两个不同的示例功能p1和p2在概念上是相同的(例如,如果模型已经在有(p1=b,p2=a)的样本上进行了训练,那么我就不需要用有(p1=a,p2=b)的样本来训练模型了)。你可能应该把这个问题分成两个问题(它们并不是真的相关)。大多数算法都能够忽略冗余特征,所以这不重要(如果使用GLM,请确保使用一些正则化)。如果要执行更复杂的操作,则需要编写自定义代码以从训练集中筛选“概念上重复”的样本。我当前使用的是
.setConvertUnknownCategoricalLevelsToNa(true)
在我的EasyPredictionWrapper中进行配置,以便按照您的建议忽略未知类别,但我想进一步了解如何让模型识别两个不同的样本特征p1和p2在概念上是相同的(例如,这样我就不需要使用具有(p1=a,p2=b)的样本来训练模型)如果它已经在一个有(p1=b,p2=a)的样本上进行了训练。你可能应该把这个问题分成两个问题(它们并不是真的相关)。大多数算法都能够忽略冗余特征,所以这不重要(如果你使用的是GLM,请确保使用一些正则化)。如果要执行更复杂的操作,则需要编写自定义代码以从训练集中筛选“概念上重复”的样本。