具有多重预处理的 Ignite ML

Ignite ML with multiple preprocessing

使用 Ignite 机器学习,假设我有一个这样的标记数据集:

IgniteCache<Integer, LabeledVector<Integer>> contents = ignite.createCache(cacheConfiguration);
contents.put(1, new LabeledVector<Integer>(new DenseVector(new Serializable[] { 705.2, "HD", 29.97, 1, 1, 96.13 }), 2));
contents.put(2, new LabeledVector<Integer>(new DenseVector(new Serializable[] { 871.3, "HD", 30, 1, 1, 95.35 }), 3));
contents.put(3, new LabeledVector<Integer>(new DenseVector(new Serializable[] { 2890.2, "SD", 29.97, 1, 1, 95.65 }), 10));
contents.put(4, new LabeledVector<Integer>(new DenseVector(new Serializable[] { 1032, "SD", 29.97, 1, 1, 96.8 }), 4));

如何在功能 0 和 5 上使用 NormalizationTrainer 而在功能 1 上使用 EncoderTrainer?我想我很难理解如何在最终为模型训练器提供数据之前连接多个预处理。

我目前拥有的是这个(修改后的 Ignite 示例):

        Vectorizer<Integer, LabeledVector<Integer>, Integer, Integer> vectorizer   = new LabeledDummyVectorizer<Integer, Integer>(0, 5);
        Preprocessor<Integer, LabeledVector<Integer>>                 preprocessor1 = new NormalizationTrainer<Integer, LabeledVector<Integer>>().withP(1).fit(ignite, data, vectorizer);
        
        Preprocessor<Integer, LabeledVector<Integer>>                 preprocessor2 = new EncoderTrainer<Integer, LabeledVector<Integer>>().withEncoderType(EncoderType.STRING_ENCODER).withEncodedFeature(1).fit(ignite, data, preprocessor1);

        KNNClassificationTrainer                                      trainer       = new KNNClassificationTrainer();
        KNNClassificationModel                                        mdl           = trainer.fit(ignite, data, preprocessor2);

我对多重预处理器的理解正确吗?如果是这样,我将如何在功能 2 上添加另一个 BinarizationTrainer?我想我对在哪里指定应用预处理训练器的功能感到困惑。对于一个培训师 (NormalizationTrainer),我必须使用 Vectorizer 来判断要使用哪些功能,对于 EncoderTrainer,我可以将其作为方法函数来执行。然后我将如何添加带有另一个 Vectorizer 的 BinarizationTrainer?

一个预处理器建立在另一个之上。
坐标是相对于之前的预处理器。

这个例子展示了如何完成你想做的事情: https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java

这里打个断点:https://github.com/apache/ignite/blob/eabe50d90d5db2d363da36393cd957ff54a18d90/modules/ml/src/main/java/org/apache/ignite/ml/preprocessing/encoding/EncoderTrainer.java#L93

查看字符串编码器如何引用坐标 检查所有变量:

UpstreamEntry<K, V> entity = upstream.next(); //this is the row from the file
LabeledVector<Double> row = basePreprocessor.apply(entity.getKey(), entity.getValue()); //after the previous preprocessor has been applied
categoryFrequencies = calculateFrequencies(row, categoryFrequencies); //use the given coordinates to calculate results.

关于预处理的更多信息:https://apacheignite.readme.io/docs/preprocessing

或者,您可以使用管道 API 进行更简化的预处理:https://apacheignite.readme.io/docs/pipeline-api