* number of trees to grow
*/
private void runIteration(Random rng, Data data, int m, int nbtrees) {
log.info("Splitting the data");
Data train = data.clone();
Data test = train.rsplit(rng, (int) (data.size() * 0.1));
DefaultTreeBuilder treeBuilder = new DefaultTreeBuilder();
SequentialBuilder forestBuilder = new SequentialBuilder(rng, treeBuilder, train);
// grow a forest with m = log2(M)+1
treeBuilder.setM(m);
long time = System.currentTimeMillis();
log.info("Growing a forest with m={}", m);
DecisionForest forestM = forestBuilder.build(nbtrees);
sumTimeM += System.currentTimeMillis() - time;
numNodesM += forestM.nbNodes();
// grow a forest with m=1
treeBuilder.setM(1);
time = System.currentTimeMillis();
log.info("Growing a forest with m=1");
DecisionForest forestOne = forestBuilder.build(nbtrees);
sumTimeOne += System.currentTimeMillis() - time;
numNodesOne += forestOne.nbNodes();
// compute the test set error (Selection Error), and mean tree error (One Tree Error),
double[] testLabels = test.extractLabels();
double[][] predictions = new double[test.size()][];
forestM.classify(test, predictions);
double[] sumPredictions = new double[test.size()];
Arrays.fill(sumPredictions, 0.0);
for (int i = 0; i < predictions.length; i++) {
for (int j = 0; j < predictions[i].length; j++) {
sumPredictions[i] += predictions[i][j];
}