public GridSearchParameterCollection RandomForestGetBestParameters(
            AppIdentDataSource appIdentDataSource,
            FeatureSelector featureSelector,
            AppIdentTestContext appIdentTestContext = null)
        {
            var accordAppIdent      = new AccordAppIdent();
            var appIdentAcordSource = this.GetAppIdentAcordSource(appIdentDataSource.TrainingSet, featureSelector);

            accordAppIdent.GetBestRandomForestsWithGridSearch(appIdentAcordSource, out var bestParameters, out var minError);
            appIdentTestContext?.Save(bestParameters);
            return(bestParameters);
        }
        public ApplicationProtocolClassificationStatisticsMeter RandomForestCrossValidation(
            AppIdentDataSource appIdentDataSource,
            FeatureSelector featureSelector,
            GridSearchParameterCollection bestParameters,
            int folds,
            AppIdentTestContext appIdentTestContext)
        {
            var precMeasure = new ApplicationProtocolClassificationStatisticsMeter();

            var accordAppIdent      = new AccordAppIdent();
            var appIdentAcordSource = this.GetAppIdentAcordSource(appIdentDataSource.TrainingSet, featureSelector);

            var cvResults = accordAppIdent.GetCrossValidationResultsOfRandomForestModel(appIdentAcordSource, bestParameters, folds);

            Console.WriteLine("### CV Results ###");
            Console.WriteLine("\n### Training stats ###");
            Console.WriteLine(">> model error mean: {0}\n>> model std:  {1}", Math.Round(cvResults.Training.Mean, 6), Math.Round(cvResults.Training.StandardDeviation, 6));
            Console.WriteLine("\n### Validation stats ###");
            Console.WriteLine(">> model error mean: {0}\n>> model std:  {1}", Math.Round(cvResults.Validation.Mean, 6), Math.Round(cvResults.Validation.StandardDeviation, 6));

            var minErorr   = cvResults.Validation.Values.Min();
            var bestIndex  = cvResults.Validation.Values.IndexOf(minErorr);
            var classifier = cvResults.Models[bestIndex];

            var model         = classifier.Model;
            var labels        = appIdentAcordSource.Labels.Distinct();
            var modelFilePath = appIdentTestContext.Save(model, labels);

            var validationDataSource = classifier.Tag as AccordAppIdent.ValidationDataSource;
            var predictedValues      = classifier.Model.Decide(validationDataSource.ValidationInputs);

            for (var j = 0; j < predictedValues.Length; j++)
            {
                precMeasure.UpdateStatistics(appIdentAcordSource.LabelsFromInteges[predictedValues[j]],
                                             appIdentAcordSource.LabelsFromInteges[validationDataSource.ValidationOutputs[j]]);
            }
            appIdentTestContext.SaveCrossValidation(precMeasure);

            return(precMeasure);
        }