private void UpdateVariableImpacts()
        {
            if (Content == null || replacementComboBox.SelectedIndex < 0 ||
                factorVarReplComboBox.SelectedIndex < 0 ||
                dataPartitionComboBox.SelectedIndex < 0)
            {
                return;
            }
            var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;

            variableImactsArrayView.Caption = Content.Name + " Variable Impacts";
            var replMethod =
                (RegressionSolutionVariableImpactsCalculator.ReplacementMethodEnum)
                replacementComboBox.Items[replacementComboBox.SelectedIndex];
            var factorReplMethod =
                (RegressionSolutionVariableImpactsCalculator.FactorReplacementMethodEnum)
                factorVarReplComboBox.Items[factorVarReplComboBox.SelectedIndex];
            var dataPartition =
                (RegressionSolutionVariableImpactsCalculator.DataPartitionEnum)dataPartitionComboBox.SelectedItem;

            Task.Factory.StartNew(() => {
                try {
                    mainForm.AddOperationProgressToView(this, "Calculating variable impacts for " + Content.Name);

                    var impacts                     = RegressionSolutionVariableImpactsCalculator.CalculateImpacts(Content, dataPartition, replMethod, factorReplMethod);
                    var impactArray                 = new DoubleArray(impacts.Select(i => i.Item2).ToArray());
                    impactArray.ElementNames        = impacts.Select(i => i.Item1);
                    variableImactsArrayView.Content = (DoubleArray)impactArray.AsReadOnly();
                } finally {
                    mainForm.RemoveOperationProgressFromView(this);
                }
            });
        }
        public void WrongDataSetVariableImpactRegressionTest()
        {
            IRegressionProblemData problemData = LoadDefaultTowerProblem();
            double rmsError;
            double cvRmsError;
            var    solution = LinearRegression.CreateSolution(problemData, out rmsError, out cvRmsError);

            solution.ProblemData = LoadDefaultMibaProblem();
            RegressionSolutionVariableImpactsCalculator.CalculateImpacts(solution);
        }
        private void CheckDefaultAsserts(IRegressionSolution solution, Dictionary <string, double> expectedImpacts)
        {
            IRegressionProblemData problemData     = solution.ProblemData;
            IEnumerable <double>   estimatedValues = solution.GetEstimatedValues(solution.ProblemData.TrainingIndices);

            var solutionImpacts = RegressionSolutionVariableImpactsCalculator.CalculateImpacts(solution);
            var modelImpacts    = RegressionSolutionVariableImpactsCalculator.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])));
        }
Exemplo n.º 4
0
        private List <Tuple <string, double> > CalculateVariableImpacts(List <string> originalVariableOrdering,
                                                                        IRegressionModel model,
                                                                        IRegressionProblemData problemData,
                                                                        IEnumerable <double> estimatedValues,
                                                                        RegressionSolutionVariableImpactsCalculator.DataPartitionEnum dataPartition,
                                                                        RegressionSolutionVariableImpactsCalculator.ReplacementMethodEnum replMethod,
                                                                        RegressionSolutionVariableImpactsCalculator.FactorReplacementMethodEnum factorReplMethod,
                                                                        CancellationToken token,
                                                                        IProgress progress)
        {
            List <Tuple <string, double> > impacts = new List <Tuple <string, double> >();
            int count              = originalVariableOrdering.Count;
            int i                  = 0;
            var modifiableDataset  = ((Dataset)(problemData.Dataset).Clone()).ToModifiable();
            IEnumerable <int> rows = RegressionSolutionVariableImpactsCalculator.GetPartitionRows(dataPartition, problemData);

            //Calculate original quality-values (via calculator, default is R²)
            IEnumerable <double> targetValuesPartition    = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
            IEnumerable <double> estimatedValuesPartition = Content.GetEstimatedValues(rows);

            var originalCalculatorValue = RegressionSolutionVariableImpactsCalculator.CalculateQuality(targetValuesPartition, estimatedValuesPartition);

            foreach (var variableName in originalVariableOrdering)
            {
                if (cancellationToken.Token.IsCancellationRequested)
                {
                    return(null);
                }
                progress.ProgressValue = (double)++i / count;
                progress.Message       = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);

                double impact = 0;
                //If the variable isn't used for prediction, it has zero impact.
                if (model.VariablesUsedForPrediction.Contains(variableName))
                {
                    impact = RegressionSolutionVariableImpactsCalculator.CalculateImpact(variableName, model, problemData, modifiableDataset, rows, replMethod, factorReplMethod, targetValuesPartition, originalCalculatorValue);
                }
                impacts.Add(new Tuple <string, double>(variableName, impact));
            }

            return(impacts);
        }
        public void PerformanceVariableImpactRegressionTest()
        {
            int rows    = 20000;
            int columns = 77;
            var dataSet = OnlineCalculatorPerformanceTest.CreateRandomDataset(new MersenneTwister(1234), rows, columns);
            IRegressionProblemData problemData = new RegressionProblemData(dataSet, dataSet.VariableNames.Except("y".ToEnumerable()), "y");
            double rmsError;
            double cvRmsError;
            var    solution = LinearRegression.CreateSolution(problemData, out rmsError, out cvRmsError);

            Stopwatch watch = new Stopwatch();

            watch.Start();
            var results = RegressionSolutionVariableImpactsCalculator.CalculateImpacts(solution);

            watch.Stop();

            TestContext.WriteLine("");
            TestContext.WriteLine("Calculated cells per millisecond: {0}.", rows * columns / watch.ElapsedMilliseconds);
        }
        protected virtual void btnImpactCalculation_Click(object sender, EventArgs e)
        {
            var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
            var view     = new StringConvertibleArrayView();

            view.Caption = Content.Name + " Variable Impacts";
            view.Show();

            Task.Factory.StartNew(() => {
                try {
                    mainForm.AddOperationProgressToView(view, "Calculating variable impacts for " + Content.Name);

                    var impacts              = RegressionSolutionVariableImpactsCalculator.CalculateImpacts(Content);
                    var impactArray          = new DoubleArray(impacts.Select(i => i.Item2).ToArray());
                    impactArray.ElementNames = impacts.Select(i => i.Item1);
                    view.Content             = (DoubleArray)impactArray.AsReadOnly();
                }
                finally {
                    mainForm.RemoveOperationProgressFromView(view);
                }
            });
        }