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/08/31 08:37:21 UTC

[3/3] ignite git commit: IGNITE-9348: ML examples improvements, follow-up to IGNITE-9297

IGNITE-9348: ML examples improvements, follow-up to IGNITE-9297

this closes #4641


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/145a2898
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/145a2898
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/145a2898

Branch: refs/heads/master
Commit: 145a28981017026c86ab509ac3d660449715bbb1
Parents: 2108b3b
Author: Oleg Ignatenko <oi...@gridgain.com>
Authored: Fri Aug 31 11:37:10 2018 +0300
Committer: Yury Babak <yb...@gridgain.com>
Committed: Fri Aug 31 11:37:10 2018 +0300

----------------------------------------------------------------------
 .../clustering/KMeansClusterizationExample.java |    3 +-
 .../AlgorithmSpecificDatasetExample.java        |    5 +-
 .../ml/dataset/LocalDatasetExample.java         |   69 --
 .../change/OptimizeMakeChangeGAExample.java     |   14 +-
 .../OptimizeMakeChangeTerminateCriteria.java    |   42 +-
 .../genetic/helloworld/HelloWorldGAExample.java |   13 +-
 .../helloworld/HelloWorldTerminateCriteria.java |   34 +-
 .../ml/genetic/knapsack/KnapsackGAExample.java  |   12 +-
 .../knapsack/KnapsackTerminateCriteria.java     |   47 +-
 .../ml/genetic/movie/MovieGAExample.java        |    6 +-
 .../genetic/movie/MovieTerminateCriteria.java   |   42 +-
 .../ml/knn/ANNClassificationExample.java        |    3 +-
 .../ml/knn/KNNClassificationExample.java        |    3 +-
 .../examples/ml/knn/KNNRegressionExample.java   |    3 +-
 .../examples/ml/nn/MLPTrainerExample.java       |    3 +-
 .../LinearRegressionLSQRTrainerExample.java     |    3 +-
 ...ssionLSQRTrainerWithMinMaxScalerExample.java |    3 +-
 .../LinearRegressionSGDTrainerExample.java      |    5 +-
 .../LogisticRegressionSGDTrainerExample.java    |    4 +-
 .../ml/selection/cv/CrossValidationExample.java |    6 +-
 .../RandomForestClassificationExample.java      |   51 +-
 .../RandomForestRegressionExample.java          | 1064 +++++++++---------
 .../ml/environment/EnvironmentTestSuite.java    |    1 +
 .../ml/environment/LearningEnvironmentTest.java |  201 ++++
 24 files changed, 920 insertions(+), 717 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
index c310302..b96cbce 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansClusterizationExample.java
@@ -38,7 +38,8 @@ import org.apache.ignite.thread.IgniteThread;
  * 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 KMeans algorithm.</p>
