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/11 11:41:48 UTC
ignite git commit: IGNITE-10428: [ML] Add example for OneVsRest
trainer/model usage
Repository: ignite
Updated Branches:
refs/heads/master 7633e18f1 -> e82ab505b
IGNITE-10428: [ML] Add example for OneVsRest trainer/model usage
This closes #5631
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e82ab505
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e82ab505
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e82ab505
Branch: refs/heads/master
Commit: e82ab505bb9b416239a6b943ec07db26162a7400
Parents: 7633e18
Author: zaleslaw <za...@gmail.com>
Authored: Tue Dec 11 14:41:38 2018 +0300
Committer: Yury Babak <yb...@gridgain.com>
Committed: Tue Dec 11 14:41:38 2018 +0300
----------------------------------------------------------------------
.../OneVsRestClassificationExample.java | 162 +++++++++++++++++++
.../examples/ml/multiclass/package-info.java | 22 +++
.../ignite/ml/multiclass/package-info.java | 22 +++
3 files changed, 206 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e82ab505/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java
new file mode 100644
index 0000000..d3e030b
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/OneVsRestClassificationExample.java
@@ -0,0 +1,162 @@
+/*
+ * 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.multiclass;
+
+import java.io.FileNotFoundException;
+import java.util.Arrays;
+import javax.cache.Cache;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.multiclass.MultiClassModel;
+import org.apache.ignite.ml.multiclass.OneVsRestTrainer;
+import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
+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 One-vs-Rest multi-class classification trainer ({@link OneVsRestTrainer}) parametrized by binary SVM classifier
+ * ({@link SVMLinearClassificationTrainer}) over distributed dataset
+ * to build two models: one with min-max scaling and one without min-max scaling.
+ * <p>
+ * Code in this example launches Ignite grid and fills the cache with test data points (preprocessed
+ * <a href="https://archive.ics.uci.edu/ml/datasets/Glass+Identification">Glass dataset</a>).</p>
+ * <p>
+ * After that it trains two One-vs-Rest multi-class models based on the specified data - one model is with min-max scaling
+ * and one without min-max scaling.</p>
+ * <p>
+ * Finally, this example loops over the test set of data points, applies the trained models to predict what cluster
+ * does this point belong to, compares prediction to expected outcome (ground truth), and builds
+ * <a href="https://en.wikipedia.org/wiki/Confusion_matrix">confusion matrix</a>.</p>
+ * <p>
+ * You can change the test data used in this example and re-run it to explore this algorithm further.</p>
+ * NOTE: the smallest 3rd class could not be classified via linear SVM here.
+ */
+public class OneVsRestClassificationExample {
+ /** Run example. */
+ public static void main(String[] args) throws FileNotFoundException {
+ System.out.println();
+ System.out.println(">>> One-vs-Rest SVM Multi-class classification model 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.GLASS_IDENTIFICATION);
+
+ OneVsRestTrainer<SVMLinearClassificationModel> trainer
+ = new OneVsRestTrainer<>(new SVMLinearClassificationTrainer()
+ .withAmountOfIterations(20)
+ .withAmountOfLocIterations(50)
+ .withLambda(0.2)
+ .withSeed(1234L)
+ );
+
+ MultiClassModel<SVMLinearClassificationModel> mdl = trainer.fit(
+ ignite,
+ dataCache,
+ (k, v) -> v.copyOfRange(1, v.size()),
+ (k, v) -> v.get(0)
+ );
+
+ System.out.println(">>> One-vs-Rest SVM Multi-class model");
+ System.out.println(mdl.toString());
+
+ MinMaxScalerTrainer<Integer, Vector> minMaxScalerTrainer = new MinMaxScalerTrainer<>();
+
+ IgniteBiFunction<Integer, Vector, Vector> preprocessor = minMaxScalerTrainer.fit(
+ ignite,
+ dataCache,
+ (k, v) -> v.copyOfRange(1, v.size())
+ );
+
+ MultiClassModel<SVMLinearClassificationModel> mdlWithScaling = trainer.fit(
+ ignite,
+ dataCache,
+ preprocessor,
+ (k, v) -> v.get(0)
+ );
+
+ System.out.println(">>> One-vs-Rest SVM Multi-class model with MinMaxScaling");
+ System.out.println(mdlWithScaling.toString());
+
+ System.out.println(">>> ----------------------------------------------------------------");
+ System.out.println(">>> | Prediction\t| Prediction with MinMaxScaling\t| Ground Truth\t|");
+ System.out.println(">>> ----------------------------------------------------------------");
+
+ int amountOfErrors = 0;
+ int amountOfErrorsWithMinMaxScaling = 0;
+ int totalAmount = 0;
+
+ // Build confusion matrix. See https://en.wikipedia.org/wiki/Confusion_matrix
+ int[][] confusionMtx = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
+ int[][] confusionMtxWithMinMaxScaling = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
+
+ try (QueryCursor<Cache.Entry<Integer, Vector>> observations = dataCache.query(new ScanQuery<>())) {
+ for (Cache.Entry<Integer, Vector> observation : observations) {
+ Vector val = observation.getValue();
+ Vector inputs = val.copyOfRange(1, val.size());
+ double groundTruth = val.get(0);
+
+ double prediction = mdl.apply(inputs);
+ double predictionWithMinMaxScaling = mdlWithScaling.apply(inputs);
+
+ totalAmount++;
+
+ // Collect data for model
+ if (groundTruth != prediction)
+ amountOfErrors++;
+
+ int idx1 = (int)prediction == 1 ? 0 : ((int)prediction == 3 ? 1 : 2);
+ int idx2 = (int)groundTruth == 1 ? 0 : ((int)groundTruth == 3 ? 1 : 2);
+
+ confusionMtx[idx1][idx2]++;
+
+ // Collect data for model with min-max scaling
+ if (groundTruth != predictionWithMinMaxScaling)
+ amountOfErrorsWithMinMaxScaling++;
+
+ idx1 = (int)predictionWithMinMaxScaling == 1 ? 0 : ((int)predictionWithMinMaxScaling == 3 ? 1 : 2);
+ idx2 = (int)groundTruth == 1 ? 0 : ((int)groundTruth == 3 ? 1 : 2);
+
+ confusionMtxWithMinMaxScaling[idx1][idx2]++;
+
+ System.out.printf(">>> | %.4f\t\t| %.4f\t\t\t\t\t\t| %.4f\t\t|\n", prediction, predictionWithMinMaxScaling, groundTruth);
+ }
+ System.out.println(">>> ----------------------------------------------------------------");
+ System.out.println("\n>>> -----------------One-vs-Rest SVM model-------------");
+ System.out.println("\n>>> Absolute amount of errors " + amountOfErrors);
+ System.out.println("\n>>> Accuracy " + (1 - amountOfErrors / (double)totalAmount));
+ System.out.println("\n>>> Confusion matrix is " + Arrays.deepToString(confusionMtx));
+
+ System.out.println("\n>>> -----------------One-vs-Rest SVM model with MinMaxScaling-------------");
+ System.out.println("\n>>> Absolute amount of errors " + amountOfErrorsWithMinMaxScaling);
+ System.out.println("\n>>> Accuracy " + (1 - amountOfErrorsWithMinMaxScaling / (double)totalAmount));
+ System.out.println("\n>>> Confusion matrix is " + Arrays.deepToString(confusionMtxWithMinMaxScaling));
+
+ System.out.println(">>> One-vs-Rest SVM model over cache based dataset usage example completed.");
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/e82ab505/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/package-info.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/package-info.java
new file mode 100644
index 0000000..dc1d8ad
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/multiclass/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Multi-class classification examples.
+ */
+package org.apache.ignite.examples.ml.multiclass;
http://git-wip-us.apache.org/repos/asf/ignite/blob/e82ab505/modules/ml/src/main/java/org/apache/ignite/ml/multiclass/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/multiclass/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/multiclass/package-info.java
new file mode 100644
index 0000000..3a352f7
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/multiclass/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains various multi-classifier models and trainers.
+ */
+package org.apache.ignite.ml.multiclass;