Changeset 4191 for trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs
- Timestamp:
- 08/11/10 12:00:53 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs
r4127 r4191 46 46 private const string ValidationSamplesStartParameterName = "SamplesStart"; 47 47 private const string ValidationSamplesEndParameterName = "SamplesEnd"; 48 private const string QualityParameterName = "Quality";48 // private const string QualityParameterName = "Quality"; 49 49 private const string UpperEstimationLimitParameterName = "UpperEstimationLimit"; 50 50 private const string LowerEstimationLimitParameterName = "LowerEstimationLimit"; 51 private const string EvaluatorParameterName = "Evaluator"; 52 private const string MaximizationParameterName = "Maximization"; 51 53 private const string BestSolutionParameterName = "Best solution (validation)"; 52 54 private const string BestSolutionQualityParameterName = "Best solution quality (validation)"; … … 109 111 get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; } 110 112 } 113 public ILookupParameter<ISymbolicRegressionEvaluator> EvaluatorParameter { 114 get { return (ILookupParameter<ISymbolicRegressionEvaluator>)Parameters[EvaluatorParameterName]; } 115 } 116 public ILookupParameter<BoolValue> MaximizationParameter { 117 get { return (ILookupParameter<BoolValue>)Parameters[MaximizationParameterName]; } 118 } 111 119 public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter { 112 120 get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; } … … 158 166 get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; } 159 167 } 168 public ISymbolicRegressionEvaluator Evaluator { 169 get { return EvaluatorParameter.ActualValue; } 170 } 171 public BoolValue Maximization { 172 get { return MaximizationParameter.ActualValue; } 173 } 160 174 public DataAnalysisProblemData ProblemData { 161 175 get { return ProblemDataParameter.ActualValue; } … … 185 199 public IntValue Generations { 186 200 get { return GenerationsParameter.ActualValue; } 201 } 202 public DoubleValue BestSolutionQuality { 203 get { return BestSolutionQualityParameter.ActualValue; } 187 204 } 188 205 … … 192 209 : base() { 193 210 Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator to use.")); 211 Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set.")); 194 212 Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze.")); 195 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The quality of the symbolic expression trees to analyze."));213 Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization.")); 196 214 Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees.")); 197 215 Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution.")); … … 212 230 private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base() { } 213 231 232 [StorableHook(HookType.AfterDeserialization)] 233 private void AfterDeserialization() { 234 #region compatibility remove before releasing 3.3.1 235 if (!Parameters.ContainsKey(EvaluatorParameterName)) { 236 Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set.")); 237 } 238 if (!Parameters.ContainsKey(MaximizationParameterName)) { 239 Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization.")); 240 } 241 #endregion 242 } 243 214 244 public override IOperation Apply() { 215 245 var trees = SymbolicExpressionTree; … … 228 258 double lowerEstimationLimit = LowerEstimationLimit != null ? LowerEstimationLimit.Value : double.NegativeInfinity; 229 259 230 double best ValidationRSquared = -1.0;260 double bestQuality = Maximization.Value ? double.NegativeInfinity : double.PositiveInfinity; 231 261 SymbolicExpressionTree bestTree = null; 232 262 233 263 foreach (var tree in trees) { 234 double validationRSquared = SymbolicRegressionPearsonsRSquaredEvaluator.Calculate(SymbolicExpressionTreeInterpreter, tree,264 double quality = Evaluator.Evaluate(SymbolicExpressionTreeInterpreter, tree, 235 265 lowerEstimationLimit, upperEstimationLimit, 236 266 ProblemData.Dataset, targetVariable, 237 267 rows); 238 268 239 if (validationRSquared > bestValidationRSquared) { 240 bestValidationRSquared = validationRSquared; 269 if ((Maximization.Value && quality > bestQuality) || 270 (!Maximization.Value && quality < bestQuality)) { 271 bestQuality = quality; 241 272 bestTree = tree; 242 273 } 243 274 } 244 275 245 246 276 // if the best validation tree is better than the current best solution => update 247 if (BestSolutionQualityParameter.ActualValue == null || BestSolutionQualityParameter.ActualValue.Value < bestValidationRSquared) { 248 // calculate scaling parameters and validation MSE only for the best tree 249 // scale tree for solution 277 bool newBest = 278 BestSolutionQuality == null || 279 (Maximization.Value && bestQuality > BestSolutionQuality.Value) || 280 (!Maximization.Value && bestQuality < BestSolutionQuality.Value); 281 if (newBest) { 282 // calculate scaling parameters and only for the best tree using the full training set 250 283 double alpha, beta; 251 double validationMSE = SymbolicRegressionScaledMeanSquaredErrorEvaluator.Calculate(SymbolicExpressionTreeInterpreter, bestTree, 284 int trainingStart = ProblemData.TrainingSamplesStart.Value; 285 int trainingEnd = ProblemData.TrainingSamplesEnd.Value; 286 IEnumerable<int> trainingRows = Enumerable.Range(trainingStart, trainingEnd - trainingStart); 287 SymbolicRegressionScaledMeanSquaredErrorEvaluator.Calculate(SymbolicExpressionTreeInterpreter, bestTree, 252 288 lowerEstimationLimit, upperEstimationLimit, 253 289 ProblemData.Dataset, targetVariable, 254 rows, out beta, out alpha); 255 290 trainingRows, out beta, out alpha); 291 292 // scale tree for solution 256 293 var scaledTree = SymbolicRegressionSolutionLinearScaler.Scale(bestTree, alpha, beta); 257 294 var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(), … … 262 299 263 300 BestSolutionParameter.ActualValue = solution; 264 BestSolutionQualityParameter.ActualValue = new DoubleValue(best ValidationRSquared);301 BestSolutionQualityParameter.ActualValue = new DoubleValue(bestQuality); 265 302 266 303 BestSymbolicRegressionSolutionAnalyzer.UpdateBestSolutionResults(solution, ProblemData, Results, Generations, VariableFrequencies); 267 304 } 305 268 306 269 307 if (!Results.ContainsKey(BestSolutionQualityValuesParameterName)) { … … 273 311 } 274 312 Results[BestSolutionQualityParameterName].Value = new DoubleValue(BestSolutionQualityParameter.ActualValue.Value); 275 Results[CurrentBestValidationQualityParameterName].Value = new DoubleValue(best ValidationRSquared);313 Results[CurrentBestValidationQualityParameterName].Value = new DoubleValue(bestQuality); 276 314 277 315 DataTable validationValues = (DataTable)Results[BestSolutionQualityValuesParameterName].Value; 278 316 AddValue(validationValues, BestSolutionQualityParameter.ActualValue.Value, BestSolutionQualityParameterName, BestSolutionQualityParameterName); 279 AddValue(validationValues, best ValidationRSquared, CurrentBestValidationQualityParameterName, CurrentBestValidationQualityParameterName);317 AddValue(validationValues, bestQuality, CurrentBestValidationQualityParameterName, CurrentBestValidationQualityParameterName); 280 318 return base.Apply(); 281 319 }
Note: See TracChangeset
for help on using the changeset viewer.