public static double FMeasure(Item[] instances, DecisionForest forest, AttributeVariable target_attribute, double B = 1)
        {
            double precision = Precision(instances, forest, target_attribute);
            double recall    = Recall(instances, forest, target_attribute);

            return((B * B + 1) * precision * recall / (B * B * precision + recall));
        }
        public static double Recall(Item[] instances, DecisionForest forest, AttributeVariable target_attribute)
        {
            int tp = 0, fn = 0;

            foreach (var item in instances)
            {
                int true_value    = (int)item.FindAttributeValue(target_attribute);
                int predict_value = (int)Math.Round(forest.Decide(item));

                if (true_value == 1)
                {
                    if (predict_value == 1)
                    {
                        ++tp;
                    }
                    else
                    {
                        ++fn;
                    }
                }
            }

            return((double)tp / (double)(tp + fn));
        }