Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs @ 3683

Last change on this file since 3683 was 3683, checked in by gkronber, 14 years ago

Added 'special treatment' of operators that use LookupParameters instead of ScopeTreeLookupParameters contained in analyzers. #999

File size: 21.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System.Linq;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Data;
26using HeuristicLab.Operators;
27using HeuristicLab.Optimization;
28using HeuristicLab.Parameters;
29using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
30using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
31using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic;
32using HeuristicLab.Problems.DataAnalysis.Symbolic;
33using System.Collections.Generic;
34using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
35using HeuristicLab.Problems.DataAnalysis;
36using HeuristicLab.Analysis;
37using HeuristicLab.Problems.DataAnalysis.Evaluators;
38using HeuristicLab.Optimization.Operators;
39using System;
40
41namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
42  /// <summary>
43  /// "An operator for analyzing the quality of symbolic regression solutions symbolic expression tree encoding."
44  /// </summary>
45  [Item("SymbolicRegressionModelQualityAnalyzer", "An operator for analyzing the quality of symbolic regression solutions symbolic expression tree encoding.")]
46  [StorableClass]
47  public sealed class SymbolicRegressionModelQualityAnalyzer : AlgorithmOperator, ISymbolicRegressionAnalyzer {
48    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
49    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
50    private const string ProblemDataParameterName = "ProblemData";
51    private const string ResultsParameterName = "Results";
52
53    private const string TrainingMeanSquaredErrorQualityParameterName = "TrainingMeanSquaredError";
54    private const string MinTrainingMeanSquaredErrorQualityParameterName = "MinTrainingMeanSquaredError";
55    private const string MaxTrainingMeanSquaredErrorQualityParameterName = "MaxTrainingMeanSquaredError";
56    private const string AverageTrainingMeanSquaredErrorQualityParameterName = "AverageTrainingMeanSquaredError";
57    private const string BestTrainingMeanSquaredErrorQualityParameterName = "BestTrainingMeanSquaredError";
58
59    private const string TrainingAverageRelativeErrorQualityParameterName = "TrainingAverageRelativeError";
60    private const string MinTrainingAverageRelativeErrorQualityParameterName = "MinTrainingAverageRelativeError";
61    private const string MaxTrainingAverageRelativeErrorQualityParameterName = "MaxTrainingAverageRelativeError";
62    private const string AverageTrainingAverageRelativeErrorQualityParameterName = "AverageTrainingAverageRelativeError";
63    private const string BestTrainingAverageRelativeErrorQualityParameterName = "BestTrainingAverageRelativeError";
64
65    private const string TrainingRSquaredQualityParameterName = "TrainingRSquared";
66    private const string MinTrainingRSquaredQualityParameterName = "MinTrainingRSquared";
67    private const string MaxTrainingRSquaredQualityParameterName = "MaxTrainingRSquared";
68    private const string AverageTrainingRSquaredQualityParameterName = "AverageTrainingRSquared";
69    private const string BestTrainingRSquaredQualityParameterName = "BestTrainingRSquared";
70
71    private const string TestMeanSquaredErrorQualityParameterName = "TestMeanSquaredError";
72    private const string MinTestMeanSquaredErrorQualityParameterName = "MinTestMeanSquaredError";
73    private const string MaxTestMeanSquaredErrorQualityParameterName = "MaxTestMeanSquaredError";
74    private const string AverageTestMeanSquaredErrorQualityParameterName = "AverageTestMeanSquaredError";
75    private const string BestTestMeanSquaredErrorQualityParameterName = "BestTestMeanSquaredError";
76
77    private const string TestAverageRelativeErrorQualityParameterName = "TestAverageRelativeError";
78    private const string MinTestAverageRelativeErrorQualityParameterName = "MinTestAverageRelativeError";
79    private const string MaxTestAverageRelativeErrorQualityParameterName = "MaxTestAverageRelativeError";
80    private const string AverageTestAverageRelativeErrorQualityParameterName = "AverageTestAverageRelativeError";
81    private const string BestTestAverageRelativeErrorQualityParameterName = "BestTestAverageRelativeError";
82
83    private const string TestRSquaredQualityParameterName = "TestRSquared";
84    private const string MinTestRSquaredQualityParameterName = "MinTestRSquared";
85    private const string MaxTestRSquaredQualityParameterName = "MaxTestRSquared";
86    private const string AverageTestRSquaredQualityParameterName = "AverageTestRSquared";
87    private const string BestTestRSquaredQualityParameterName = "BestTestRSquared";
88
89    private const string RSquaredValuesParameterName = "R-squared Values";
90    private const string MeanSquaredErrorValuesParameterName = "Mean Squared Error Values";
91    private const string RelativeErrorValuesParameterName = "Average Relative Error Values";
92
93    private const string TrainingSamplesStartParameterName = "TrainingSamplesStart";
94    private const string TrainingSamplesEndParameterName = "TrainingSamplesEnd";
95    private const string TestSamplesStartParameterName = "TestSamplesStart";
96    private const string TestSamplesEndParameterName = "TestSamplesEnd";
97    private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
98    private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
99
100    #region parameter properties
101    public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
102      get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
103    }
104    public IValueLookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
105      get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
106    }
107    public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
108      get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
109    }
110    public IValueLookupParameter<IntValue> TrainingSamplesStartParameter {
111      get { return (IValueLookupParameter<IntValue>)Parameters[TrainingSamplesStartParameterName]; }
112    }
113    public IValueLookupParameter<IntValue> TrainingSamplesEndParameter {
114      get { return (IValueLookupParameter<IntValue>)Parameters[TrainingSamplesEndParameterName]; }
115    }
116    public IValueLookupParameter<IntValue> TestSamplesStartParameter {
117      get { return (IValueLookupParameter<IntValue>)Parameters[TestSamplesStartParameterName]; }
118    }
119    public IValueLookupParameter<IntValue> TestSamplesEndParameter {
120      get { return (IValueLookupParameter<IntValue>)Parameters[TestSamplesEndParameterName]; }
121    }
122    public IValueLookupParameter<DoubleValue> UpperEstimationLimitParameter {
123      get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperEstimationLimitParameterName]; }
124    }
125    public IValueLookupParameter<DoubleValue> LowerEstimationLimitParameter {
126      get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerEstimationLimitParameterName]; }
127    }
128    public ILookupParameter<ResultCollection> ResultsParameter {
129      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
130    }
131    #endregion
132
133    [Storable]
134    private SymbolicRegressionModelQualityCalculator trainingQualityCalculator;
135    [Storable]
136    private SymbolicRegressionModelQualityCalculator testQualityCalculator;
137    [Storable]
138    private MinAverageMaxValueAnalyzer minAvgMaxTrainingMseAnalyzer;
139    [Storable]
140    private MinAverageMaxValueAnalyzer minAvgMaxTestMseAnalyzer;
141    [Storable]
142    private MinAverageMaxValueAnalyzer minAvgMaxTrainingRSquaredAnalyzer;
143    [Storable]
144    private MinAverageMaxValueAnalyzer minAvgMaxTestRSquaredAnalyzer;
145    [Storable]
146    private MinAverageMaxValueAnalyzer minAvgMaxTrainingRelErrorAnalyzer;
147    [Storable]
148    private MinAverageMaxValueAnalyzer minAvgMaxTestRelErrorAnalyzer;
149
150    public SymbolicRegressionModelQualityAnalyzer()
151      : base() {
152      Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
153      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used to calculate the output values of the symbolic expression tree."));
154      Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data containing the input varaibles for the symbolic regression problem."));
155      Parameters.Add(new ValueLookupParameter<IntValue>(TrainingSamplesStartParameterName, "The first index of the training data set partition on which the model quality values should be calculated."));
156      Parameters.Add(new ValueLookupParameter<IntValue>(TrainingSamplesEndParameterName, "The last index of the training data set partition on which the model quality values should be calculated."));
157      Parameters.Add(new ValueLookupParameter<IntValue>(TestSamplesStartParameterName, "The first index of the test data set partition on which the model quality values should be calculated."));
158      Parameters.Add(new ValueLookupParameter<IntValue>(TestSamplesEndParameterName, "The last index of the test data set partition on which the model quality values should be calculated."));
159      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper limit that should be used as cut off value for the output values of symbolic expression trees."));
160      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
161      Parameters.Add(new ValueLookupParameter<DataTable>(MeanSquaredErrorValuesParameterName, "The data table to collect mean squared error values."));
162      Parameters.Add(new ValueLookupParameter<DataTable>(RSquaredValuesParameterName, "The data table to collect R² correlation coefficient values."));
163      Parameters.Add(new ValueLookupParameter<DataTable>(RelativeErrorValuesParameterName, "The data table to collect relative error values."));
164      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
165
166      #region operator initialization
167      trainingQualityCalculator = new SymbolicRegressionModelQualityCalculator();
168      testQualityCalculator = new SymbolicRegressionModelQualityCalculator();
169      minAvgMaxTrainingMseAnalyzer = new MinAverageMaxValueAnalyzer();
170      minAvgMaxTestMseAnalyzer = new MinAverageMaxValueAnalyzer();
171
172      minAvgMaxTrainingRSquaredAnalyzer = new MinAverageMaxValueAnalyzer();
173      minAvgMaxTestRSquaredAnalyzer = new MinAverageMaxValueAnalyzer();
174
175      minAvgMaxTrainingRelErrorAnalyzer = new MinAverageMaxValueAnalyzer();
176      minAvgMaxTestRelErrorAnalyzer = new MinAverageMaxValueAnalyzer();
177      #endregion
178
179      #region parameter wiring
180      trainingQualityCalculator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
181      trainingQualityCalculator.ProblemDataParameter.ActualName = ProblemDataParameter.Name;
182      trainingQualityCalculator.SamplesStartParameter.ActualName = TrainingSamplesStartParameter.Name;
183      trainingQualityCalculator.SamplesEndParameter.ActualName = TrainingSamplesEndParameter.Name;
184      trainingQualityCalculator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
185      trainingQualityCalculator.SymbolicExpressionTreeParameter.ActualName = SymbolicExpressionTreeParameter.Name;
186      trainingQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
187      trainingQualityCalculator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
188      trainingQualityCalculator.AverageRelativeErrorQualityParameter.ActualName = TrainingAverageRelativeErrorQualityParameterName;
189      trainingQualityCalculator.MeanSquaredErrorQualityParameter.ActualName = TrainingMeanSquaredErrorQualityParameterName;
190      trainingQualityCalculator.RSquaredQualityParameter.ActualName = TrainingRSquaredQualityParameterName;
191
192      testQualityCalculator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
193      testQualityCalculator.ProblemDataParameter.ActualName = ProblemDataParameter.Name;
194      testQualityCalculator.SamplesStartParameter.ActualName = TestSamplesStartParameter.Name;
195      testQualityCalculator.SamplesEndParameter.ActualName = TestSamplesEndParameter.Name;
196      testQualityCalculator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
197      testQualityCalculator.SymbolicExpressionTreeParameter.ActualName = SymbolicExpressionTreeParameter.Name;
198      testQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
199      testQualityCalculator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
200      testQualityCalculator.AverageRelativeErrorQualityParameter.ActualName = TestAverageRelativeErrorQualityParameterName;
201      testQualityCalculator.MeanSquaredErrorQualityParameter.ActualName = TestMeanSquaredErrorQualityParameterName;
202      testQualityCalculator.RSquaredQualityParameter.ActualName = TestRSquaredQualityParameterName;
203      #region training/test MSE
204      minAvgMaxTrainingMseAnalyzer.ValueParameter.ActualName = TrainingMeanSquaredErrorQualityParameterName;
205      minAvgMaxTrainingMseAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
206      minAvgMaxTrainingMseAnalyzer.AverageValueParameter.ActualName = AverageTrainingMeanSquaredErrorQualityParameterName;
207      minAvgMaxTrainingMseAnalyzer.MaxValueParameter.ActualName = MaxTrainingMeanSquaredErrorQualityParameterName;
208      minAvgMaxTrainingMseAnalyzer.MinValueParameter.ActualName = MinTrainingMeanSquaredErrorQualityParameterName;
209      minAvgMaxTrainingMseAnalyzer.ValuesParameter.ActualName = MeanSquaredErrorValuesParameterName;
210      minAvgMaxTrainingMseAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
211
212      minAvgMaxTestMseAnalyzer.ValueParameter.ActualName = TestMeanSquaredErrorQualityParameterName;
213      minAvgMaxTestMseAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
214      minAvgMaxTestMseAnalyzer.AverageValueParameter.ActualName = AverageTestMeanSquaredErrorQualityParameterName;
215      minAvgMaxTestMseAnalyzer.MaxValueParameter.ActualName = MaxTestMeanSquaredErrorQualityParameterName;
216      minAvgMaxTestMseAnalyzer.MinValueParameter.ActualName = MinTestMeanSquaredErrorQualityParameterName;
217      minAvgMaxTestMseAnalyzer.ValuesParameter.ActualName = MeanSquaredErrorValuesParameterName;
218      minAvgMaxTestMseAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
219      #endregion
220      #region training/test R²
221      minAvgMaxTrainingRSquaredAnalyzer.ValueParameter.ActualName = TrainingRSquaredQualityParameterName;
222      minAvgMaxTrainingRSquaredAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
223      minAvgMaxTrainingRSquaredAnalyzer.AverageValueParameter.ActualName = AverageTrainingRSquaredQualityParameterName;
224      minAvgMaxTrainingRSquaredAnalyzer.MaxValueParameter.ActualName = MaxTrainingRSquaredQualityParameterName;
225      minAvgMaxTrainingRSquaredAnalyzer.MinValueParameter.ActualName = MinTrainingRSquaredQualityParameterName;
226      minAvgMaxTrainingRSquaredAnalyzer.ValuesParameter.ActualName = RSquaredValuesParameterName;
227      minAvgMaxTrainingRSquaredAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
228
229      minAvgMaxTestRSquaredAnalyzer.ValueParameter.ActualName = TestRSquaredQualityParameterName;
230      minAvgMaxTestRSquaredAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
231      minAvgMaxTestRSquaredAnalyzer.AverageValueParameter.ActualName = AverageTestRSquaredQualityParameterName;
232      minAvgMaxTestRSquaredAnalyzer.MaxValueParameter.ActualName = MaxTestRSquaredQualityParameterName;
233      minAvgMaxTestRSquaredAnalyzer.MinValueParameter.ActualName = MinTestRSquaredQualityParameterName;
234      minAvgMaxTestRSquaredAnalyzer.ValuesParameter.ActualName = RSquaredValuesParameterName;
235      minAvgMaxTestRSquaredAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
236      #endregion
237      #region training/test avg. rel. error
238      minAvgMaxTrainingRelErrorAnalyzer.ValueParameter.ActualName = TrainingAverageRelativeErrorQualityParameterName;
239      minAvgMaxTrainingRelErrorAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
240      minAvgMaxTrainingRelErrorAnalyzer.AverageValueParameter.ActualName = AverageTrainingAverageRelativeErrorQualityParameterName;
241      minAvgMaxTrainingRelErrorAnalyzer.MaxValueParameter.ActualName = MaxTrainingAverageRelativeErrorQualityParameterName;
242      minAvgMaxTrainingRelErrorAnalyzer.MinValueParameter.ActualName = MinTrainingAverageRelativeErrorQualityParameterName;
243      minAvgMaxTrainingRelErrorAnalyzer.ValuesParameter.ActualName = RelativeErrorValuesParameterName;
244      minAvgMaxTrainingRelErrorAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
245
246      minAvgMaxTestRelErrorAnalyzer.ValueParameter.ActualName = TestAverageRelativeErrorQualityParameterName;
247      minAvgMaxTestRelErrorAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
248      minAvgMaxTestRelErrorAnalyzer.AverageValueParameter.ActualName = AverageTestAverageRelativeErrorQualityParameterName;
249      minAvgMaxTestRelErrorAnalyzer.MaxValueParameter.ActualName = MaxTestAverageRelativeErrorQualityParameterName;
250      minAvgMaxTestRelErrorAnalyzer.MinValueParameter.ActualName = MinTestAverageRelativeErrorQualityParameterName;
251      minAvgMaxTestRelErrorAnalyzer.ValuesParameter.ActualName = RelativeErrorValuesParameterName;
252      minAvgMaxTestRelErrorAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
253      #endregion
254      #endregion
255
256      #region operator graph
257      OperatorGraph.InitialOperator = trainingQualityCalculator;
258      trainingQualityCalculator.Successor = testQualityCalculator;
259      testQualityCalculator.Successor = minAvgMaxTrainingMseAnalyzer;
260      minAvgMaxTrainingMseAnalyzer.Successor = minAvgMaxTestMseAnalyzer;
261      minAvgMaxTestMseAnalyzer.Successor = minAvgMaxTrainingRSquaredAnalyzer;
262      minAvgMaxTrainingRSquaredAnalyzer.Successor = minAvgMaxTestRSquaredAnalyzer;
263      minAvgMaxTestRSquaredAnalyzer.Successor = minAvgMaxTrainingRelErrorAnalyzer;
264      minAvgMaxTrainingRelErrorAnalyzer.Successor = minAvgMaxTestRelErrorAnalyzer;
265      minAvgMaxTestRelErrorAnalyzer.Successor = null;
266      #endregion
267
268      Initialize();
269    }
270
271    [StorableConstructor]
272    private SymbolicRegressionModelQualityAnalyzer(bool deserializing) : base() { }
273
274    [StorableHook(HookType.AfterDeserialization)]
275    private void Initialize() {
276      SymbolicExpressionTreeParameter.DepthChanged += new EventHandler(SymbolicExpressionTreeParameter_DepthChanged);
277    }
278
279    public override IDeepCloneable Clone(Cloner cloner) {
280      SymbolicRegressionModelQualityAnalyzer clone = (SymbolicRegressionModelQualityAnalyzer)base.Clone(cloner);
281      clone.Initialize();
282      return clone;
283    }
284
285    private void SymbolicExpressionTreeParameter_DepthChanged(object sender, EventArgs e) {
286      trainingQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
287      testQualityCalculator.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
288      minAvgMaxTrainingMseAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
289      minAvgMaxTrainingRelErrorAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
290      minAvgMaxTrainingRSquaredAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
291      minAvgMaxTestMseAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
292      minAvgMaxTestRelErrorAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
293      minAvgMaxTestRSquaredAnalyzer.ValueParameter.Depth = SymbolicExpressionTreeParameter.Depth;
294    }
295  }
296}
Note: See TracBrowser for help on using the repository browser.