public override void Execute() { IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView; var solutionGroups = from pair in GetDataAnalysisResults(activeView) group pair.Value by pair.Key into g select g; foreach (var group in solutionGroups) { // check if all solutions in the group are either only regression or only classification solutions if (group.All(s => s is IRegressionSolution)) { // show all regression ensembles // N.B. this assumes all solutions are based on the same problem data! // the problem data is not cloned because the individual solutions were already cloned var problemData = group.OfType<IRegressionSolution>().First().ProblemData; var ensemble = new RegressionEnsembleSolution(problemData); ensemble.Name = group.Key + " ensemble"; var nestedSolutions = group.OfType<RegressionEnsembleSolution>().SelectMany(e => e.RegressionSolutions); var solutions = group.Where(s => !(s is RegressionEnsembleSolution)).OfType<IRegressionSolution>(); ensemble.AddRegressionSolutions(nestedSolutions.Concat(solutions)); MainFormManager.MainForm.ShowContent(ensemble); } else if (group.All(s => s is IClassificationSolution)) { // show all classification ensembles // N.B. this assumes all solutions are based on the same problem data! // the problem data is not cloned because the individual solutions were already cloned var problemData = (ClassificationProblemData)group.OfType<IClassificationSolution>().First().ProblemData; var ensemble = new ClassificationEnsembleSolution(Enumerable.Empty<IClassificationModel>(), problemData); ensemble.Name = group.Key + " ensemble"; var nestedSolutions = group.OfType<ClassificationEnsembleSolution>().SelectMany(e => e.ClassificationSolutions); var solutions = group.Where(s => !(s is ClassificationEnsembleSolution)).OfType<IClassificationSolution>(); ensemble.AddClassificationSolutions(nestedSolutions.Concat(solutions)); MainFormManager.MainForm.ShowContent(ensemble); } } }
private IEnumerable <IResult> ExtractAndAggregateRegressionSolutions(IEnumerable <KeyValuePair <string, IItem> > resultCollections) { Dictionary <string, List <IRegressionSolution> > resultSolutions = new Dictionary <string, List <IRegressionSolution> >(); foreach (var result in resultCollections) { var regressionSolution = result.Value as IRegressionSolution; if (regressionSolution != null) { if (resultSolutions.ContainsKey(result.Key)) { resultSolutions[result.Key].Add(regressionSolution); } else { resultSolutions.Add(result.Key, new List <IRegressionSolution>() { regressionSolution }); } } } List <IResult> aggregatedResults = new List <IResult>(); foreach (KeyValuePair <string, List <IRegressionSolution> > solutions in resultSolutions) { // clone manually to correctly clone references between cloned root objects Cloner cloner = new Cloner(); if (ShuffleSamples.Value) { var dataset = (Dataset)Problem.ProblemData.Dataset; var random = new FastRandom(seed); var shuffledDataset = dataset.Shuffle(random); cloner.RegisterClonedObject(dataset, shuffledDataset); } var problemDataClone = (IRegressionProblemData)cloner.Clone(Problem.ProblemData); // set partitions of problem data clone correctly problemDataClone.TrainingPartition.Start = SamplesStart.Value; problemDataClone.TrainingPartition.End = SamplesEnd.Value; problemDataClone.TestPartition.Start = SamplesStart.Value; problemDataClone.TestPartition.End = SamplesEnd.Value; // clone models var ensembleSolution = new RegressionEnsembleSolution(problemDataClone); ensembleSolution.AddRegressionSolutions(solutions.Value); aggregatedResults.Add(new Result(solutions.Key + " (ensemble)", ensembleSolution)); } List <IResult> flattenedResults = new List <IResult>(); CollectResultsRecursively("", aggregatedResults, flattenedResults); return(flattenedResults); }
public override void Execute() { IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView; var solutionGroups = from pair in GetDataAnalysisResults(activeView) group pair.Value by pair.Key into g select g; foreach (var group in solutionGroups) { // check if all solutions in the group are either only regression or only classification solutions if (group.All(s => s is IRegressionSolution)) { // show all regression ensembles // N.B. this assumes all solutions are based on the same problem data! // the problem data is not cloned because the individual solutions were already cloned var problemData = group.OfType <IRegressionSolution>().First().ProblemData; var ensemble = new RegressionEnsembleSolution(problemData); ensemble.Name = group.Key + " ensemble"; var nestedSolutions = group.OfType <RegressionEnsembleSolution>().SelectMany(e => e.RegressionSolutions); var solutions = group.Where(s => !(s is RegressionEnsembleSolution)).OfType <IRegressionSolution>(); ensemble.AddRegressionSolutions(nestedSolutions.Concat(solutions)); MainFormManager.MainForm.ShowContent(ensemble); } else if (group.All(s => s is IClassificationSolution)) { // show all classification ensembles // N.B. this assumes all solutions are based on the same problem data! // the problem data is not cloned because the individual solutions were already cloned var problemData = (ClassificationProblemData)group.OfType <IClassificationSolution>().First().ProblemData; var ensemble = new ClassificationEnsembleSolution(Enumerable.Empty <IClassificationModel>(), problemData); ensemble.Name = group.Key + " ensemble"; var nestedSolutions = group.OfType <ClassificationEnsembleSolution>().SelectMany(e => e.ClassificationSolutions); var solutions = group.Where(s => !(s is ClassificationEnsembleSolution)).OfType <IClassificationSolution>(); ensemble.AddClassificationSolutions(nestedSolutions.Concat(solutions)); MainFormManager.MainForm.ShowContent(ensemble); } } }