+ * After that it trains the model based on the specified data using
+ * <a href="https://en.wikipedia.org/wiki/K-means_clustering">KMeans</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>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/dataset/AlgorithmSpecificDatasetExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/dataset/AlgorithmSpecificDatasetExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/dataset/AlgorithmSpecificDatasetExample.java
index de7f0e9..4d42d19 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/dataset/AlgorithmSpecificDatasetExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/dataset/AlgorithmSpecificDatasetExample.java
@@ -34,8 +34,9 @@ import org.apache.ignite.ml.dataset.primitive.data.SimpleLabeledDatasetData;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 
 /**
- * Example that shows how to implement your own algorithm (gradient descent trainer for linear regression) which uses
- * dataset as an underlying infrastructure.
+ * Example that shows how to implement your own algorithm
+ * (<a href="https://en.wikipedia.org/wiki/Gradient_descent">gradient</a> descent trainer for linear regression)
+ * which uses dataset as an underlying infrastructure.
  * <p>
  * Code in this example launches Ignite grid and fills the cache with simple test data.</p>
  * <p>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/dataset/LocalDatasetExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/dataset/LocalDatasetExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/dataset/LocalDatasetExample.java
deleted file mode 100644
index 282e76b..0000000
--- a/examples/src/main/java/org/apache/ignite/examples/ml/dataset/LocalDatasetExample.java
+++ /dev/null
@@ -1,69 +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.examples.ml.dataset;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.ignite.examples.ml.dataset.model.Person;
-import org.apache.ignite.examples.ml.util.DatasetHelper;
-import org.apache.ignite.ml.dataset.DatasetFactory;
-import org.apache.ignite.ml.dataset.primitive.SimpleDataset;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-
-/**
- * Example that shows how to create dataset based on an existing local storage and then use it to calculate {@code mean}
- * and {@code std} values as well as {@code covariance} and {@code correlation} matrices.
- * <p>
- * Code in this example the storage with simple test data.</p>
- * <p>
- * After that it creates the dataset based on the data in the storage and uses Dataset API to find and output
- * various statistical metrics of the data.</p>
- * <p>
- * You can change the test data used in this example and re-run it to explore this functionality further.</p>
- */
-public class LocalDatasetExample {
-    /** Run example. */
-    public static void main(String[] args) throws Exception {
-        System.out.println(">>> Local Dataset example started.");
-
-        Map<Integer, Person> persons = createCache();
-
-        // Creates a local simple dataset containing features and providing standard dataset API.
-        try (SimpleDataset<?> dataset = DatasetFactory.createSimpleDataset(
-            persons,
-            2,
-            (k, v) -> VectorUtils.of(v.getAge(), v.getSalary())
-        )) {
-            new DatasetHelper(dataset).describe();
-        }
-
-        System.out.println(">>> Local Dataset example completed.");
-    }
-
-    /** */
-    private static Map<Integer, Person> createCache() {
-        Map<Integer, Person> persons = new HashMap<>();
-
-        persons.put(1, new Person("Mike", 42, 10000));
-        persons.put(2, new Person("John", 32, 64000));
-        persons.put(3, new Person("George", 53, 120000));
-        persons.put(4, new Person("Karl", 24, 70000));
-
-        return persons;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
index ed392c29..36a5f47 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
@@ -20,7 +20,6 @@ package org.apache.ignite.examples.ml.genetic.change;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.GAGrid;
@@ -64,8 +63,6 @@ public class OptimizeMakeChangeGAExample {
     public static void main(String args[]) {
         System.out.println(">>> OptimizeMakeChange GA grid example started.");
 
-        System.setProperty("IGNITE_QUIET", "false");
-
         String sAmountChange = "75";
 
         StringBuilder sbErrorMsg = new StringBuilder();
@@ -85,8 +82,6 @@ public class OptimizeMakeChangeGAExample {
             // Create an Ignite instance as you would in any other use case.
             Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
 
-            IgniteLogger log = ignite.log();
-
             // Create GAConfiguration.
             GAConfiguration gaCfg = new GAConfiguration();
 
@@ -120,7 +115,8 @@ public class OptimizeMakeChangeGAExample {
             gaCfg.setFitnessFunction(function);
 
             // Create and set TerminateCriteria.
-            OptimizeMakeChangeTerminateCriteria termCriteria = new OptimizeMakeChangeTerminateCriteria(ignite);
+            OptimizeMakeChangeTerminateCriteria termCriteria = new OptimizeMakeChangeTerminateCriteria(ignite,
+                System.out::println);
 
             ChromosomeCriteria chromosomeCriteria = new ChromosomeCriteria();
 
@@ -139,11 +135,11 @@ public class OptimizeMakeChangeGAExample {
             // Initialize GAGrid.
             GAGrid gaGrid = new GAGrid(gaCfg, ignite);
 
-            log.info("##########################################################################################");
+            System.out.println("##########################################################################################");
 
-            log.info("Calculating optimal set of coins where amount of change is " + sAmountChange);
+            System.out.println("Calculating optimal set of coins where amount of change is " + sAmountChange);
 
-            log.info("##########################################################################################");
+            System.out.println("##########################################################################################");
 
             Chromosome chromosome = gaGrid.evolve();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
index 1d6612c..2d65d3f 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.change;
 
 import java.util.List;
+import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
@@ -29,19 +29,21 @@ import org.apache.ignite.ml.genetic.utils.GAGridUtils;
  * Terminate Condition implementation for {@link OptimizeMakeChangeGAExample}.
  */
 public class OptimizeMakeChangeTerminateCriteria implements ITerminateCriteria {
-    /** Ignite logger. */
-    private IgniteLogger igniteLog;
-    /** Ignite instance. */
-    private Ignite ignite;
+    /** */
+    private final Ignite ignite;
+
+    /** */
+    private final Consumer<String> logConsumer;
 
     /**
      * Create class instance.
      *
      * @param ignite Ignite instance.
+     * @param logConsumer Logging consumer.
      */
-    public OptimizeMakeChangeTerminateCriteria(Ignite ignite) {
+    OptimizeMakeChangeTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
         this.ignite = ignite;
-        this.igniteLog = ignite.log();
+        this.logConsumer = logConsumer;
     }
 
     /**
@@ -56,13 +58,14 @@ public class OptimizeMakeChangeTerminateCriteria implements ITerminateCriteria {
         int currGeneration) {
         boolean isTerminate = true;
 
-        igniteLog.info("##########################################################################################");
-        igniteLog.info("Generation: " + currGeneration);
-        igniteLog.info("Fittest is Chromosome Key: " + fittestChromosome);
-        igniteLog.info("Chromosome: " + fittestChromosome);
-        printCoins(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome));
-        igniteLog.info("Avg Chromosome Fitness: " + averageFitnessScore);
-        igniteLog.info("##########################################################################################");
+        logConsumer.accept(
+            "\n##########################################################################################"
+                + "\n Generation: " + currGeneration
+                + "\n Fittest is Chromosome Key: " + fittestChromosome
+                + "\n Chromosome: " + fittestChromosome
+                + "\n" + reportCoins(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
+                + "\nAvg Chromosome Fitness: " + averageFitnessScore
+                + "\n##########################################################################################");
 
         if (!(currGeneration > 5))
             isTerminate = false;
@@ -74,11 +77,16 @@ public class OptimizeMakeChangeTerminateCriteria implements ITerminateCriteria {
      * Helper to print change details.
      *
      * @param genes List if Genes.
+     * @return Details to print.
      */
-    private void printCoins(List<Gene> genes) {
+    private String reportCoins(List<Gene> genes) {
+        StringBuilder sb = new StringBuilder();
+
         for (Gene gene : genes) {
-            igniteLog.info("Coin Type: " + ((Coin)gene.getVal()).getCoinType().toString());
-            igniteLog.info("Number of Coins: " + ((Coin)gene.getVal()).getNumOfCoins());
+            sb.append("\nCoin Type: ").append(((Coin)gene.getVal()).getCoinType().toString())
+                .append("\nNumber of Coins: ").append(((Coin)gene.getVal()).getNumOfCoins());
         }
+
+        return sb.toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
index 3182d2f..585cbb5 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
@@ -19,6 +19,7 @@ package org.apache.ignite.examples.ml.genetic.helloworld;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.ml.genetic.Chromosome;
@@ -56,8 +57,6 @@ public class HelloWorldGAExample {
     public static void main(String args[]) {
         System.out.println(">>> HelloWorld GA grid example started.");
 
-        System.setProperty("IGNITE_QUIET", "false");
-
         try {
             // Create an Ignite instance as you would in any other use case.
             Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
@@ -79,10 +78,14 @@ public class HelloWorldGAExample {
             gaCfg.setFitnessFunction(function);
 
             // Create and set TerminateCriteria.
-            HelloWorldTerminateCriteria termCriteria = new HelloWorldTerminateCriteria(ignite);
-            gaCfg.setTerminateCriteria(termCriteria);
+            AtomicInteger cnt = new AtomicInteger(0);
+            HelloWorldTerminateCriteria termCriteria = new HelloWorldTerminateCriteria(ignite,
+                msg -> {
+                    if (cnt.getAndIncrement() % 20 == 0)
+                        System.out.println(msg);
+                });
 
-            ignite.log();
+            gaCfg.setTerminateCriteria(termCriteria);
 
             GAGrid gaGrid = new GAGrid(gaCfg, ignite);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
index f149da1..610d479 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.helloworld;
 
 import java.util.List;
+import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
@@ -31,19 +31,21 @@ import org.apache.ignite.ml.genetic.utils.GAGridUtils;
  * Class terminates Genetic algorithm when fitness score is more than 10.</p>
  */
 public class HelloWorldTerminateCriteria implements ITerminateCriteria {
-    /** Ignite logger. */
-    private IgniteLogger igniteLog;
     /** Ignite instance. */
-    private Ignite ignite;
+    private final Ignite ignite;
+
+    /** */
+    private final Consumer<String> logConsumer;
 
     /**
      * Create class instance.
      *
      * @param ignite Ignite instance.
+     * @param logConsumer Logging consumer.
      */
-    public HelloWorldTerminateCriteria(Ignite ignite) {
+    HelloWorldTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
         this.ignite = ignite;
-        this.igniteLog = ignite.log();
+        this.logConsumer = logConsumer;
     }
 
     /**
@@ -58,13 +60,14 @@ public class HelloWorldTerminateCriteria implements ITerminateCriteria {
         int currGeneration) {
         boolean isTerminate = true;
 
-        igniteLog.info("##########################################################################################");
-        igniteLog.info("Generation: " + currGeneration);
-        igniteLog.info("Fittest is Chromosome Key: " + fittestChromosome);
-        igniteLog.info("Chromosome: " + fittestChromosome);
-        printPhrase(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome));
-        igniteLog.info("Avg Chromosome Fitness: " + averageFitnessScore);
-        igniteLog.info("##########################################################################################");
+        logConsumer.accept(
+            "\n##########################################################################################"
+                + "\n Generation: " + currGeneration
+                + "\n Fittest is Chromosome Key: " + fittestChromosome
+                + "\n Chromosome: " + fittestChromosome
+                + "\n" + printPhrase(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
+                + "\nAvg Chromosome Fitness: " + averageFitnessScore
+                + "\n##########################################################################################");
 
         if (!(fittestChromosome.getFitnessScore() > 10))
             isTerminate = false;
@@ -76,13 +79,14 @@ public class HelloWorldTerminateCriteria implements ITerminateCriteria {
      * Helper to print phrase.
      *
      * @param genes List of Genes.
+     * @return Phrase to print.
      */
-    private void printPhrase(List<Gene> genes) {
+    private String printPhrase(List<Gene> genes) {
         StringBuilder sbPhrase = new StringBuilder();
 
         for (Gene gene : genes)
             sbPhrase.append(((Character)gene.getVal()).toString());
 
-        igniteLog.info(sbPhrase.toString());
+        return sbPhrase.toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
index 873c1c6..1631a95 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
@@ -19,6 +19,7 @@ package org.apache.ignite.examples.ml.genetic.knapsack;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.ml.genetic.Chromosome;
@@ -55,8 +56,6 @@ public class KnapsackGAExample {
     public static void main(String args[]) {
         System.out.println(">>> Knapsack GA grid example started.");
 
-        System.setProperty("IGNITE_QUIET", "false");
-
         try {
             // Create an Ignite instance as you would in any other use case.
             Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
@@ -78,11 +77,14 @@ public class KnapsackGAExample {
             gaCfg.setFitnessFunction(function);
 
             // Create and set TerminateCriteria.
-            KnapsackTerminateCriteria termCriteria = new KnapsackTerminateCriteria(ignite);
+            AtomicInteger cnt = new AtomicInteger(0);
+            KnapsackTerminateCriteria termCriteria = new KnapsackTerminateCriteria(ignite,
+                msg -> {
+                    if (cnt.getAndIncrement() % 10 == 0)
+                        System.out.println(msg);
+                });
             gaCfg.setTerminateCriteria(termCriteria);
 
-            ignite.log();
-
             GAGrid gaGrid = new GAGrid(gaCfg, ignite);
 
             // Evolve the population.

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
index 1bba159..09e047b 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.knapsack;
 
 import java.util.List;
+import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
@@ -32,19 +32,20 @@ import org.apache.ignite.ml.genetic.utils.GAGridUtils;
  */
 public class KnapsackTerminateCriteria implements ITerminateCriteria {
     /** Ignite instance. */
-    private Ignite ignite;
+    private final Ignite ignite;
 
-    /** Ignite logger. */
-    private IgniteLogger igniteLog;
+    /** */
+    private final Consumer<String> logConsumer;
 
     /**
      * Create class instance.
      *
      * @param ignite Ignite instance.
+     * @param logConsumer Logging consumer.
      */
-    public KnapsackTerminateCriteria(Ignite ignite) {
+    KnapsackTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
         this.ignite = ignite;
-        this.igniteLog = this.ignite.log();
+        this.logConsumer = logConsumer;
     }
 
     /**
@@ -59,15 +60,16 @@ public class KnapsackTerminateCriteria implements ITerminateCriteria {
         int currGeneration) {
         boolean isTerminate = true;
 
-        igniteLog.info("##########################################################################################");
-        igniteLog.info("Generation: " + currGeneration);
-        igniteLog.info("Fittest is Chromosome Key: " + fittestChromosome);
-        igniteLog.info("Total value is: " + fittestChromosome.getFitnessScore());
-        igniteLog.info("Total weight is: " + calculateTotalWeight(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome)));
-        igniteLog.info("Avg Chromosome Fitness: " + averageFitnessScore);
-        igniteLog.info("Chromosome: " + fittestChromosome);
-        printItems(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome));
-        igniteLog.info("##########################################################################################");
+        logConsumer.accept(
+            "\n##########################################################################################"
+                + "\n Generation: " + currGeneration
+                + "\n Fittest is Chromosome Key: " + fittestChromosome
+                + "\nTotal value is: " + fittestChromosome.getFitnessScore()
+                + "\nTotal weight is: " + calculateTotalWeight(
+                    GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
+                + "\nChromosome: " + fittestChromosome
+                + "\n" + reportItems(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
+                + "\n##########################################################################################");
 
         if (!(currGeneration > 29))
             isTerminate = false;
@@ -93,13 +95,18 @@ public class KnapsackTerminateCriteria implements ITerminateCriteria {
      * Helper to print items in knapsack.
      *
      * @param genes List of Genes.
+     * @return Items to print.
      */
-    private void printItems(List<Gene> genes) {
+    private String reportItems(List<Gene> genes) {
+        StringBuilder sb = new StringBuilder();
+
         for (Gene gene : genes) {
-            igniteLog.info("------------------------------------------------------------------------------------------");
-            igniteLog.info("Name: " + ((Item)gene.getVal()).getName());
-            igniteLog.info("Weight: " + ((Item)gene.getVal()).getWeight());
-            igniteLog.info("Value: " + ((Item)gene.getVal()).getVal());
+            sb.append("\n------------------------------------------------------------------------------------------")
+                .append("\nName: ").append(((Item)gene.getVal()).getName())
+                .append("\nWeight: ").append(((Item)gene.getVal()).getWeight())
+                .append("\nValue: ").append(((Item)gene.getVal()).getVal());
         }
+
+        return sb.toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
index 51e28be..cec2719 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
@@ -61,8 +61,6 @@ public class MovieGAExample {
     public static void main(String args[]) {
         System.out.println(">>> Movie GA grid example started.");
 
-        System.setProperty("IGNITE_QUIET", "false");
-
         List<String> genres = new ArrayList<>();
         String sGenres = "Action,Comedy,Romance";
 
@@ -110,14 +108,12 @@ public class MovieGAExample {
             // Create an Ignite instance as you would in any other use case.
             Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
 
-            MovieTerminateCriteria termCriteria = new MovieTerminateCriteria(ignite);
+            MovieTerminateCriteria termCriteria = new MovieTerminateCriteria(ignite, System.out::println);
 
             gaCfg.setTerminateCriteria(termCriteria);
 
             GAGrid gaGrid = new GAGrid(gaCfg, ignite);
 
-            ignite.log();
-
             Chromosome chromosome = gaGrid.evolve();
 
             System.out.println(">>> Evolution result: " + chromosome);

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
index 7110a7c..68c577f 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.movie;
 
 import java.util.List;
+import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;
@@ -31,19 +31,21 @@ import org.apache.ignite.ml.genetic.utils.GAGridUtils;
  * Class terminates Genetic algorithm when fitness score is more than 32.</p>
  */
 public class MovieTerminateCriteria implements ITerminateCriteria {
-    /** Ignite logger. */
-    private IgniteLogger igniteLog;
     /** Ignite instance. */
-    private Ignite ignite;
+    private final Ignite ignite;
+
+    /** */
+    private final Consumer<String> logConsumer;
 
     /**
      * Create class instance.
      *
      * @param ignite Ignite instance.
+     * @param logConsumer Logging consumer.
      */
-    public MovieTerminateCriteria(Ignite ignite) {
+    MovieTerminateCriteria(Ignite ignite, Consumer<String> logConsumer) {
         this.ignite = ignite;
-        this.igniteLog = ignite.log();
+        this.logConsumer = logConsumer;
 
     }
 
@@ -59,12 +61,13 @@ public class MovieTerminateCriteria implements ITerminateCriteria {
         int currGeneration) {
         boolean isTerminate = true;
 
-        igniteLog.info("##########################################################################################");
-        igniteLog.info("Generation: " + currGeneration);
-        igniteLog.info("Fittest is Chromosome Key: " + fittestChromosome);
-        igniteLog.info("Chromosome: " + fittestChromosome);
-        printMovies(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome));
-        igniteLog.info("##########################################################################################");
+        logConsumer.accept(
+            "\n##########################################################################################"
+                + "\n Generation: " + currGeneration
+                + "\n Fittest is Chromosome Key: " + fittestChromosome
+                + "\nChromosome: " + fittestChromosome
+                + "\n" + reportMovies(GAGridUtils.getGenesInOrderForChromosome(ignite, fittestChromosome))
+                + "\n##########################################################################################");
 
         if (!(fittestChromosome.getFitnessScore() > 32))
             isTerminate = false;
@@ -73,15 +76,20 @@ public class MovieTerminateCriteria implements ITerminateCriteria {
     }
 
     /**
-     * Helper to print change details.
+     * Helper to print movies details.
      *
      * @param genes List of Genes.
+     * @return Movies details.
      */
-    private void printMovies(List<Gene> genes) {
+    private String reportMovies(List<Gene> genes) {
+        StringBuilder sb = new StringBuilder();
+
         for (Gene gene : genes) {
-            igniteLog.info("Name: " + ((Movie)gene.getVal()).getName());
-            igniteLog.info("Genres: " + ((Movie)gene.getVal()).getGenre().toString());
-            igniteLog.info("IMDB Rating: " + ((Movie)gene.getVal()).getImdbRating());
+            sb.append("\nName: ").append(((Movie)gene.getVal()).getName())
+                .append("\nGenres: ").append(((Movie)gene.getVal()).getGenre().toString())
+                .append("\nIMDB Rating: ").append(((Movie)gene.getVal()).getImdbRating());
         }
+
+        return sb.toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/knn/ANNClassificationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/ANNClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/ANNClassificationExample.java
index 37cb231..8a2d786 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/knn/ANNClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/ANNClassificationExample.java
@@ -42,7 +42,8 @@ import org.apache.ignite.thread.IgniteThread;
  * 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 kNN algorithm.</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>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
index 77a48ad..cf285a4 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
@@ -39,7 +39,8 @@ import org.apache.ignite.thread.IgniteThread;
  * 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 kNN algorithm.</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>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
index a28ecc4..78f38c8 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
@@ -39,7 +39,8 @@ import org.apache.ignite.thread.IgniteThread;
  * 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 kNN regression algorithm.</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> regression 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>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
index 30f8769..3e5a98c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
@@ -41,7 +41,8 @@ import org.apache.ignite.thread.IgniteThread;
  * <p>
  * Code in this example launches Ignite grid and fills the cache with simple test data.</p>
  * <p>
- * After that it defines a layered architecture and a neural network trainer, trains neural network
+ * After that it defines a layered architecture and a
+ * <a href="https://en.wikipedia.org/wiki/Neural_network">neural network</a> trainer, trains neural network
  * and obtains multilayer perceptron model.</p>
  * <p>
  * Finally, this example loops over the test set, applies the trained model to predict the value and

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
index 085a089..6ac445c 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerExample.java
@@ -32,7 +32,8 @@ import org.apache.ignite.ml.regressions.linear.LinearRegressionModel;
 import org.apache.ignite.thread.IgniteThread;
 
 /**
- * Run linear regression model ({@link LinearRegressionLSQRTrainer}) over cached dataset.
+ * Run linear regression model based on <a href="http://web.stanford.edu/group/SOL/software/lsqr/">LSQR algorithm</a>
+ * ({@link LinearRegressionLSQRTrainer}) over cached dataset.
  * <p>
  * Code in this example launches Ignite grid and fills the cache with simple test data.</p>
  * <p>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
index 39f3771..320d464 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
@@ -35,7 +35,8 @@ import org.apache.ignite.ml.regressions.linear.LinearRegressionModel;
 import org.apache.ignite.thread.IgniteThread;
 
 /**
- * Run linear regression model ({@link LinearRegressionLSQRTrainer}) over cached dataset that was created using
+ * Run linear regression model based on <a href="http://web.stanford.edu/group/SOL/software/lsqr/">LSQR algorithm</a>
+ * ({@link LinearRegressionLSQRTrainer}) over cached dataset that was created using
  * a minmaxscaling preprocessor ({@link MinMaxScalerTrainer}, {@link MinMaxScalerPreprocessor}).
  * <p>
  * Code in this example launches Ignite grid, fills the cache with simple test data, and defines minmaxscaling

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
index 0a1e966..9fdc0df 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionSGDTrainerExample.java
@@ -35,8 +35,9 @@ import org.apache.ignite.ml.regressions.linear.LinearRegressionSGDTrainer;
 import org.apache.ignite.thread.IgniteThread;
 
 /**
- * Run linear regression model based on stochastic gradient descent algorithm ({@link LinearRegressionSGDTrainer})
- * over cached dataset.
+ * Run linear regression model based on  based on
+ * <a href="https://en.wikipedia.org/wiki/Stochastic_gradient_descent">stochastic gradient descent</a> algorithm
+ * ({@link LinearRegressionSGDTrainer}) over cached dataset.
  * <p>
  * Code in this example launches Ignite grid and fills the cache with simple test data.</p>
  * <p>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
index 7e1c773..0a6ff01 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/binary/LogisticRegressionSGDTrainerExample.java
@@ -35,8 +35,8 @@ import org.apache.ignite.ml.regressions.logistic.binomial.LogisticRegressionSGDT
 import org.apache.ignite.thread.IgniteThread;
 
 /**
- * Run logistic regression model based on stochastic gradient descent algorithm ({@link LogisticRegressionSGDTrainer})
- * over distributed cache.
+ * Run logistic regression model based on <a href="https://en.wikipedia.org/wiki/Stochastic_gradient_descent">
+ * stochastic gradient descent</a> algorithm ({@link LogisticRegressionSGDTrainer}) over distributed cache.
  * <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>

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/selection/cv/CrossValidationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/selection/cv/CrossValidationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/selection/cv/CrossValidationExample.java
index f1b5650..eb4c8f3 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/selection/cv/CrossValidationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/selection/cv/CrossValidationExample.java
@@ -33,11 +33,13 @@ import org.apache.ignite.ml.tree.DecisionTreeNode;
 import org.apache.ignite.thread.IgniteThread;
 
 /**
- * Run decision tree classification with cross validation ({@link CrossValidation}).
+ * Run <a href="https://en.wikipedia.org/wiki/Decision_tree">decision tree</a> classification with
+ * <a href="https://en.wikipedia.org/wiki/Cross-validation_(statistics)">cross validation</a> ({@link CrossValidation}).
  * <p>
  * Code in this example launches Ignite grid and fills the cache with pseudo random training data points.</p>
  * <p>
- * After that it creates classification trainer and computes cross-validated metrics based on the training set.</p>
+ * After that it creates classification trainer ({@link DecisionTreeClassificationTrainer}) and computes cross-validated
+ * metrics based on the training set.</p>
  */
 public class CrossValidationExample {
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/145a2898/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
index 4ea471c..aa13943 100644
--- a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestClassificationExample.java
@@ -32,18 +32,24 @@ import org.apache.ignite.ml.composition.ModelsComposition;
 import org.apache.ignite.ml.dataset.feature.FeatureMeta;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.tree.randomforest.RandomForestClassifierTrainer;
-import org.apache.ignite.ml.tree.randomforest.RandomForestTrainer;
 import org.apache.ignite.ml.tree.randomforest.data.FeaturesCountSelectionStrategies;
 import org.apache.ignite.thread.IgniteThread;
 
 /**
- * Example represents a solution for the task of wine classification based on RandomForestTrainer implementation for
- * multi-classification. It shows an initialization of {@link RandomForestTrainer} with thread pool for multi-thread
- * learning, initialization of Ignite Cache, learning step and evaluation of accuracy of model.
- *
- * Dataset url: https://archive.ics.uci.edu/ml/machine-learning-databases/wine/
- *
- * @see RandomForestClassifierTrainer
+ * Example represents a solution for the task of wine classification based on a
+ *  <a href ="https://en.wikipedia.org/wiki/Random_forest">Random Forest</a> implementation for
+ * multi-classification.
+ * <p>
+ * Code in this example launches Ignite grid and fills the cache with test data points (based on the
+ * <a href="https://archive.ics.uci.edu/ml/machine-learning-databases/wine/">Wine recognition dataset</a>).</p>
+ * <p>
+ * After that it initializes the  {@link RandomForestClassifierTrainer} with thread pool for multi-thread learning
+ * and trains the model based on the specified data using random forest regression algorithm.</p>
+ * <p>
+ * Finally, this example loops over the test set of data points, compares prediction of the trained model to the
+ * expected outcome (ground truth), and evaluates accuracy of the model.</p>
+ * <p>
+ * You can change the test data used in this example and re-run it to explore this algorithm further.</p>
  */
 public class RandomForestClassificationExample {
     /**
@@ -57,23 +63,29 @@ public class RandomForestClassificationExample {
             System.out.println(">>> Ignite grid started.");
 
             IgniteThread igniteThread = new IgniteThread(ignite.configuration().getIgniteInstanceName(),
-                    RandomForestClassificationExample.class.getSimpleName(), () -> {
+                RandomForestClassificationExample.class.getSimpleName(), () -> {
                 IgniteCache<Integer, double[]> dataCache = new TestCache(ignite).fillCacheWith(data);
 
-                AtomicInteger indx = new AtomicInteger(0);
+                AtomicInteger idx = new AtomicInteger(0);
                 RandomForestClassifierTrainer classifier = new RandomForestClassifierTrainer(
-                    IntStream.range(0, 13).mapToObj(x -> new FeatureMeta("", indx.getAndIncrement(), false)).collect(Collectors.toList()))
-                    .withCountOfTrees(101)
-                    .withFeaturesCountSelectionStrgy(FeaturesCountSelectionStrategies.SQRT)
-                    .withMaxDepth(3)
+                    IntStream.range(0, data[0].length - 1).mapToObj(
+                        x -> new FeatureMeta("", idx.getAndIncrement(), false)).collect(Collectors.toList())
+                ).withCountOfTrees(101)
+                    .withFeaturesCountSelectionStrgy(FeaturesCountSelectionStrategies.ONE_THIRD)
+                    .withMaxDepth(4)
                     .withMinImpurityDelta(0.)
-                    .withSubsampleSize(0.3);
+                    .withSubsampleSize(0.3)
+                    .withSeed(0);
+
+                System.out.println(">>> Configured trainer: " + classifier.getClass().getSimpleName());
 
                 ModelsComposition randomForest = classifier.fit(ignite, dataCache,
                     (k, v) -> VectorUtils.of(Arrays.copyOfRange(v, 1, v.length)),
                     (k, v) -> v[0]
                 );
 
+                System.out.println(">>> Trained model: " + randomForest.toString(true));
+
                 int amountOfErrors = 0;
                 int totalAmount = 0;
 
@@ -91,8 +103,11 @@ public class RandomForestClassificationExample {
 
                     }
 
+                    System.out.println("\n>>> Evaluated model on " + totalAmount + " data points.");
+
                     System.out.println("\n>>> Absolute amount of errors " + amountOfErrors);
-                    System.out.println("\n>>> Accuracy " + (1 - amountOfErrors / (double)totalAmount));
+                    System.out.println("\n>>> Accuracy " + (1 - amountOfErrors / (double) totalAmount));
+                    System.out.println(">>> Random Forest multi-class classification algorithm over cached dataset usage example completed.");
                 }
             });
 
@@ -101,9 +116,7 @@ public class RandomForestClassificationExample {
         }
     }
 
-    /**
-     * The Wine dataset.
-     */
+    /** The Wine recognition dataset. */
     private static final double[][] data = {
         {1, 14.23, 1.71, 2.43, 15.6, 127, 2.8, 3.06, .28, 2.29, 5.64, 1.04, 3.92, 1065},
         {1, 13.2, 1.78, 2.14, 11.2, 100, 2.65, 2.76, .26, 1.28, 4.38, 1.05, 3.4, 1050},