curTrainSet = trainSet;
curValidSet = validSet;
preprocess();
Ensemble ensemble = new Ensemble();
bestValidationMeasurement = Double.NaN;
int earlyStoppingIteration = 0;
int bestIteration = 0;
int[] treeCounts = new int[numSubModules];
subLearner.setTreeWeight(treeWeight);
for (curIteration = 1; curIteration <= numSubModules; curIteration++) {
Sample subLeanerSample = getSubLearnerSample();
Ensemble subEnsemble = subLearner.learn(subLeanerSample, validSet);
if (subEnsemble == null) {
break;
}
for (int t = 0; t < subEnsemble.getNumTrees(); t++) {
Tree tree = subEnsemble.getTreeAt(t);
ensemble.addTree(tree, subEnsemble.getWeightAt(t));
if (validSet != null) {
LearningUtils.updateScores(validSet, validPredictions, ((RegressionTree) tree), 1.0);
}
}
treeCounts[curIteration - 1] = ensemble.getNumTrees();