Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/18/16 17:14:33 (6 years ago)
Author:
bburlacu
Message:

#2635: Improve performance and accuracy of evaluator and analyzer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.OSGAEvaluator/HeuristicLab.OSGAEvaluator/SymbolicRegressionSingleObjectiveOSGAEvaluator.cs

    r14072 r14104  
    2323using System.Collections.Generic;
    2424using System.Linq;
    25 using HeuristicLab.Analysis;
    2625using HeuristicLab.Common;
    2726using HeuristicLab.Core;
     
    4443      get { return (ILookupParameter<ResultCollection>)Parameters[ResultCollectionParameterName]; }
    4544    }
    46     public IFixedValueParameter<IntValue> CorrectlyRejectedParameter {
    47       get { return (IFixedValueParameter<IntValue>)Parameters["CorrectlyRejected"]; }
    48     }
    49     public IFixedValueParameter<IntValue> IncorrectlyRejectedParameter {
    50       get { return (IFixedValueParameter<IntValue>)Parameters["IncorrectlyRejected"]; }
    51     }
    52     public IFixedValueParameter<IntValue> CorrectlyNotRejectedParameter {
    53       get { return (IFixedValueParameter<IntValue>)Parameters["CorrectlyNotRejected"]; }
    54     }
    55     public IFixedValueParameter<IntValue> IncorrectlyNotRejectedParameter {
    56       get { return (IFixedValueParameter<IntValue>)Parameters["IncorrectlyNotRejected"]; }
     45
     46    public IValueParameter<IntMatrix> RejectedStatsParameter {
     47      get { return (IValueParameter<IntMatrix>)Parameters["RejectedStats"]; }
     48    }
     49    public IValueParameter<IntMatrix> NotRejectedStatsParameter {
     50      get { return (IValueParameter<IntMatrix>)Parameters["TotalStats"]; }
    5751    }
    5852    public IValueLookupParameter<DoubleValue> ComparisonFactorParameter {
     
    7973    }
    8074
    81     public int CorrectlyRejected {
    82       get { return CorrectlyRejectedParameter.Value.Value; }
    83       set { CorrectlyRejectedParameter.Value.Value = value; }
    84     }
    85 
    86     public int CorrectlyNotRejected {
    87       get { return CorrectlyNotRejectedParameter.Value.Value; }
    88       set { CorrectlyNotRejectedParameter.Value.Value = value; }
    89     }
    90 
    91     public int IncorrectlyRejected {
    92       get { return IncorrectlyRejectedParameter.Value.Value; }
    93       set { IncorrectlyRejectedParameter.Value.Value = value; }
    94     }
    95 
    96     public int IncorrectlyNotRejected {
    97       get { return IncorrectlyNotRejectedParameter.Value.Value; }
    98       set { IncorrectlyNotRejectedParameter.Value.Value = value; }
     75    public IntMatrix RejectedStats {
     76      get { return RejectedStatsParameter.Value; }
     77      set { RejectedStatsParameter.Value = value; }
     78    }
     79
     80    public IntMatrix TotalStats {
     81      get { return NotRejectedStatsParameter.Value; }
     82      set { NotRejectedStatsParameter.Value = value; }
    9983    }
    10084    #endregion
     
    10690    public SymbolicRegressionSingleObjectiveOsgaEvaluator() {
    10791      Parameters.Add(new ValueLookupParameter<DoubleValue>("ComparisonFactor", "Determines if the quality should be compared to the better parent (1.0), to the worse (0.0) or to any linearly interpolated value between them."));
    108       Parameters.Add(new FixedValueParameter<PercentValue>(RelativeParentChildQualityThresholdParameterName, new PercentValue(0.1)));
     92      Parameters.Add(new FixedValueParameter<PercentValue>(RelativeParentChildQualityThresholdParameterName, new PercentValue(0.9)));
    10993      Parameters.Add(new FixedValueParameter<PercentValue>(RelativeFitnessEvaluationIntervalSizeParameterName, new PercentValue(0.1)));
    110       Parameters.Add(new FixedValueParameter<IntValue>("CorrectlyRejected", new IntValue(0)));
    111       Parameters.Add(new FixedValueParameter<IntValue>("IncorrectlyRejected", new IntValue(0)));
    112       Parameters.Add(new FixedValueParameter<IntValue>("CorrectlyNotRejected", new IntValue(0)));
    113       Parameters.Add(new FixedValueParameter<IntValue>("IncorrectlyNotRejected", new IntValue(0)));
    11494      Parameters.Add(new LookupParameter<ResultCollection>(ResultCollectionParameterName));
    11595      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ParentQualities") { ActualName = "Quality" });
     96      Parameters.Add(new ValueParameter<IntMatrix>("RejectedStats", new IntMatrix()));
     97      Parameters.Add(new ValueParameter<IntMatrix>("TotalStats", new IntMatrix()));
    11698    }
    11799
     
    123105      if (!Parameters.ContainsKey("ParentQualities"))
    124106        Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ParentQualities") { ActualName = "Quality" });
     107
     108      if (!Parameters.ContainsKey("RejectedStats"))
     109        Parameters.Add(new ValueParameter<IntMatrix>("RejectedStats", new IntMatrix()));
     110
     111      if (!Parameters.ContainsKey("TotalStats"))
     112        Parameters.Add(new ValueParameter<IntMatrix>("TotalStats", new IntMatrix()));
    125113    }
    126114
     
    136124    public override void ClearState() {
    137125      base.ClearState();
    138       CorrectlyNotRejected = 0;
    139       CorrectlyRejected = 0;
    140       IncorrectlyNotRejected = 0;
    141       IncorrectlyRejected = 0;
     126      RejectedStats = new IntMatrix();
     127      TotalStats = new IntMatrix();
    142128    }
    143129
     
    216202
    217203      var interval = (int)Math.Floor(problemData.TrainingPartition.Size * RelativeFitnessEvaluationIntervalSize);
    218       var i = 0;
     204      var i = problemData.TrainingPartition.Start;
     205      var trainingEnd = problemData.TrainingPartition.End;
    219206      var qualityPerInterval = new List<double>();
    220207      while (targetValuesEnumerator.MoveNext() && scaledEstimatedValuesEnumerator.MoveNext()) {
    221208        pearsonRCalculator.Add(targetValuesEnumerator.Current, scaledEstimatedValuesEnumerator.Current);
    222209        ++i;
    223         if (i % interval == 0) {
     210        if (i % interval == 0 || i == trainingEnd) {
    224211          var q = pearsonRCalculator.ErrorState != OnlineCalculatorError.None ? double.NaN : pearsonRCalculator.R;
    225212          qualityPerInterval.Add(q * q);
     
    235222      var threshold = parentQuality * RelativeParentChildQualityThreshold;
    236223
    237       //var predictedRejected = qualityPerInterval.Any(x => double.IsNaN(x) || !(x > threshold));
    238 
    239224      bool predictedRejected = false;
    240 
    241       DataTable table;
    242       var results = ResultCollectionParameter.ActualValue;
    243       if (!results.ContainsKey("RejectionCounts")) {
    244         table = new DataTable("RejectionCounts");
    245         results.Add(new Result("RejectionCounts", table));
    246 
    247         var row = new DataRow("Predicted Rejected") { VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Histogram } };
    248         table.Rows.Add(row);
    249 
    250         row = new DataRow("Actually Rejected") { VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Histogram } };
    251         table.Rows.Add(row);
    252 
    253         //        row = new DataRow("Actually Not Rejected") { VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true } };
    254         //        row.Values.AddRange(qualityPerInterval.Select(x => 0.0));
    255         //        table.Rows.Add(row);
    256         //
    257         //        row = new DataRow("Predicted Not Rejected") { VisualProperties = { ChartType = DataRowVisualProperties.DataRowChartType.Columns, StartIndexZero = true } };
    258         //        row.Values.AddRange(qualityPerInterval.Select(x => 0.0));
    259         //        table.Rows.Add(row);
    260       } else {
    261         table = (DataTable)results["RejectionCounts"].Value;
    262       }
    263225
    264226      i = 0;
     
    272234
    273235      var actuallyRejected = !(actualQuality > parentQuality);
     236
     237      if (RejectedStats.Rows == 0 || TotalStats.Rows == 0) {
     238        RejectedStats = new IntMatrix(2, qualityPerInterval.Count);
     239        RejectedStats.RowNames = new[] { "Predicted", "Actual" };
     240        RejectedStats.ColumnNames = Enumerable.Range(1, RejectedStats.Columns).Select(x => string.Format("0-{0}", Math.Min(trainingEnd, x * interval)));
     241        TotalStats = new IntMatrix(2, 2);
     242        TotalStats.RowNames = new[] { "Predicted", "Actual" };
     243        TotalStats.ColumnNames = new[] { "Rejected", "Not Rejected" };
     244      }
     245      // gather some statistics
    274246      if (predictedRejected) {
    275         table.Rows["Predicted Rejected"].Values.Add(i);
    276         if (actuallyRejected)
    277           table.Rows["Actually Rejected"].Values.Add(i);
    278       }
    279       //      else {
    280       //        table.Rows["Predicted Not Rejected"].Values[i]++;
    281       //        if (!actuallyRejected)
    282       //          table.Rows["Actually Not Rejected"].Values[i]++;
    283       //      }
    284 
    285       if (predictedRejected) {
    286         if (actuallyRejected) {
    287           CorrectlyRejected++;
    288         } else {
    289           IncorrectlyRejected++;
    290         }
    291       } else {
    292         if (actuallyRejected) {
    293           IncorrectlyNotRejected++;
    294         } else {
    295           CorrectlyNotRejected++;
    296         }
     247        RejectedStats[0, i]++;
     248        TotalStats[0, 0]++;
     249      } else {
     250        TotalStats[0, 1]++;
     251      }
     252      if (actuallyRejected) {
     253        TotalStats[1, 0]++;
     254      } else {
     255        TotalStats[1, 1]++;
     256      }
     257      if (predictedRejected && actuallyRejected) {
     258        RejectedStats[1, i]++;
    297259      }
    298260      return r * r;
Note: See TracChangeset for help on using the changeset viewer.