You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ch...@apache.org on 2018/12/18 18:53:36 UTC
ignite git commit: IGNITE-10371: [ML] Add multiple metrics
calculation for Binary Classification Evaluation process
Repository: ignite
Updated Branches:
refs/heads/master ad9d5610e -> f2d6e4360
IGNITE-10371: [ML] Add multiple metrics calculation for
Binary Classification Evaluation process
This closes #5612
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f2d6e436
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f2d6e436
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f2d6e436
Branch: refs/heads/master
Commit: f2d6e43605f8daaa12c3cb729a1ddd56bf36f564
Parents: ad9d561
Author: zaleslaw <za...@gmail.com>
Authored: Tue Dec 18 21:53:32 2018 +0300
Committer: Yury Babak <yb...@gridgain.com>
Committed: Tue Dec 18 21:53:32 2018 +0300
----------------------------------------------------------------------
.../ml/selection/scoring/EvaluatorExample.java | 83 +++++++++
.../scoring/MultipleMetricsExample.java | 82 ++++++++
.../ml/tutorial/Step_1_Read_and_Learn.java | 6 +-
.../examples/ml/tutorial/Step_2_Imputing.java | 6 +-
.../examples/ml/tutorial/Step_3_Categorial.java | 6 +-
.../Step_3_Categorial_with_One_Hot_Encoder.java | 6 +-
.../ml/tutorial/Step_4_Add_age_fare.java | 6 +-
.../examples/ml/tutorial/Step_5_Scaling.java | 6 +-
.../tutorial/Step_5_Scaling_with_Pipeline.java | 6 +-
.../ignite/examples/ml/tutorial/Step_6_KNN.java | 6 +-
.../ml/tutorial/Step_7_Split_train_test.java | 6 +-
.../ignite/examples/ml/tutorial/Step_8_CV.java | 6 +-
.../ml/tutorial/Step_8_CV_with_Param_Grid.java | 6 +-
.../ml/tutorial/Step_9_Go_to_LogReg.java | 6 +-
.../cursor/CacheBasedLabelPairCursor.java | 6 +-
.../BinaryClassificationEvaluator.java | 184 ++++++++++++++++++
.../selection/scoring/evaluator/Evaluator.java | 104 -----------
.../ml/selection/scoring/metric/Accuracy.java | 5 +
.../BinaryClassificationMetricValues.java | 185 +++++++++++++++++++
.../metric/BinaryClassificationMetrics.java | 86 +++++++++
.../selection/scoring/metric/ClassMetric.java | 37 ++++
.../ml/selection/scoring/metric/Fmeasure.java | 22 ++-
.../ml/selection/scoring/metric/Metric.java | 9 +
.../ml/selection/scoring/metric/Precision.java | 23 ++-
.../ml/selection/scoring/metric/Recall.java | 22 ++-
.../metric/UnknownClassLabelException.java | 38 ++++
.../scoring/evaluator/EvaluatorTest.java | 6 +-
27 files changed, 789 insertions(+), 175 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java
new file mode 100644
index 0000000..a6a989b
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/EvaluatorExample.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.selection.scoring;
+
+import java.io.FileNotFoundException;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
+import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
+import org.apache.ignite.ml.svm.SVMLinearClassificationModel;
+import org.apache.ignite.ml.svm.SVMLinearClassificationTrainer;
+import org.apache.ignite.ml.util.MLSandboxDatasets;
+import org.apache.ignite.ml.util.SandboxMLCache;
+
+/**
+ * Run SVM classification trainer ({@link SVMLinearClassificationTrainer}) over distributed dataset.
+ * <p>
+ * Code in this example launches Ignite grid and fills the cache with test data points (based on the
+ * <a href="https://en.wikipedia.org/wiki/Iris_flower_data_set"></a>Iris dataset</a>).</p>
+ * <p>
+ * After that it trains the model based on the specified data using
+ * <a href="https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm">kNN</a> algorithm.</p>
+ * <p>
+ * Finally, this example loops over the test set of data points, applies the trained model to predict what cluster
+ * does this point belong to, and compares prediction to expected outcome (ground truth).</p>
+ * <p>
+ * You can change the test data used in this example and re-run it to explore this algorithm further.</p>
+ */
+public class EvaluatorExample {
+ /** Run example. */
+ public static void main(String[] args) throws FileNotFoundException {
+ System.out.println();
+ System.out.println(">>> kNN multi-class classification algorithm over cached dataset usage example started.");
+ // Start ignite grid.
+ try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+ System.out.println(">>> Ignite grid started.");
+
+ IgniteCache<Integer, Vector> dataCache = new SandboxMLCache(ignite)
+ .fillCacheWith(MLSandboxDatasets.TWO_CLASSED_IRIS);
+
+ SVMLinearClassificationTrainer trainer = new SVMLinearClassificationTrainer();
+
+ IgniteBiFunction<Integer, Vector, Vector> featureExtractor = (k, v) -> v.copyOfRange(1, v.size());
+ IgniteBiFunction<Integer, Vector, Double> lbExtractor = (k, v) -> v.get(0);
+
+ SVMLinearClassificationModel mdl = trainer.fit(
+ ignite,
+ dataCache,
+ featureExtractor,
+ lbExtractor
+ );
+
+ double accuracy = BinaryClassificationEvaluator.evaluate(
+ dataCache,
+ mdl,
+ featureExtractor,
+ lbExtractor,
+ new Accuracy<>()
+ );
+
+ System.out.println("\n>>> Accuracy " + accuracy);
+ System.out.println("\n>>> Test Error " + (1 - accuracy));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java
new file mode 100644
index 0000000..b8c76e0
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/selection/scoring/MultipleMetricsExample.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.selection.scoring;
+
+import java.io.FileNotFoundException;
+import java.util.Map;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.ml.knn.classification.KNNClassificationTrainer;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
+import org.apache.ignite.ml.svm.SVMLinearClassificationModel;
+import org.apache.ignite.ml.svm.SVMLinearClassificationTrainer;
+import org.apache.ignite.ml.util.MLSandboxDatasets;
+import org.apache.ignite.ml.util.SandboxMLCache;
+
+/**
+ * Run kNN multi-class classification trainer ({@link KNNClassificationTrainer}) over distributed dataset.
+ * <p>
+ * Code in this example launches Ignite grid and fills the cache with test data points (based on the
+ * <a href="https://en.wikipedia.org/wiki/Iris_flower_data_set"></a>Iris dataset</a>).</p>
+ * <p>
+ * After that it trains the model based on the specified data using
+ * <a href="https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm">kNN</a> algorithm.</p>
+ * <p>
+ * Finally, this example loops over the test set of data points, applies the trained model to predict what cluster
+ * does this point belong to, and compares prediction to expected outcome (ground truth).</p>
+ * <p>
+ * You can change the test data used in this example and re-run it to explore this algorithm further.</p>
+ */
+public class MultipleMetricsExample {
+ /** Run example. */
+ public static void main(String[] args) throws FileNotFoundException {
+ // Start ignite grid.
+ try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+ System.out.println(">>> Ignite grid started.");
+
+ IgniteCache<Integer, Vector> dataCache = new SandboxMLCache(ignite)
+ .fillCacheWith(MLSandboxDatasets.TWO_CLASSED_IRIS);
+
+ SVMLinearClassificationTrainer trainer = new SVMLinearClassificationTrainer();
+
+ IgniteBiFunction<Integer, Vector, Vector> featureExtractor = (k, v) -> v.copyOfRange(1, v.size());
+ IgniteBiFunction<Integer, Vector, Double> lbExtractor = (k, v) -> v.get(0);
+
+ SVMLinearClassificationModel mdl = trainer.fit(
+ ignite,
+ dataCache,
+ featureExtractor,
+ lbExtractor
+ );
+
+ Map<String, Double> scores = BinaryClassificationEvaluator.evaluate(
+ dataCache,
+ mdl,
+ featureExtractor,
+ lbExtractor
+ ).toMap();
+
+ scores.forEach(
+ (metricName, score) -> System.out.println("\n>>>" + metricName + ": " + score)
+ );
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
index 481fa1d..0cbde9c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
@@ -24,7 +24,7 @@ import org.apache.ignite.Ignition;
import org.apache.ignite.ml.math.functions.IgniteBiFunction;
import org.apache.ignite.ml.math.primitives.vector.Vector;
import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
import org.apache.ignite.ml.tree.DecisionTreeNode;
@@ -38,7 +38,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* After that it trains the model based on the specified data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_1_Read_and_Learn {
/** Run example. */
@@ -66,7 +66,7 @@ public class Step_1_Read_and_Learn {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
featureExtractor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
index d60dc4b..6fe41ab 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
@@ -25,7 +25,7 @@ import org.apache.ignite.ml.math.functions.IgniteBiFunction;
import org.apache.ignite.ml.math.primitives.vector.Vector;
import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
import org.apache.ignite.ml.tree.DecisionTreeNode;
@@ -40,7 +40,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_2_Imputing {
/** Run example. */
@@ -75,7 +75,7 @@ public class Step_2_Imputing {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
imputingPreprocessor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
index ac2fe08..f9bd014 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
@@ -26,7 +26,7 @@ import org.apache.ignite.ml.math.primitives.vector.Vector;
import org.apache.ignite.ml.preprocessing.encoding.EncoderTrainer;
import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
import org.apache.ignite.ml.tree.DecisionTreeNode;
@@ -43,7 +43,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_3_Categorial {
/** Run example. */
@@ -88,7 +88,7 @@ public class Step_3_Categorial {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
imputingPreprocessor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial_with_One_Hot_Encoder.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial_with_One_Hot_Encoder.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial_with_One_Hot_Encoder.java
index f0b6efe..0b3e235 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial_with_One_Hot_Encoder.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial_with_One_Hot_Encoder.java
@@ -26,7 +26,7 @@ import org.apache.ignite.ml.math.primitives.vector.Vector;
import org.apache.ignite.ml.preprocessing.encoding.EncoderTrainer;
import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
import org.apache.ignite.ml.tree.DecisionTreeNode;
@@ -44,7 +44,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_3_Categorial_with_One_Hot_Encoder {
/** Run example. */
@@ -91,7 +91,7 @@ public class Step_3_Categorial_with_One_Hot_Encoder {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
imputingPreprocessor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
index 71e9efd..7576cd6 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
@@ -26,7 +26,7 @@ import org.apache.ignite.ml.math.primitives.vector.Vector;
import org.apache.ignite.ml.preprocessing.encoding.EncoderTrainer;
import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
import org.apache.ignite.ml.tree.DecisionTreeNode;
@@ -41,7 +41,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_4_Add_age_fare {
/** Run example. */
@@ -87,7 +87,7 @@ public class Step_4_Add_age_fare {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
imputingPreprocessor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
index fe7bf91..065eb90 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
@@ -28,7 +28,7 @@ import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
import org.apache.ignite.ml.tree.DecisionTreeNode;
@@ -44,7 +44,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_5_Scaling {
/** Run example. */
@@ -105,7 +105,7 @@ public class Step_5_Scaling {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
normalizationPreprocessor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling_with_Pipeline.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling_with_Pipeline.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling_with_Pipeline.java
index bd7cc21..2e97ccb 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling_with_Pipeline.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling_with_Pipeline.java
@@ -29,7 +29,7 @@ import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
@@ -44,7 +44,7 @@ import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_5_Scaling_with_Pipeline {
/** Run example. */
@@ -79,7 +79,7 @@ public class Step_5_Scaling_with_Pipeline {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
mdl.getFeatureExtractor(),
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
index a35b841..d7a0b88 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
@@ -31,7 +31,7 @@ import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
/**
@@ -45,7 +45,7 @@ import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
* <p>
* Then, it trains the model based on the processed data using kNN classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_6_KNN {
/** Run example. */
@@ -106,7 +106,7 @@ public class Step_6_KNN {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
mdl,
normalizationPreprocessor,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
index 53d4d0a..a988abe 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
@@ -28,7 +28,7 @@ import org.apache.ignite.ml.preprocessing.encoding.EncoderType;
import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
import org.apache.ignite.ml.selection.split.TrainTestSplit;
@@ -47,7 +47,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* <p>
* Then, it trains the model based on the processed data using decision tree classification.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_7_Split_train_test {
/** Run example. */
@@ -112,7 +112,7 @@ public class Step_7_Split_train_test {
System.out.println("\n>>> Trained model: " + mdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
split.getTestFilter(),
mdl,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
index feedccf..8a962f3 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
@@ -30,7 +30,7 @@ import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
import org.apache.ignite.ml.selection.cv.CrossValidation;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
import org.apache.ignite.ml.selection.split.TrainTestSplit;
@@ -48,7 +48,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* Then, it tunes hyperparams with K-fold Cross-Validation on the split training set and trains the model based on
* the processed data using decision tree classification and the obtained hyperparams.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
* <p>
* The purpose of cross-validation is model checking, not model building.</p>
* <p>
@@ -175,7 +175,7 @@ public class Step_8_CV {
System.out.println("\n>>> Trained model: " + bestMdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
split.getTestFilter(),
bestMdl,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
index 670f025..19951a2 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV_with_Param_Grid.java
@@ -32,7 +32,7 @@ import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
import org.apache.ignite.ml.selection.cv.CrossValidation;
import org.apache.ignite.ml.selection.cv.CrossValidationResult;
import org.apache.ignite.ml.selection.paramgrid.ParamGrid;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
import org.apache.ignite.ml.selection.split.TrainTestSplit;
@@ -50,7 +50,7 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
* Then, it tunes hyperparams with K-fold Cross-Validation on the split training set and trains the model based on
* the processed data using decision tree classification and the obtained hyperparams.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
* <p>
* The purpose of cross-validation is model checking, not model building.</p>
* <p>
@@ -163,7 +163,7 @@ public class Step_8_CV_with_Param_Grid {
System.out.println("\n>>> Trained model: " + bestMdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
split.getTestFilter(),
bestMdl,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
index 58466bd..eb12e58 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
@@ -35,7 +35,7 @@ import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
import org.apache.ignite.ml.regressions.logistic.LogisticRegressionModel;
import org.apache.ignite.ml.regressions.logistic.LogisticRegressionSGDTrainer;
import org.apache.ignite.ml.selection.cv.CrossValidation;
-import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
+import org.apache.ignite.ml.selection.scoring.evaluator.BinaryClassificationEvaluator;
import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
import org.apache.ignite.ml.selection.split.TrainTestDatasetSplitter;
import org.apache.ignite.ml.selection.split.TrainTestSplit;
@@ -52,7 +52,7 @@ import org.apache.ignite.ml.selection.split.TrainTestSplit;
* Then, it tunes hyperparams with K-fold Cross-Validation on the split training set and trains the model based on
* the processed data using logistic regression and the obtained hyperparams.</p>
* <p>
- * Finally, this example uses {@link Evaluator} functionality to compute metrics from predictions.</p>
+ * Finally, this example uses {@link BinaryClassificationEvaluator} functionality to compute metrics from predictions.</p>
*/
public class Step_9_Go_to_LogReg {
/** Run example. */
@@ -207,7 +207,7 @@ public class Step_9_Go_to_LogReg {
System.out.println("\n>>> Trained model: " + bestMdl);
- double accuracy = Evaluator.evaluate(
+ double accuracy = BinaryClassificationEvaluator.evaluate(
dataCache,
split.getTestFilter(),
bestMdl,
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/cursor/CacheBasedLabelPairCursor.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/cursor/CacheBasedLabelPairCursor.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/cursor/CacheBasedLabelPairCursor.java
index 037cf45..06be96b 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/cursor/CacheBasedLabelPairCursor.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/cursor/CacheBasedLabelPairCursor.java
@@ -98,12 +98,14 @@ public class CacheBasedLabelPairCursor<L, K, V> implements LabelPairCursor<L> {
* Queries the specified cache using the specified filter.
*
* @param upstreamCache Ignite cache with {@code upstream} data.
- * @param filter Filter for {@code upstream} data.
+ * @param filter Filter for {@code upstream} data. If {@code null} then all entries will be returned.
* @return Query cursor.
*/
private QueryCursor<Cache.Entry<K, V>> query(IgniteCache<K, V> upstreamCache, IgniteBiPredicate<K, V> filter) {
ScanQuery<K, V> qry = new ScanQuery<>();
- qry.setFilter(filter);
+
+ if (filter != null) // This section was added to keep code correct of qry.setFilter(null) behaviour will changed.
+ qry.setFilter(filter);
return upstreamCache.query(qry);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/BinaryClassificationEvaluator.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/BinaryClassificationEvaluator.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/BinaryClassificationEvaluator.java
new file mode 100644
index 0000000..30adc5c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/BinaryClassificationEvaluator.java
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.selection.scoring.evaluator;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.ml.Model;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.selection.scoring.cursor.CacheBasedLabelPairCursor;
+import org.apache.ignite.ml.selection.scoring.cursor.LabelPairCursor;
+import org.apache.ignite.ml.selection.scoring.metric.BinaryClassificationMetricValues;
+import org.apache.ignite.ml.selection.scoring.metric.BinaryClassificationMetrics;
+import org.apache.ignite.ml.selection.scoring.metric.Metric;
+
+/**
+ * Binary classification evaluator that computes metrics from predictions and ground truth values.
+ */
+public class BinaryClassificationEvaluator {
+ /**
+ * Computes the given metric on the given cache.
+ *
+ * @param dataCache The given cache.
+ * @param mdl The model.
+ * @param featureExtractor The feature extractor.
+ * @param lbExtractor The label extractor.
+ * @param metric The binary classification metric.
+ * @param <K> The type of cache entry key.
+ * @param <V> The type of cache entry value.
+ * @return Computed metric.
+ */
+ public static <L, K, V> double evaluate(IgniteCache<K, V> dataCache,
+ Model<Vector, L> mdl,
+ IgniteBiFunction<K, V, Vector> featureExtractor,
+ IgniteBiFunction<K, V, L> lbExtractor,
+ Metric<L> metric) {
+
+ return calculateMetric(dataCache, null, mdl, featureExtractor, lbExtractor, metric);
+ }
+
+ /**
+ * Computes the given metric on the given cache.
+ *
+ * @param dataCache The given cache.
+ * @param filter The given filter.
+ * @param mdl The model.
+ * @param featureExtractor The feature extractor.
+ * @param lbExtractor The label extractor.
+ * @param metric The binary classification metric.
+ * @param <L> The type of label.
+ * @param <K> The type of cache entry key.
+ * @param <V> The type of cache entry value.
+ * @return Computed metric.
+ */
+ public static <L, K, V> double evaluate(IgniteCache<K, V> dataCache, IgniteBiPredicate<K, V> filter,
+ Model<Vector, L> mdl,
+ IgniteBiFunction<K, V, Vector> featureExtractor,
+ IgniteBiFunction<K, V, L> lbExtractor,
+ Metric<L> metric) {
+
+ return calculateMetric(dataCache, filter, mdl, featureExtractor, lbExtractor, metric);
+ }
+
+ /**
+ * Computes the given metrics on the given cache.
+ *
+ * @param dataCache The given cache.
+ * @param mdl The model.
+ * @param featureExtractor The feature extractor.
+ * @param lbExtractor The label extractor.
+ * @param <K> The type of cache entry key.
+ * @param <V> The type of cache entry value.
+ * @return Computed metric.
+ */
+ public static <K, V> BinaryClassificationMetricValues evaluate(IgniteCache<K, V> dataCache,
+ Model<Vector, Double> mdl,
+ IgniteBiFunction<K, V, Vector> featureExtractor,
+ IgniteBiFunction<K, V, Double> lbExtractor) {
+ return calcMetricValues(dataCache, null, mdl, featureExtractor, lbExtractor);
+ }
+
+ /**
+ * Computes the given metrics on the given cache.
+ *
+ * @param dataCache The given cache.
+ * @param filter The given filter.
+ * @param mdl The model.
+ * @param featureExtractor The feature extractor.
+ * @param lbExtractor The label extractor.
+ * @param <K> The type of cache entry key.
+ * @param <V> The type of cache entry value.
+ * @return Computed metric.
+ */
+ public static <K, V> BinaryClassificationMetricValues evaluate(IgniteCache<K, V> dataCache, IgniteBiPredicate<K, V> filter,
+ Model<Vector, Double> mdl,
+ IgniteBiFunction<K, V, Vector> featureExtractor,
+ IgniteBiFunction<K, V, Double> lbExtractor) {
+ return calcMetricValues(dataCache, filter, mdl, featureExtractor, lbExtractor);
+ }
+
+ /**
+ * Computes the given metrics on the given cache.
+ *
+ * @param dataCache The given cache.
+ * @param filter The given filter.
+ * @param mdl The model.
+ * @param featureExtractor The feature extractor.
+ * @param lbExtractor The label extractor.
+ * @param <K> The type of cache entry key.
+ * @param <V> The type of cache entry value.
+ * @return Computed metric.
+ */
+ private static <K, V> BinaryClassificationMetricValues calcMetricValues(IgniteCache<K, V> dataCache,
+ IgniteBiPredicate<K, V> filter,
+ Model<Vector, Double> mdl,
+ IgniteBiFunction<K, V, Vector> featureExtractor,
+ IgniteBiFunction<K, V, Double> lbExtractor) {
+ BinaryClassificationMetricValues metricValues;
+ BinaryClassificationMetrics binaryMetrics = new BinaryClassificationMetrics();
+
+ try (LabelPairCursor<Double> cursor = new CacheBasedLabelPairCursor<>(
+ dataCache,
+ filter,
+ featureExtractor,
+ lbExtractor,
+ mdl
+ )) {
+ metricValues = binaryMetrics.score(cursor.iterator());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ return metricValues;
+ }
+
+ /**
+ * Computes the given metric on the given cache.
+ *
+ * @param dataCache The given cache.
+ * @param filter The given filter.
+ * @param mdl The model.
+ * @param featureExtractor The feature extractor.
+ * @param lbExtractor The label extractor.
+ * @param metric The binary classification metric.
+ * @param <L> The type of label.
+ * @param <K> The type of cache entry key.
+ * @param <V> The type of cache entry value.
+ * @return Computed metric.
+ */
+ private static <L, K, V> double calculateMetric(IgniteCache<K, V> dataCache, IgniteBiPredicate<K, V> filter,
+ Model<Vector, L> mdl, IgniteBiFunction<K, V, Vector> featureExtractor, IgniteBiFunction<K, V, L> lbExtractor,
+ Metric<L> metric) {
+ double metricRes;
+
+ try (LabelPairCursor<L> cursor = new CacheBasedLabelPairCursor<>(
+ dataCache,
+ filter,
+ featureExtractor,
+ lbExtractor,
+ mdl
+ )) {
+ metricRes = metric.score(cursor.iterator());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ return metricRes;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/Evaluator.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/Evaluator.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/Evaluator.java
deleted file mode 100644
index 4535831..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/evaluator/Evaluator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.ml.selection.scoring.evaluator;
-
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.lang.IgniteBiPredicate;
-import org.apache.ignite.ml.Model;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
-import org.apache.ignite.ml.selection.scoring.cursor.CacheBasedLabelPairCursor;
-import org.apache.ignite.ml.selection.scoring.cursor.LabelPairCursor;
-import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
-
-/**
- * Binary classification evaluator that compute metrics from predictions.
- */
-public class Evaluator {
- /**
- * Computes the given metric on the given cache.
- *
- * @param dataCache The given cache.
- * @param mdl The model.
- * @param featureExtractor The feature extractor.
- * @param lbExtractor The label extractor.
- * @param metric The binary classification metric.
- * @param <L> The type of label.
- * @param <K> The type of cache entry key.
- * @param <V> The type of cache entry value.
- * @return Computed metric.
- */
- public static <L, K, V> double evaluate(IgniteCache<K, V> dataCache,
- Model<Vector, L> mdl,
- IgniteBiFunction<K, V, Vector> featureExtractor,
- IgniteBiFunction<K, V, L> lbExtractor,
- Accuracy<L> metric) {
- double metricRes;
-
- try (LabelPairCursor<L> cursor = new CacheBasedLabelPairCursor<L, K, V>(
- dataCache,
- featureExtractor,
- lbExtractor,
- mdl
- )) {
- metricRes = metric.score(cursor.iterator());
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- return metricRes;
- }
-
- /**
- * Computes the given metric on the given cache.
- *
- * @param dataCache The given cache.
- * @param filter The given filter.
- * @param mdl The model.
- * @param featureExtractor The feature extractor.
- * @param lbExtractor The label extractor.
- * @param metric The binary classification metric.
- * @param <L> The type of label.
- * @param <K> The type of cache entry key.
- * @param <V> The type of cache entry value.
- * @return Computed metric.
- */
- public static <L, K, V> double evaluate(IgniteCache<K, V> dataCache, IgniteBiPredicate<K, V> filter,
- Model<Vector, L> mdl,
- IgniteBiFunction<K, V, Vector> featureExtractor,
- IgniteBiFunction<K, V, L> lbExtractor,
- Accuracy<L> metric) {
- double metricRes;
-
- try (LabelPairCursor<L> cursor = new CacheBasedLabelPairCursor<L, K, V>(
- dataCache,
- filter,
- featureExtractor,
- lbExtractor,
- mdl
- )) {
- metricRes = metric.score(cursor.iterator());
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- return metricRes;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Accuracy.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Accuracy.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Accuracy.java
index 30e6299..fd0656c 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Accuracy.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Accuracy.java
@@ -45,4 +45,9 @@ public class Accuracy<L> implements Metric<L> {
return 1.0 * correctCnt / totalCnt;
}
+
+ /** {@inheritDoc} */
+ @Override public String name() {
+ return "accuracy";
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetricValues.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetricValues.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetricValues.java
new file mode 100644
index 0000000..04cd981
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetricValues.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.selection.scoring.metric;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Provides access to binary metric values.
+ */
+public class BinaryClassificationMetricValues {
+ /** True Positive (TP). */
+ private double tp;
+
+ /** True Negative (TN). */
+ private double tn;
+
+ /** False Positive (FP). */
+ private double fp;
+
+ /** False Negative (FN). */
+ private double fn;
+
+ /** Sensitivity or True Positive Rate (TPR). */
+ private double recall;
+
+ /** Specificity (SPC) or True Negative Rate (TNR). */
+ private double specificity;
+
+ /** Precision or Positive Predictive Value (PPV). */
+ private double precision;
+
+ /** Negative Predictive Value (NPV). */
+ private double npv;
+
+ /** Fall-out or False Positive Rate (FPR). */
+ private double fallOut;
+
+ /** False Discovery Rate (FDR). */
+ private double fdr;
+
+ /** Miss Rate or False Negative Rate (FNR). */
+ private double missRate;
+
+ /** Accuracy. */
+ private double accuracy;
+
+ /** Balanced accuracy. */
+ private double balancedAccuracy;
+
+ /** F1-Score is the harmonic mean of Precision and Sensitivity. */
+ private double f1Score;
+
+ /**
+ * Initialize an example by 4 metrics.
+ *
+ * @param tp True Positive (TP).
+ * @param tn True Negative (TN).
+ * @param fp False Positive (FP).
+ * @param fn False Negative (FN).
+ */
+ public BinaryClassificationMetricValues(long tp, long tn, long fp, long fn) {
+ this.tp = tp;
+ this.tn = tn;
+ this.fp = fp;
+ this.fn = fn;
+
+ long p = tp + fn;
+ long n = tn + fp;
+ long positivePredictions = tp + fp;
+ long negativePredictions = tn + fn;
+
+ // according to https://github.com/dice-group/gerbil/wiki/Precision,-Recall-and-F1-measure
+ recall = p == 0 ? 1 : (double)tp / p;
+ precision = positivePredictions == 0 ? 1 : (double)tp / positivePredictions;
+ specificity = n == 0 ? 1 : (double)tn / n;
+ npv = negativePredictions == 0 ? 1 : (double)tn / negativePredictions;
+ fallOut = n == 0 ? 1 : (double)fp / n;
+ fdr = positivePredictions == 0 ? 1 : (double)fp / positivePredictions;
+ missRate = p == 0 ? 1 : (double)fn / p;
+
+ f1Score = 2 * (recall * precision) / (recall + precision);
+
+ accuracy = (p + n) == 0 ? 1 : (double)(tp + tn) / (p + n); // multiplication on 1.0 to make double
+ balancedAccuracy = p == 0 && n == 0 ? 1 : ((double)tp / p + (double)tn / n) / 2;
+ }
+
+ /** */
+ public double tp() {
+ return tp;
+ }
+
+ /** */
+ public double tn() {
+ return tn;
+ }
+
+ /** */
+ public double fp() {
+ return fp;
+ }
+
+ /** */
+ public double fn() {
+ return fn;
+ }
+
+ /** Returns Sensitivity or True Positive Rate (TPR). */
+ public double recall() {
+ return recall;
+ }
+
+ /** Returns Specificity (SPC) or True Negative Rate (TNR). */
+ public double specificity() {
+ return specificity;
+ }
+
+ /** Returns Precision or Positive Predictive Value (PPV). */
+ public double precision() {
+ return precision;
+ }
+
+ /** Returns Negative Predictive Value (NPV). */
+ public double npv() {
+ return npv;
+ }
+
+ /** Returns Fall-out or False Positive Rate (FPR). */
+ public double fallOut() {
+ return fallOut;
+ }
+
+ /** Returns False Discovery Rate (FDR). */
+ public double fdr() {
+ return fdr;
+ }
+
+ /** Returns Miss Rate or False Negative Rate (FNR). */
+ public double missRate() {
+ return missRate;
+ }
+
+ /** Returns Accuracy. */
+ public double accuracy() {
+ return accuracy;
+ }
+
+ /** Returns Balanced accuracy. */
+ public double balancedAccuracy() {
+ return balancedAccuracy;
+ }
+
+ /** Returns F1-Score is the harmonic mean of Precision and Sensitivity. */
+ public double f1Score() {
+ return f1Score;
+ }
+
+ /** Returns the pair of metric name and metric value. */
+ public Map<String, Double> toMap() {
+ Map<String, Double> metricValues = new HashMap<>();
+ for (Field field : getClass().getDeclaredFields())
+ try {
+ metricValues.put(field.getName(), field.getDouble(this));
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return metricValues;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetrics.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetrics.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetrics.java
new file mode 100644
index 0000000..0b15d04
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/BinaryClassificationMetrics.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.selection.scoring.metric;
+
+import java.util.Iterator;
+import org.apache.ignite.ml.selection.scoring.LabelPair;
+
+/**
+ * Binary classification metrics calculator.
+ */
+public class BinaryClassificationMetrics {
+ /** Positive class label. */
+ private double positiveClsLb = 1.0;
+
+ /** Negative class label. Default value is 0.0. */
+ private double negativeClsLb;
+
+ /**
+ * Calculates binary metrics values.
+ *
+ * @param iter Iterator that supplies pairs of truth values and predicated.
+ * @return Scores for all binary metrics.
+ */
+ public BinaryClassificationMetricValues score(Iterator<LabelPair<Double>> iter) {
+ long tp = 0;
+ long tn = 0;
+ long fp = 0;
+ long fn = 0;
+
+ while (iter.hasNext()) {
+ LabelPair<Double> e = iter.next();
+
+ double prediction = e.getPrediction();
+ double truth = e.getTruth();
+
+ if (prediction != negativeClsLb && prediction != positiveClsLb)
+ throw new UnknownClassLabelException(prediction, positiveClsLb, negativeClsLb);
+ if (truth != negativeClsLb && truth != positiveClsLb)
+ throw new UnknownClassLabelException(truth, positiveClsLb, negativeClsLb);
+
+ if (truth == positiveClsLb && prediction == positiveClsLb) tp++;
+ else if (truth == positiveClsLb && prediction == negativeClsLb) fn++;
+ else if (truth == negativeClsLb && prediction == negativeClsLb) tn++;
+ else if (truth == negativeClsLb && prediction == positiveClsLb) fp++;
+ }
+
+ return new BinaryClassificationMetricValues(tp, tn, fp, fn);
+ }
+
+ /** */
+ public double positiveClsLb() {
+ return positiveClsLb;
+ }
+
+ /** */
+ public BinaryClassificationMetrics withPositiveClsLb(double positiveClsLb) {
+ this.positiveClsLb = positiveClsLb;
+ return this;
+ }
+
+ /** */
+ public double negativeClsLb() {
+ return negativeClsLb;
+ }
+
+ /** */
+ public BinaryClassificationMetrics withNegativeClsLb(double negativeClsLb) {
+ this.negativeClsLb = negativeClsLb;
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/ClassMetric.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/ClassMetric.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/ClassMetric.java
new file mode 100644
index 0000000..f89e683
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/ClassMetric.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.selection.scoring.metric;
+
+/**
+ * Metric calculator for one class label.
+ *
+ * @param <L> Type of a label (truth or prediction).
+ */
+public abstract class ClassMetric<L> implements Metric<L> {
+ /** Class label. */
+ protected L clsLb;
+
+ /**
+ * The class of interest or positive class.
+ *
+ * @param clsLb The label.
+ */
+ public ClassMetric(L clsLb) {
+ this.clsLb = clsLb;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Fmeasure.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Fmeasure.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Fmeasure.java
index 1267584..fe36f51 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Fmeasure.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Fmeasure.java
@@ -25,9 +25,15 @@ import org.apache.ignite.ml.selection.scoring.LabelPair;
*
* @param <L> Type of a label (truth or prediction).
*/
-public class Fmeasure<L> implements Metric<L> {
- /** Class label. */
- private L clsLb;
+public class Fmeasure<L> extends ClassMetric<L> {
+ /**
+ * The class of interest or positive class.
+ *
+ * @param clsLb The label.
+ */
+ public Fmeasure(L clsLb) {
+ super(clsLb);
+ }
/** {@inheritDoc} */
@Override public double score(Iterator<LabelPair<L>> it) {
@@ -68,12 +74,8 @@ public class Fmeasure<L> implements Metric<L> {
return Double.NaN;
}
- /**
- * The class of interest or positive class.
- *
- * @param clsLb The label.
- */
- public Fmeasure(L clsLb) {
- this.clsLb = clsLb;
+ /** {@inheritDoc} */
+ @Override public String name() {
+ return "F-measure for class with label " + clsLb;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Metric.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Metric.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Metric.java
index 60d1e41..783d7fc 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Metric.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Metric.java
@@ -33,4 +33,13 @@ public interface Metric<L> {
* @return Score.
*/
public double score(Iterator<LabelPair<L>> iter);
+
+ /**
+ * Returns the metric's name.
+ *
+ * NOTE: Should be unique to calculate multiple metrics correctly.
+ *
+ * @return String name representation.
+ */
+ public String name();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Precision.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Precision.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Precision.java
index 0a583c8..482a027 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Precision.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Precision.java
@@ -25,9 +25,15 @@ import org.apache.ignite.ml.selection.scoring.LabelPair;
*
* @param <L> Type of a label (truth or prediction).
*/
-public class Precision<L> implements Metric<L> {
- /** Class label. */
- private L clsLb;
+public class Precision<L> extends ClassMetric<L> {
+ /**
+ * The class of interest or positive class.
+ *
+ * @param clsLb The label.
+ */
+ public Precision(L clsLb) {
+ super(clsLb);
+ }
/** {@inheritDoc} */
@Override public double score(Iterator<LabelPair<L>> it) {
@@ -59,12 +65,9 @@ public class Precision<L> implements Metric<L> {
return Double.NaN;
}
- /**
- * The class of interest or positive class.
- *
- * @param clsLb The label.
- */
- public Precision(L clsLb) {
- this.clsLb = clsLb;
+ /** {@inheritDoc} */
+ @Override public String name() {
+ return "precision for class with label " + clsLb;
}
+
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Recall.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Recall.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Recall.java
index 60324e7..d459e94 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Recall.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/Recall.java
@@ -25,9 +25,15 @@ import org.apache.ignite.ml.selection.scoring.LabelPair;
*
* @param <L> Type of a label (truth or prediction).
*/
-public class Recall<L> implements Metric<L> {
- /** Class label. */
- private L clsLb;
+public class Recall<L> extends ClassMetric<L> {
+ /**
+ * The class of interest or positive class.
+ *
+ * @param clsLb The label.
+ */
+ public Recall(L clsLb) {
+ super(clsLb);
+ }
/** {@inheritDoc} */
@Override public double score(Iterator<LabelPair<L>> it) {
@@ -59,12 +65,8 @@ public class Recall<L> implements Metric<L> {
return Double.NaN;
}
- /**
- * The class of interest or positive class.
- *
- * @param clsLb The label.
- */
- public Recall(L clsLb) {
- this.clsLb = clsLb;
+ /** {@inheritDoc} */
+ @Override public String name() {
+ return "recall for class with label " + clsLb;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/UnknownClassLabelException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/UnknownClassLabelException.java b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/UnknownClassLabelException.java
new file mode 100644
index 0000000..0531f2e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/selection/scoring/metric/UnknownClassLabelException.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.selection.scoring.metric;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * Indicates an unknown class label for metric calculator.
+ */
+public class UnknownClassLabelException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+
+ /**
+ * @param incorrectVal Incorrect value.
+ * @param positiveClsLb Positive class label.
+ * @param negativeClsLb Negative class label.
+ */
+ public UnknownClassLabelException(double incorrectVal, double positiveClsLb, double negativeClsLb) {
+ super("The next class label: " + incorrectVal + " is not positive class label: " + positiveClsLb + " or negative class label: " + negativeClsLb);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f2d6e436/modules/ml/src/test/java/org/apache/ignite/ml/selection/scoring/evaluator/EvaluatorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/selection/scoring/evaluator/EvaluatorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/selection/scoring/evaluator/EvaluatorTest.java
index 1abf7f0..f17ac73 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/selection/scoring/evaluator/EvaluatorTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/selection/scoring/evaluator/EvaluatorTest.java
@@ -52,7 +52,7 @@ import static org.apache.ignite.ml.TestUtils.testEnvBuilder;
import static org.junit.Assert.assertArrayEquals;
/**
- * Tests for {@link Evaluator} that require to start the whole Ignite infrastructure. IMPL NOTE based on
+ * Tests for {@link BinaryClassificationEvaluator} that require to start the whole Ignite infrastructure. IMPL NOTE based on
* Step_8_CV_with_Param_Grid example.
*/
public class EvaluatorTest extends GridCommonAbstractTest {
@@ -260,7 +260,7 @@ public class EvaluatorTest extends GridCommonAbstractTest {
lbExtractor
);
- actualAccuracy.set(Evaluator.evaluate(
+ actualAccuracy.set(BinaryClassificationEvaluator.evaluate(
cache,
split.getTestFilter(),
bestMdl,
@@ -269,7 +269,7 @@ public class EvaluatorTest extends GridCommonAbstractTest {
new Accuracy<>()
));
- actualAccuracy2.set(Evaluator.evaluate(
+ actualAccuracy2.set(BinaryClassificationEvaluator.evaluate(
cache,
bestMdl,
preprocessor,