public static IEnumerable <Tuple <string, double> > CalculateImpacts(
            IClassificationSolution solution,
            ReplacementMethodEnum replacementMethod             = ReplacementMethodEnum.Shuffle,
            FactorReplacementMethodEnum factorReplacementMethod = FactorReplacementMethodEnum.Best,
            DataPartitionEnum dataPartition = DataPartitionEnum.Training)
        {
            IEnumerable <int>    rows = GetPartitionRows(dataPartition, solution.ProblemData);
            IEnumerable <double> estimatedClassValues = solution.GetEstimatedClassValues(rows);
            var model = (IClassificationModel)solution.Model.Clone(); //mkommend: clone of model is necessary, because the thresholds for IDiscriminantClassificationModels are updated

            return(CalculateImpacts(model, solution.ProblemData, estimatedClassValues, rows, replacementMethod, factorReplacementMethod));
        }
Example #2
0
        private void CheckDefaultAsserts(IClassificationSolution solution, Dictionary <string, double> expectedImpacts)
        {
            IClassificationProblemData problemData     = solution.ProblemData;
            IEnumerable <double>       estimatedValues = solution.GetEstimatedClassValues(solution.ProblemData.TrainingIndices);

            var solutionImpacts = ClassificationSolutionVariableImpactsCalculator.CalculateImpacts(solution);
            var modelImpacts    = ClassificationSolutionVariableImpactsCalculator.CalculateImpacts(solution.Model, problemData, estimatedValues, problemData.TrainingIndices);

            //Both ways should return equal results
            Assert.IsTrue(solutionImpacts.SequenceEqual(modelImpacts));

            //Check if impacts are as expected
            Assert.AreEqual(modelImpacts.Count(), expectedImpacts.Count);
            Assert.IsTrue(modelImpacts.All(v => v.Item2.IsAlmost(expectedImpacts[v.Item1])));
        }