public void BestFirstTreeBuilder_Build_Leaf_Nodes_4()
        {
            var(observations, targets) = DataSetUtilities.LoadGlassDataSet();

            var sut = new DecisionTreeLearner(new BestFirstTreeBuilder(2000, 4, observations.ColumnCount, 0.000001, 42,
                                                                       new OnlyUniqueThresholdsSplitSearcher(1), new GiniClassificationImpurityCalculator()));

            var model = new ClassificationDecisionTreeModel(sut.Learn(observations, targets));

            var predictions = model.Predict(observations);

            var evaluator = new TotalErrorClassificationMetric <double>();
            var actual    = evaluator.Error(targets, predictions);

            Assert.AreEqual(0.37383177570093457, actual, 0.00001);
        }
        public void BestFirstTreeBuilder_Build_Leaf_Nodes_4()
        {
            var parser       = new CsvParser(() => new StringReader(Resources.Glass));
            var observations = parser.EnumerateRows(v => v != "Target").ToF64Matrix();
            var targets      = parser.EnumerateRows("Target").ToF64Vector();
            var rows         = targets.Length;

            var sut = new DecisionTreeLearner(new BestFirstTreeBuilder(2000, 4, observations.ColumnCount, 0.000001, 42,
                                                                       new OnlyUniqueThresholdsSplitSearcher(1), new GiniClassificationImpurityCalculator()));

            var model = new ClassificationDecisionTreeModel(sut.Learn(observations, targets));

            var predictions = model.Predict(observations);

            var evaluator = new TotalErrorClassificationMetric <double>();
            var actual    = evaluator.Error(targets, predictions);

            Assert.AreEqual(0.37383177570093457, actual, 0.00001);
        }
        ClassificationDecisionTreeModel CreateTree(F64Matrix observations, double[] targets, int[] indices, Random random)
        {
            var learner = new DecisionTreeLearner(
                new DepthFirstTreeBuilder(m_maximumTreeDepth,
                                          m_featuresPrSplit,
                                          m_minimumInformationGain,
                                          m_random.Next(),
                                          new RandomSplitSearcher(m_minimumSplitSize, m_random.Next()),
                                          new GiniClasificationImpurityCalculator()));

            var treeIndicesLength = (int)Math.Round(m_subSampleRatio * (double)indices.Length);
            var treeIndices       = new int[treeIndicesLength];

            for (int j = 0; j < treeIndicesLength; j++)
            {
                treeIndices[j] = indices[random.Next(indices.Length)];
            }

            var model = new ClassificationDecisionTreeModel(learner.Learn(observations, targets, treeIndices));

            return(model);
        }