Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/19/20 14:14:11 (4 years ago)
Author:
dpiringe
Message:

#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:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionSingleObjectiveMetaModelAnalyzer.cs

    r17771 r17776  
    99using HeuristicLab.Data;
    1010using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
     11using HeuristicLab.Optimization;
    1112
    1213namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
     
    1516    : SymbolicRegressionMetaModelAnalyzer<SymbolicRegressionSingleObjectiveProblem>, ISymbolicExpressionTreeAnalyzer {
    1617
     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
    1728    [StorableConstructor]
    1829    protected SymbolicRegressionSingleObjectiveMetaModelAnalyzer(StorableConstructorFlag _) : base(_) { }
     
    2031    protected SymbolicRegressionSingleObjectiveMetaModelAnalyzer(SymbolicRegressionSingleObjectiveMetaModelAnalyzer original, Cloner cloner) : base(original, cloner) { }
    2132
    22     public SymbolicRegressionSingleObjectiveMetaModelAnalyzer() { }
     33    public SymbolicRegressionSingleObjectiveMetaModelAnalyzer() {
     34      Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName,
     35        "The best meta model found."));
     36    }
    2337
    2438    [StorableHook(HookType.AfterDeserialization)]
    25     private void AfterDeserialization() { }
     39    private void AfterDeserialization() {
     40      if (!Parameters.ContainsKey(BestMetaModelParameterName))
     41        Parameters.Add(new ResultParameter<ISymbolicRegressionSolution>(BestMetaModelParameterName,
     42          "The best meta model found."));
     43    }
    2644
    2745    public override IDeepCloneable Clone(Cloner cloner) => new SymbolicRegressionSingleObjectiveMetaModelAnalyzer(this, cloner);
     46    #endregion
    2847
    29     protected override void PerformApply(SymbolicRegressionSingleObjectiveProblem problem, string targetVariable) {
    30       double bestQuality = problem.Maximization.Value ? double.MinValue : double.MaxValue;
     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;
    3156      SymbolicRegressionSolution bestMetaModel = null;
    32       foreach (var tree in this.SymbolicExpressionTree.ToArray()) {
    33         IDataset dataset = problem.ProblemData.Dataset;
    34         IEnumerable<int> rows = Enumerable.Range(0, dataset.Rows);
    35         var quality = problem.Evaluator.Evaluate(ExecutionContext, tree, problem.ProblemData, rows);
    36        
    37         bool isBetter = problem.Maximization.Value ? (bestQuality < quality) : (bestQuality > quality);
    38         if(isBetter) {
    39           bestQuality = quality;
    40           var model = new SymbolicRegressionModel(
    41             targetVariable,
    42             (ISymbolicExpressionTree)tree.Clone(),
    43             new SymbolicDataAnalysisExpressionTreeInterpreter());
    44           bestMetaModel = new SymbolicRegressionSolution(model, problem.ProblemData);
     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);
    4567        }
    4668      }
    4769      BestMetaModelParameter.ActualValue = bestMetaModel;
    4870    }
     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    }
    4998  }
    5099}
Note: See TracChangeset for help on using the changeset viewer.