Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSingleObjectiveMetaModelAnalyzer.cs @ 17776

Last change on this file since 17776 was 17776, checked in by dpiringe, 4 years ago

#3076:

  • changed SymbolicRegressionSingleObjectiveMetaModelAnalyzer to calculate the average quality of an solution for all problems
    • average: because we need to include outlier
  • some architectural changes
  • added new (but empty) meta model analyzer for multi objective -> SymbolicRegressionMultiObjectiveMetaModelAnalyzer
File size: 4.2 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using HEAL.Attic;
7using HeuristicLab.Common;
8using HeuristicLab.Core;
9using HeuristicLab.Data;
10using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
11using HeuristicLab.Optimization;
12
13namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
14  [StorableType("4B69A82A-265B-46DA-9055-B6E0EB6C3EC8")]
15  public class SymbolicRegressionSingleObjectiveMetaModelAnalyzer
16    : SymbolicRegressionMetaModelAnalyzer<SymbolicRegressionSingleObjectiveProblem>, ISymbolicExpressionTreeAnalyzer {
17
18    #region constants
19    private const string BestMetaModelParameterName = "Best Meta Model";
20    #endregion
21
22    #region parameter properties
23    public IResultParameter<ISymbolicRegressionSolution> BestMetaModelParameter =>
24      (IResultParameter<ISymbolicRegressionSolution>)Parameters[BestMetaModelParameterName];
25    #endregion
26
27    #region constructors and cloning
28    [StorableConstructor]
29    protected SymbolicRegressionSingleObjectiveMetaModelAnalyzer(StorableConstructorFlag _) : base(_) { }
30
31    protected SymbolicRegressionSingleObjectiveMetaModelAnalyzer(SymbolicRegressionSingleObjectiveMetaModelAnalyzer original, Cloner cloner) : base(original, cloner) { }
32
33    public SymbolicRegressionSingleObjectiveMetaModelAnalyzer() {
34      Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName,
35        "The best meta model found."));
36    }
37
38    [StorableHook(HookType.AfterDeserialization)]
39    private void AfterDeserialization() {
40      if (!Parameters.ContainsKey(BestMetaModelParameterName))
41        Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName,
42          "The best meta model found."));
43    }
44
45    public override IDeepCloneable Clone(Cloner cloner) => new SymbolicRegressionSingleObjectiveMetaModelAnalyzer(this, cloner);
46    #endregion
47
48    protected override void PerformApply(
49      SymbolicRegressionSingleObjectiveProblem baseProblem,
50      IEnumerable<SymbolicRegressionSingleObjectiveProblem> problems,
51      string targetVariable) {
52      // init
53      var solutions = this.SymbolicExpressionTree.ToArray();
54      var evaluator = baseProblem.Evaluator;
55      var bestQuality = baseProblem.Maximization.Value ? double.MinValue : double.MaxValue;
56      SymbolicRegressionSolution bestMetaModel = null;
57
58      // iterate solutions
59      foreach (var solution in solutions) {
60        double qualityAvg = CalculateAverageQuality(solution, evaluator, problems);
61
62        // check if this solution is the best
63        bool isBest = baseProblem.Maximization.Value ? (bestQuality < qualityAvg) : (bestQuality > qualityAvg);
64        if (isBest) {
65          bestQuality = qualityAvg;
66          bestMetaModel = BuildSolution(solution, targetVariable, baseProblem);
67        }
68      }
69      BestMetaModelParameter.ActualValue = bestMetaModel;
70    }
71
72    private SymbolicRegressionSolution BuildSolution(
73      ISymbolicExpressionTree solution,
74      string targetVariable,
75      SymbolicRegressionSingleObjectiveProblem baseProblem) {
76      var model = new SymbolicRegressionModel(
77            targetVariable,
78            (ISymbolicExpressionTree)solution.Clone(),
79            new SymbolicDataAnalysisExpressionTreeInterpreter());
80      return new SymbolicRegressionSolution(model, baseProblem.ProblemData);
81    }
82
83    private double CalculateAverageQuality(
84      ISymbolicExpressionTree solution,
85      ISymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData> evaluator,
86      IEnumerable<SymbolicRegressionSingleObjectiveProblem> problems) {
87      double qualitySum = 0.0;
88      // iterate problems
89      foreach (var problem in problems) {
90        IDataset dataset = problem.ProblemData.Dataset;
91        IEnumerable<int> rows = Enumerable.Range(0, dataset.Rows);
92        // evalute problem with the evaluator of the base problem
93        qualitySum += evaluator.Evaluate(ExecutionContext, solution, problem.ProblemData, rows);
94      }
95      // calculate the average quality
96      return qualitySum / problems.Count();
97    }
98  }
99}
Note: See TracBrowser for help on using the repository browser.