Changeset 8915 for branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification
- Timestamp:
- 11/15/12 16:47:25 (12 years ago)
- Location:
- branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4
- Files:
-
- 21 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj
r8388 r8915 93 93 </PropertyGroup> 94 94 <ItemGroup> 95 <Reference Include="ALGLIB-3.5.0"> 96 <HintPath>..\..\..\..\Trunk\sources\bin\ALGLIB-3.5.0.dll</HintPath> 95 <Reference Include="ALGLIB-3.6.0"> 96 <HintPath>..\..\..\..\Trunk\sources\bin\ALGLIB-3.6.0.dll</HintPath> 97 <Private>False</Private> 97 98 </Reference> 98 99 <Reference Include="HeuristicLab.Analysis-3.3"> 99 100 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath> 101 <Private>False</Private> 100 102 </Reference> 101 103 <Reference Include="HeuristicLab.Collections-3.3"> 102 104 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath> 105 <Private>False</Private> 103 106 </Reference> 104 107 <Reference Include="HeuristicLab.Common-3.3"> 105 108 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath> 109 <Private>False</Private> 110 </Reference> 111 <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL"> 112 <SpecificVersion>False</SpecificVersion> 113 <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath> 114 <Private>False</Private> 106 115 </Reference> 107 116 <Reference Include="HeuristicLab.Core-3.3"> 108 117 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath> 118 <Private>False</Private> 109 119 </Reference> 110 120 <Reference Include="HeuristicLab.Data-3.3"> 111 121 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath> 122 <Private>False</Private> 112 123 </Reference> 113 124 <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4"> 114 125 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath> 126 <Private>False</Private> 115 127 </Reference> 116 128 <Reference Include="HeuristicLab.Operators-3.3"> 117 129 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath> 130 <Private>False</Private> 118 131 </Reference> 119 132 <Reference Include="HeuristicLab.Optimization-3.3"> 120 133 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath> 134 <Private>False</Private> 121 135 </Reference> 122 136 <Reference Include="HeuristicLab.Parameters-3.3"> 123 137 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath> 138 <Private>False</Private> 124 139 </Reference> 125 140 <Reference Include="HeuristicLab.Persistence-3.3"> 126 141 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath> 142 <Private>False</Private> 127 143 </Reference> 128 144 <Reference Include="HeuristicLab.PluginInfrastructure-3.3"> 129 145 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath> 146 <Private>False</Private> 130 147 </Reference> 131 148 <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4"> 132 149 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath> 150 <Private>False</Private> 133 151 </Reference> 134 152 <Reference Include="HeuristicLab.Problems.Instances-3.3"> 135 153 <HintPath>..\..\..\..\Trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath> 154 <Private>False</Private> 136 155 </Reference> 137 156 <Reference Include="System" /> … … 150 169 </ItemGroup> 151 170 <ItemGroup> 171 <Compile Include="Interfaces\ISymbolicClassificationModelCreatorOperator.cs" /> 172 <Compile Include="Interfaces\ISymbolicDiscriminantFunctionClassificationModelCreator.cs" /> 173 <Compile Include="Interfaces\ISymbolicClassificationModelCreator.cs" /> 152 174 <Compile Include="Interfaces\ISymbolicDiscriminantFunctionClassificationModel.cs" /> 175 <Compile Include="ModelCreators\AccuracyMaximizingThresholdsModelCreator.cs" /> 176 <Compile Include="ModelCreators\NearestNeighborModelCreator.cs" /> 177 <Compile Include="ModelCreators\NormalDistributedThresholdsModelCreator.cs" /> 153 178 <Compile Include="MultiObjective\SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs" /> 179 <Compile Include="SymbolicNearestNeighbourClassificationModel.cs" /> 154 180 <Compile Include="Plugin.cs" /> 181 <Compile Include="SingleObjective\SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs" /> 155 182 <Compile Include="SingleObjective\SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs" /> 156 183 <Compile Include="SingleObjective\SymbolicClassificationSingleObjectiveOverfittingAnalyzer.cs" /> … … 178 205 <SubType>Code</SubType> 179 206 </Compile> 180 <Compile Include="SymbolicDiscriminantFunctionClassificationSolutionValuesCalculator.cs" />181 207 <None Include="HeuristicLab.snk" /> 182 208 <None Include="Plugin.cs.frame" /> … … 220 246 --> 221 247 <PropertyGroup> 222 <PreBuildEvent >set Path=%25Path%25;$(ProjectDir);$(SolutionDir)248 <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir) 223 249 set ProjectDir=$(ProjectDir) 224 250 set SolutionDir=$(SolutionDir) … … 227 253 call PreBuildEvent.cmd 228 254 </PreBuildEvent> 255 <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' "> 256 export ProjectDir=$(ProjectDir) 257 export SolutionDir=$(SolutionDir) 258 259 $SolutionDir/PreBuildEvent.sh 260 </PreBuildEvent> 229 261 </PropertyGroup> 230 262 </Project> -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/Interfaces/ISymbolicClassificationModel.cs
r7259 r8915 20 20 #endregion 21 21 22 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;22 using System.Collections.Generic; 23 23 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification { 24 24 public interface ISymbolicClassificationModel : IClassificationModel, ISymbolicDataAnalysisModel { 25 double LowerEstimationLimit { get; } 26 double UpperEstimationLimit { get; } 27 void RecalculateModelParameters(IClassificationProblemData problemData, IEnumerable<int> rows); 28 new ISymbolicClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData); 25 29 } 26 30 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/Interfaces/ISymbolicDiscriminantFunctionClassificationModel.cs
r7259 r8915 20 20 #endregion 21 21 22 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;23 22 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification { 24 23 public interface ISymbolicDiscriminantFunctionClassificationModel : IDiscriminantFunctionClassificationModel, ISymbolicClassificationModel { 25 double LowerEstimationLimit { get; } 26 double UpperEstimationLimit { get; } 24 27 25 } 28 26 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveMeanSquaredErrorTreeSizeEvaluator.cs
r7259 r8915 65 65 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 66 66 EstimationLimitsParameter.ExecutionContext = context; 67 ApplyLinearScalingParameter.ExecutionContext = context; 67 68 68 69 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows); … … 70 71 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 71 72 EstimationLimitsParameter.ExecutionContext = null; 73 ApplyLinearScalingParameter.ExecutionContext = null; 72 74 73 75 return quality; -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectivePearsonRSquaredTreeSizeEvaluator.cs
r6740 r8915 26 26 IEnumerable<int> rows = GenerateRowsToEvaluate(); 27 27 var solution = SymbolicExpressionTreeParameter.ActualValue; 28 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );28 double[] qualities = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 29 29 QualitiesParameter.ActualValue = new DoubleArray(qualities); 30 30 return base.Apply(); 31 31 } 32 32 33 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {33 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 34 34 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 35 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);35 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 36 36 OnlineCalculatorError errorState; 37 double r2 = OnlinePearsonsRSquaredCalculator.Calculate(estimatedValues, originalValues, out errorState); 38 if (errorState != OnlineCalculatorError.None) r2 = 0.0; 39 return new double[] { r2, solution.Length }; 37 38 double r2; 39 if (applyLinearScaling) { 40 var r2Calculator = new OnlinePearsonsRSquaredCalculator(); 41 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, r2Calculator, problemData.Dataset.Rows); 42 errorState = r2Calculator.ErrorState; 43 r2 = r2Calculator.RSquared; 44 } else { 45 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 46 r2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 47 } 48 49 if (errorState != OnlineCalculatorError.None) r2 = double.NaN; 50 return new double[2] { r2, solution.Length }; 40 51 41 52 } … … 45 56 EstimationLimitsParameter.ExecutionContext = context; 46 57 47 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );58 double[] quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 48 59 49 60 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveProblem.cs
r8175 r8915 36 36 private const string EstimationLimitsParameterName = "EstimationLimits"; 37 37 private const string EstimationLimitsParameterDescription = "The lower and upper limit for the estimated value that can be returned by the symbolic classification model."; 38 private const string ModelCreatorParameterName = "ModelCreator"; 39 38 40 39 41 #region parameter properties … … 41 43 get { return (IFixedValueParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 42 44 } 45 public IValueParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 46 get { return (IValueParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 47 } 43 48 #endregion 44 49 #region properties 45 50 public DoubleLimit EstimationLimits { 46 51 get { return EstimationLimitsParameter.Value; } 52 } 53 public ISymbolicClassificationModelCreator ModelCreator { 54 get { return ModelCreatorParameter.Value; } 47 55 } 48 56 #endregion … … 58 66 : base(new ClassificationProblemData(), new SymbolicClassificationMultiObjectiveMeanSquaredErrorTreeSizeEvaluator(), new SymbolicDataAnalysisExpressionTreeCreator()) { 59 67 Parameters.Add(new FixedValueParameter<DoubleLimit>(EstimationLimitsParameterName, EstimationLimitsParameterDescription)); 68 Parameters.Add(new ValueParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "", new AccuracyMaximizingThresholdsModelCreator())); 60 69 70 ApplyLinearScalingParameter.Value.Value = false; 61 71 EstimationLimitsParameter.Hidden = true; 62 72 … … 74 84 [StorableHook(HookType.AfterDeserialization)] 75 85 private void AfterDeserialization() { 86 // BackwardsCompatibility3.4 87 #region Backwards compatible code, remove with 3.5 88 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 89 Parameters.Add(new ValueParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "", new AccuracyMaximizingThresholdsModelCreator())); 90 #endregion 76 91 RegisterEventHandlers(); 77 92 } … … 79 94 private void RegisterEventHandlers() { 80 95 SymbolicExpressionTreeGrammarParameter.ValueChanged += (o, e) => ConfigureGrammarSymbols(); 96 ModelCreatorParameter.NameChanged += (o, e) => ParameterizeOperators(); 81 97 } 82 98 … … 110 126 } 111 127 112 protected newvoid ParameterizeOperators() {128 protected override void ParameterizeOperators() { 113 129 base.ParameterizeOperators(); 114 130 if (Parameters.ContainsKey(EstimationLimitsParameterName)) { 115 131 var operators = Parameters.OfType<IValueParameter>().Select(p => p.Value).OfType<IOperator>().Union(Operators); 116 foreach (var op in operators.OfType<ISymbolicDataAnalysisBoundedOperator>()) { 117 op.EstimationLimitsParameter.ActualName = EstimationLimitsParameterName; 118 } 132 foreach (var op in operators.OfType<ISymbolicDataAnalysisBoundedOperator>()) 133 op.EstimationLimitsParameter.ActualName = EstimationLimitsParameter.Name; 134 foreach (var op in operators.OfType<ISymbolicClassificationModelCreatorOperator>()) 135 op.ModelCreatorParameter.ActualName = ModelCreatorParameter.Name; 119 136 } 120 137 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveTrainingBestSolutionAnalyzer.cs
r7259 r8915 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 34 33 [StorableClass] 35 34 public sealed class SymbolicClassificationMultiObjectiveTrainingBestSolutionAnalyzer : SymbolicDataAnalysisMultiObjectiveTrainingBestSolutionAnalyzer<ISymbolicClassificationSolution>, 36 ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator {35 ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator, ISymbolicClassificationModelCreatorOperator { 37 36 private const string ProblemDataParameterName = "ProblemData"; 37 private const string ModelCreatorParameterName = "ModelCreator"; 38 38 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 39 39 private const string EstimationLimitsParameterName = "EstimationLimits"; 40 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";41 40 42 41 #region parameter properties 43 42 public ILookupParameter<IClassificationProblemData> ProblemDataParameter { 44 43 get { return (ILookupParameter<IClassificationProblemData>)Parameters[ProblemDataParameterName]; } 44 } 45 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 46 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 47 } 48 ILookupParameter<ISymbolicClassificationModelCreator> ISymbolicClassificationModelCreatorOperator.ModelCreatorParameter { 49 get { return ModelCreatorParameter; } 45 50 } 46 51 public ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicDataAnalysisTreeInterpreterParameter { … … 49 54 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { 50 55 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 51 }52 public IValueParameter<BoolValue> ApplyLinearScalingParameter {53 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }54 }55 #endregion56 57 #region properties58 public BoolValue ApplyLinearScaling {59 get { return ApplyLinearScalingParameter.Value; }60 56 } 61 57 #endregion … … 67 63 : base() { 68 64 Parameters.Add(new LookupParameter<IClassificationProblemData>(ProblemDataParameterName, "The problem data for the symbolic classification solution.")); 65 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 69 66 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 70 67 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic classification model.")); 71 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));72 68 } 73 69 public override IDeepCloneable Clone(Cloner cloner) { … … 75 71 } 76 72 73 [StorableHook(HookType.AfterDeserialization)] 74 private void AfterDeserialization() { 75 // BackwardsCompatibility3.4 76 #region Backwards compatible code, remove with 3.5 77 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 78 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 79 #endregion 80 } 81 77 82 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQuality) { 78 var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);79 if (ApplyLinearScaling .Value) {80 SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue); 81 }82 return new SymbolicDiscriminantFunctionClassificationSolution(model,(IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());83 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 84 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 85 86 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); 87 return model.CreateClassificationSolution((IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 83 88 } 84 89 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs
r7259 r8915 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 34 33 [StorableClass] 35 34 public sealed class SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer : SymbolicDataAnalysisMultiObjectiveValidationBestSolutionAnalyzer<ISymbolicClassificationSolution, ISymbolicClassificationMultiObjectiveEvaluator, IClassificationProblemData>, 36 ISymbolicDataAnalysisBoundedOperator { 35 ISymbolicDataAnalysisBoundedOperator, ISymbolicClassificationModelCreatorOperator { 36 private const string ModelCreatorParameterName = "ModelCreator"; 37 37 private const string EstimationLimitsParameterName = "EstimationLimits"; 38 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";39 38 40 39 #region parameter properties … … 42 41 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 43 42 } 44 public IValueParameter<BoolValue> ApplyLinearScalingParameter { 45 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 43 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 44 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 45 } 46 ILookupParameter<ISymbolicClassificationModelCreator> ISymbolicClassificationModelCreatorOperator.ModelCreatorParameter { 47 get { return ModelCreatorParameter; } 46 48 } 47 49 #endregion 48 50 49 #region properties50 public BoolValue ApplyLinearScaling {51 get { return ApplyLinearScalingParameter.Value; }52 }53 #endregion54 51 [StorableConstructor] 55 52 private SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 58 55 : base() { 59 56 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The loewr and upper limit for the estimated values produced by the symbolic classification model.")); 60 Parameters.Add(new Value Parameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));57 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 61 58 } 62 59 public override IDeepCloneable Clone(Cloner cloner) { … … 64 61 } 65 62 63 [StorableHook(HookType.AfterDeserialization)] 64 private void AfterDeserialization() { 65 // BackwardsCompatibility3.4 66 #region Backwards compatible code, remove with 3.5 67 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 68 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 69 #endregion 70 } 71 66 72 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQualities) { 67 var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);68 if (ApplyLinearScaling .Value) {69 SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue); 70 }71 return new SymbolicDiscriminantFunctionClassificationSolution(model,(IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());73 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 74 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 75 76 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); 77 return model.CreateClassificationSolution((IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 72 78 } 73 79 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/Plugin.cs.frame
r8246 r8915 28 28 [Plugin("HeuristicLab.Problems.DataAnalysis.Symbolic.Classification","Provides classes to perform symbolic classification (single- or multiobjective).", "3.4.3.$WCREV$")] 29 29 [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.dll", PluginFileType.Assembly)] 30 [PluginDependency("HeuristicLab.ALGLIB", "3. 5")]30 [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")] 31 31 [PluginDependency("HeuristicLab.Analysis", "3.3")] 32 32 [PluginDependency("HeuristicLab.Common", "3.3")] 33 [PluginDependency("HeuristicLab.Common.Resources", "3.3")] 33 34 [PluginDependency("HeuristicLab.Collections", "3.3")] 34 35 [PluginDependency("HeuristicLab.Core", "3.3")] -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs
r7259 r8915 47 47 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 48 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 50 QualityParameter.ActualValue = new DoubleValue(quality); 51 51 return base.Apply(); 52 52 } 53 53 54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);57 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 OnlineCalculatorError errorState; 58 58 59 double minClassValue = problemData.ClassValues.OrderBy(x => x).First();60 double maxClassValue = problemData.ClassValues.OrderBy(x => x).Last();59 double lowestClassValue = problemData.ClassValues.OrderBy(x => x).First(); 60 double upmostClassValue = problemData.ClassValues.OrderByDescending(x => x).First(); 61 61 62 IEnumerator<double> originalEnumerator = originalValues.GetEnumerator(); 63 IEnumerator<double> estimatedEnumerator = estimatedValues.GetEnumerator(); 64 double errorSum = 0.0; 65 int n = 0; 66 67 // always move forward both enumerators (do not use short-circuit evaluation!) 68 while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) { 69 double estimated = estimatedEnumerator.Current; 70 double original = originalEnumerator.Current; 71 double error = estimated - original; 72 73 if (estimated < minClassValue || estimated > maxClassValue) 74 errorSum += Math.Abs(error); 75 else 76 errorSum += Math.Pow(error, 2); 77 n++; 62 double boundedMse; 63 if (applyLinearScaling) { 64 var boundedMseCalculator = new OnlineBoundedMeanSquaredErrorCalculator(lowestClassValue, upmostClassValue); 65 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, boundedMseCalculator, problemData.Dataset.Rows); 66 errorState = boundedMseCalculator.ErrorState; 67 boundedMse = boundedMseCalculator.BoundedMeanSquaredError; 68 } else { 69 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 70 boundedMse = OnlineBoundedMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, lowestClassValue, upmostClassValue, out errorState); 78 71 } 79 80 // check if both enumerators are at the end to make sure both enumerations have the same length 81 if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext()) { 82 throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); 83 } else { 84 return errorSum / n; 85 } 72 if (errorState != OnlineCalculatorError.None) return Double.NaN; 73 return boundedMse; 86 74 } 87 75 … … 89 77 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 90 78 EstimationLimitsParameter.ExecutionContext = context; 79 ApplyLinearScalingParameter.ExecutionContext = context; 91 80 92 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );81 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 93 82 94 83 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 95 84 EstimationLimitsParameter.ExecutionContext = null; 85 ApplyLinearScalingParameter.ExecutionContext = null; 96 86 97 87 return mse; -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator.cs
r7259 r8915 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 23 24 using HeuristicLab.Common; … … 47 48 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 49 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );50 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 51 QualityParameter.ActualValue = new DoubleValue(quality); 51 52 return base.Apply(); 52 53 } 53 54 54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {55 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 56 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 57 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 58 58 OnlineCalculatorError errorState; 59 double mse = OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimationValues, out errorState); 60 if (errorState != OnlineCalculatorError.None) return double.NaN; 61 else return mse; 59 60 double mse; 61 if (applyLinearScaling) { 62 var mseCalculator = new OnlineMeanSquaredErrorCalculator(); 63 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, mseCalculator, problemData.Dataset.Rows); 64 errorState = mseCalculator.ErrorState; 65 mse = mseCalculator.MeanSquaredError; 66 } else { 67 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 68 mse = OnlineMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 69 } 70 if (errorState != OnlineCalculatorError.None) return Double.NaN; 71 return mse; 62 72 } 63 73 … … 65 75 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 66 76 EstimationLimitsParameter.ExecutionContext = context; 77 ApplyLinearScalingParameter.ExecutionContext = context; 67 78 68 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );79 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 69 80 70 81 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 71 82 EstimationLimitsParameter.ExecutionContext = null; 83 ApplyLinearScalingParameter.ExecutionContext = null; 72 84 73 85 return mse; -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePearsonRSquaredEvaluator.cs
r7259 r8915 47 47 IEnumerable<int> rows = GenerateRowsToEvaluate(); 48 48 var solution = SymbolicExpressionTreeParameter.ActualValue; 49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows );49 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows, ApplyLinearScalingParameter.ActualValue.Value); 50 50 QualityParameter.ActualValue = new DoubleValue(quality); 51 51 return base.Apply(); 52 52 } 53 53 54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows ) {54 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, IClassificationProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) { 55 55 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 56 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);56 IEnumerable<double> targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 57 57 OnlineCalculatorError errorState; 58 double r2 = OnlinePearsonsRSquaredCalculator.Calculate(estimatedValues, originalValues, out errorState); 59 if (errorState != OnlineCalculatorError.None) return 0.0; 60 else return r2; 58 59 double r2; 60 if (applyLinearScaling) { 61 var r2Calculator = new OnlinePearsonsRSquaredCalculator(); 62 CalculateWithScaling(targetValues, estimatedValues, lowerEstimationLimit, upperEstimationLimit, r2Calculator, problemData.Dataset.Rows); 63 errorState = r2Calculator.ErrorState; 64 r2 = r2Calculator.RSquared; 65 } else { 66 IEnumerable<double> boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit); 67 r2 = OnlinePearsonsRSquaredCalculator.Calculate(targetValues, boundedEstimatedValues, out errorState); 68 } 69 if (errorState != OnlineCalculatorError.None) return double.NaN; 70 return r2; 61 71 } 62 72 … … 64 74 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 65 75 EstimationLimitsParameter.ExecutionContext = context; 76 ApplyLinearScalingParameter.ExecutionContext = context; 66 77 67 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows );78 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, ApplyLinearScalingParameter.ActualValue.Value); 68 79 69 80 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 70 81 EstimationLimitsParameter.ExecutionContext = null; 82 ApplyLinearScalingParameter.ExecutionContext = null; 71 83 72 84 return r2; -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs
r8175 r8915 35 35 private const string EstimationLimitsParameterName = "EstimationLimits"; 36 36 private const string EstimationLimitsParameterDescription = "The lower and upper limit for the estimated value that can be returned by the symbolic classification model."; 37 private const string ModelCreatorParameterName = "ModelCreator"; 37 38 38 39 #region parameter properties … … 40 41 get { return (IFixedValueParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 41 42 } 43 public IValueParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 44 get { return (IValueParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 45 } 42 46 #endregion 43 47 #region properties 44 48 public DoubleLimit EstimationLimits { 45 49 get { return EstimationLimitsParameter.Value; } 50 } 51 public ISymbolicClassificationModelCreator ModelCreator { 52 get { return ModelCreatorParameter.Value; } 46 53 } 47 54 #endregion … … 57 64 : base(new ClassificationProblemData(), new SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator(), new SymbolicDataAnalysisExpressionTreeCreator()) { 58 65 Parameters.Add(new FixedValueParameter<DoubleLimit>(EstimationLimitsParameterName, EstimationLimitsParameterDescription)); 66 Parameters.Add(new ValueParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "", new AccuracyMaximizingThresholdsModelCreator())); 59 67 68 ApplyLinearScalingParameter.Value.Value = false; 60 69 EstimationLimitsParameter.Hidden = true; 61 70 … … 71 80 [StorableHook(HookType.AfterDeserialization)] 72 81 private void AfterDeserialization() { 73 RegisterEventHandlers(); 74 // compatibility 82 // BackwardsCompatibility3.4 83 #region Backwards compatible code, remove with 3.5 84 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 85 Parameters.Add(new ValueParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "", new AccuracyMaximizingThresholdsModelCreator())); 86 75 87 bool changed = false; 76 88 if (!Operators.OfType<SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer>().Any()) { … … 83 95 } 84 96 if (changed) ParameterizeOperators(); 97 #endregion 98 RegisterEventHandlers(); 85 99 } 86 100 87 101 private void RegisterEventHandlers() { 88 102 SymbolicExpressionTreeGrammarParameter.ValueChanged += (o, e) => ConfigureGrammarSymbols(); 103 ModelCreatorParameter.NameChanged += (o, e) => ParameterizeOperators(); 89 104 } 90 105 … … 125 140 if (Parameters.ContainsKey(EstimationLimitsParameterName)) { 126 141 var operators = Parameters.OfType<IValueParameter>().Select(p => p.Value).OfType<IOperator>().Union(Operators); 127 foreach (var op in operators.OfType<ISymbolicDataAnalysisBoundedOperator>()) {142 foreach (var op in operators.OfType<ISymbolicDataAnalysisBoundedOperator>()) 128 143 op.EstimationLimitsParameter.ActualName = EstimationLimitsParameter.Name; 129 } 144 foreach (var op in operators.OfType<ISymbolicClassificationModelCreatorOperator>()) 145 op.ModelCreatorParameter.ActualName = ModelCreatorParameter.Name; 130 146 } 131 147 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer.cs
r7259 r8915 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 34 33 [StorableClass] 35 34 public sealed class SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveTrainingBestSolutionAnalyzer<ISymbolicClassificationSolution>, 36 ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator {35 ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator, ISymbolicClassificationModelCreatorOperator { 37 36 private const string ProblemDataParameterName = "ProblemData"; 37 private const string ModelCreatorParameterName = "ModelCreator"; 38 38 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 39 39 private const string EstimationLimitsParameterName = "UpperEstimationLimit"; 40 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";41 40 #region parameter properties 42 41 public ILookupParameter<IClassificationProblemData> ProblemDataParameter { 43 42 get { return (ILookupParameter<IClassificationProblemData>)Parameters[ProblemDataParameterName]; } 43 } 44 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 45 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 46 } 47 ILookupParameter<ISymbolicClassificationModelCreator> ISymbolicClassificationModelCreatorOperator.ModelCreatorParameter { 48 get { return ModelCreatorParameter; } 44 49 } 45 50 public ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicDataAnalysisTreeInterpreterParameter { … … 49 54 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 50 55 } 51 public IValueParameter<BoolValue> ApplyLinearScalingParameter {52 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }53 }54 56 #endregion 55 #region properties 56 public BoolValue ApplyLinearScaling { 57 get { return ApplyLinearScalingParameter.Value; } 58 } 59 #endregion 57 60 58 61 59 [StorableConstructor] … … 65 63 : base() { 66 64 Parameters.Add(new LookupParameter<IClassificationProblemData>(ProblemDataParameterName, "The problem data for the symbolic classification solution.")); 65 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 67 66 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic data analysis tree interpreter for the symbolic expression tree.")); 68 67 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic classification model.")); 69 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));70 68 } 69 71 70 public override IDeepCloneable Clone(Cloner cloner) { 72 71 return new SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer(this, cloner); 73 72 } 73 [StorableHook(HookType.AfterDeserialization)] 74 private void AfterDeserialization() { 75 // BackwardsCompatibility3.4 76 #region Backwards compatible code, remove with 3.5 77 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 78 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 79 #endregion 80 } 74 81 75 82 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 76 var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);77 if (ApplyLinearScaling .Value) {78 SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue); 79 }80 return new SymbolicDiscriminantFunctionClassificationSolution(model,(IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());83 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 84 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 85 86 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); 87 return model.CreateClassificationSolution((IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 81 88 } 82 89 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs
r8169 r8915 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 33 32 [Item("SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer", "An operator that collects the training Pareto-best symbolic classification solutions for single objective symbolic classification problems.")] 34 33 [StorableClass] 35 public sealed class SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveTrainingParetoBestSolutionAnalyzer<IClassificationProblemData, ISymbolicClassificationSolution> {36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";34 public sealed class SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveTrainingParetoBestSolutionAnalyzer<IClassificationProblemData, ISymbolicClassificationSolution>, ISymbolicClassificationModelCreatorOperator { 35 private const string ModelCreatorParameterName = "ModelCreator"; 37 36 #region parameter properties 38 public IValue Parameter<BoolValue> ApplyLinearScalingParameter {39 get { return (IValue Parameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }37 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 38 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 40 39 } 41 #endregion 42 43 #region properties 44 public BoolValue ApplyLinearScaling { 45 get { return ApplyLinearScalingParameter.Value; } 40 ILookupParameter<ISymbolicClassificationModelCreator> ISymbolicClassificationModelCreatorOperator.ModelCreatorParameter { 41 get { return ModelCreatorParameter; } 46 42 } 47 43 #endregion … … 52 48 public SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer() 53 49 : base() { 54 Parameters.Add(new Value Parameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));50 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 55 51 } 56 52 public override IDeepCloneable Clone(Cloner cloner) { … … 58 54 } 59 55 56 [StorableHook(HookType.AfterDeserialization)] 57 private void AfterDeserialization() { 58 // BackwardsCompatibility3.4 59 #region Backwards compatible code, remove with 3.5 60 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 61 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 62 #endregion 63 } 64 60 65 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree) { 61 var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 62 if (ApplyLinearScaling.Value) 63 SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue); 64 return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 66 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 67 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 68 69 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); 70 return model.CreateClassificationSolution((IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 65 71 } 66 72 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer.cs
r7259 r8915 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 34 33 [StorableClass] 35 34 public sealed class SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveValidationBestSolutionAnalyzer<ISymbolicClassificationSolution, ISymbolicClassificationSingleObjectiveEvaluator, IClassificationProblemData>, 36 ISymbolicDataAnalysisBoundedOperator {35 ISymbolicDataAnalysisBoundedOperator, ISymbolicClassificationModelCreatorOperator { 37 36 private const string EstimationLimitsParameterName = "EstimationLimits"; 38 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";37 private const string ModelCreatorParameterName = "ModelCreator"; 39 38 40 39 #region parameter properties … … 42 41 get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 43 42 } 44 public IValueParameter<BoolValue> ApplyLinearScalingParameter { 45 get { return (IValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 43 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 44 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 45 } 46 ILookupParameter<ISymbolicClassificationModelCreator> ISymbolicClassificationModelCreatorOperator.ModelCreatorParameter { 47 get { return ModelCreatorParameter; } 46 48 } 47 49 #endregion 48 50 49 #region properties50 public BoolValue ApplyLinearScaling {51 get { return ApplyLinearScalingParameter.Value; }52 }53 #endregion54 51 [StorableConstructor] 55 52 private SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer(bool deserializing) : base(deserializing) { } … … 58 55 : base() { 59 56 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic classification model.")); 60 Parameters.Add(new Value Parameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));57 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 61 58 } 62 59 public override IDeepCloneable Clone(Cloner cloner) { … … 64 61 } 65 62 63 [StorableHook(HookType.AfterDeserialization)] 64 private void AfterDeserialization() { 65 // BackwardsCompatibility3.4 66 #region Backwards compatible code, remove with 3.5 67 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 68 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 69 #endregion 70 } 71 66 72 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 67 var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);68 if (ApplyLinearScaling .Value) {69 SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue); 70 }71 return new SymbolicDiscriminantFunctionClassificationSolution(model,(IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());73 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 74 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 75 76 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); 77 return model.CreateClassificationSolution((IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 72 78 } 73 79 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer.cs
r8169 r8915 22 22 using HeuristicLab.Common; 23 23 using HeuristicLab.Core; 24 using HeuristicLab.Data;25 24 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 26 25 using HeuristicLab.Parameters; … … 33 32 [Item("SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer", "An operator that collects the validation Pareto-best symbolic classification solutions for single objective symbolic classification problems.")] 34 33 [StorableClass] 35 public sealed class SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveValidationParetoBestSolutionAnalyzer<ISymbolicClassificationSolution, ISymbolicClassificationSingleObjectiveEvaluator, IClassificationProblemData> {36 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";34 public sealed class SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveValidationParetoBestSolutionAnalyzer<ISymbolicClassificationSolution, ISymbolicClassificationSingleObjectiveEvaluator, IClassificationProblemData>, ISymbolicClassificationModelCreatorOperator { 35 private const string ModelCreatorParameterName = "ModelCreator"; 37 36 #region parameter properties 38 public IValue Parameter<BoolValue> ApplyLinearScalingParameter {39 get { return (IValue Parameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }37 public IValueLookupParameter<ISymbolicClassificationModelCreator> ModelCreatorParameter { 38 get { return (IValueLookupParameter<ISymbolicClassificationModelCreator>)Parameters[ModelCreatorParameterName]; } 40 39 } 41 #endregion 42 43 #region properties 44 public BoolValue ApplyLinearScaling { 45 get { return ApplyLinearScalingParameter.Value; } 40 ILookupParameter<ISymbolicClassificationModelCreator> ISymbolicClassificationModelCreatorOperator.ModelCreatorParameter { 41 get { return ModelCreatorParameter; } 46 42 } 47 43 #endregion … … 52 48 public SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer() 53 49 : base() { 54 Parameters.Add(new Value Parameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic classification solution should be linearly scaled.", new BoolValue(false)));50 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 55 51 } 56 52 public override IDeepCloneable Clone(Cloner cloner) { … … 58 54 } 59 55 56 [StorableHook(HookType.AfterDeserialization)] 57 private void AfterDeserialization() { 58 // BackwardsCompatibility3.4 59 #region Backwards compatible code, remove with 3.5 60 if (!Parameters.ContainsKey(ModelCreatorParameterName)) 61 Parameters.Add(new ValueLookupParameter<ISymbolicClassificationModelCreator>(ModelCreatorParameterName, "")); 62 #endregion 63 } 64 60 65 protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree) { 61 var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 62 if (ApplyLinearScaling.Value) 63 SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue); 64 return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 66 var model = ModelCreatorParameter.ActualValue.CreateSymbolicClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper); 67 if (ApplyLinearScalingParameter.ActualValue.Value) SymbolicClassificationModel.Scale(model, ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariable); 68 69 model.RecalculateModelParameters(ProblemDataParameter.ActualValue, ProblemDataParameter.ActualValue.TrainingIndices); 70 return model.CreateClassificationSolution((IClassificationProblemData)ProblemDataParameter.ActualValue.Clone()); 65 71 } 66 72 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs
r7259 r8915 32 32 [StorableClass] 33 33 [Item(Name = "SymbolicClassificationModel", Description = "Represents a symbolic classification model.")] 34 public class SymbolicClassificationModel : SymbolicDataAnalysisModel, ISymbolicClassificationModel { 34 public abstract class 35 SymbolicClassificationModel : SymbolicDataAnalysisModel, ISymbolicClassificationModel { 36 [Storable] 37 private double lowerEstimationLimit; 38 public double LowerEstimationLimit { get { return lowerEstimationLimit; } } 39 [Storable] 40 private double upperEstimationLimit; 41 public double UpperEstimationLimit { get { return upperEstimationLimit; } } 42 35 43 [StorableConstructor] 36 44 protected SymbolicClassificationModel(bool deserializing) : base(deserializing) { } 37 45 protected SymbolicClassificationModel(SymbolicClassificationModel original, Cloner cloner) 38 46 : base(original, cloner) { 47 lowerEstimationLimit = original.lowerEstimationLimit; 48 upperEstimationLimit = original.upperEstimationLimit; 39 49 } 40 p ublic SymbolicClassificationModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter)50 protected SymbolicClassificationModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, double lowerEstimationLimit = double.MinValue, double upperEstimationLimit = double.MaxValue) 41 51 : base(tree, interpreter) { 52 this.lowerEstimationLimit = lowerEstimationLimit; 53 this.upperEstimationLimit = upperEstimationLimit; 42 54 } 43 55 44 public override IDeepCloneable Clone(Cloner cloner) { 45 return new SymbolicClassificationModel(this, cloner); 46 } 56 public abstract IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows); 57 public abstract void RecalculateModelParameters(IClassificationProblemData problemData, IEnumerable<int> rows); 47 58 48 public IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows) { 49 return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, rows); 50 } 59 public abstract ISymbolicClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData); 51 60 52 public ISymbolicClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {53 return new SymbolicClassificationSolution(this, problemData);54 }55 61 IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) { 56 62 return CreateClassificationSolution(problemData); 57 63 } 58 59 60 64 } 61 65 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationSolution.cs
r7259 r8915 71 71 72 72 protected override void RecalculateResults() { 73 base.RecalculateResults(); 73 74 ModelLength = Model.SymbolicExpressionTree.Length; 74 75 ModelDepth = Model.SymbolicExpressionTree.Depth; 75 CalculateResults();76 76 } 77 77 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationModel.cs
r8139 r8915 34 34 [StorableClass] 35 35 [Item(Name = "SymbolicDiscriminantFunctionClassificationModel", Description = "Represents a symbolic classification model unsing a discriminant function.")] 36 public class SymbolicDiscriminantFunctionClassificationModel : Symbolic DataAnalysisModel, ISymbolicDiscriminantFunctionClassificationModel {36 public class SymbolicDiscriminantFunctionClassificationModel : SymbolicClassificationModel, ISymbolicDiscriminantFunctionClassificationModel { 37 37 38 38 [Storable] … … 48 48 private set { classValues = value.ToArray(); } 49 49 } 50 51 private IDiscriminantFunctionThresholdCalculator thresholdCalculator; 50 52 [Storable] 51 p rivate double lowerEstimationLimit;52 public double LowerEstimationLimit { get { return lowerEstimationLimit; }}53 [Storable]54 private double upperEstimationLimit;55 public double UpperEstimationLimit { get { return upperEstimationLimit; } } 53 public IDiscriminantFunctionThresholdCalculator ThresholdCalculator { 54 get { return thresholdCalculator; } 55 private set { thresholdCalculator = value; } 56 } 57 56 58 57 59 [StorableConstructor] … … 61 63 classValues = (double[])original.classValues.Clone(); 62 64 thresholds = (double[])original.thresholds.Clone(); 63 lowerEstimationLimit = original.lowerEstimationLimit; 64 upperEstimationLimit = original.upperEstimationLimit; 65 thresholdCalculator = cloner.Clone(original.thresholdCalculator); 65 66 } 66 public SymbolicDiscriminantFunctionClassificationModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 67 public SymbolicDiscriminantFunctionClassificationModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDiscriminantFunctionThresholdCalculator thresholdCalculator, 67 68 double lowerEstimationLimit = double.MinValue, double upperEstimationLimit = double.MaxValue) 68 : base(tree, interpreter) { 69 thresholds = new double[] { double.NegativeInfinity }; 70 classValues = new double[] { 0.0 }; 71 this.lowerEstimationLimit = lowerEstimationLimit; 72 this.upperEstimationLimit = upperEstimationLimit; 69 : base(tree, interpreter, lowerEstimationLimit, upperEstimationLimit) { 70 this.thresholds = new double[0]; 71 this.classValues = new double[0]; 72 this.ThresholdCalculator = thresholdCalculator; 73 } 74 75 [StorableHook(HookType.AfterDeserialization)] 76 private void AfterDeserialization() { 77 // BackwardsCompatibility3.4 78 #region Backwards compatible code, remove with 3.5 79 if (ThresholdCalculator == null) ThresholdCalculator = new AccuracyMaximizationThresholdCalculator(); 80 #endregion 73 81 } 74 82 … … 87 95 } 88 96 89 public IEnumerable<double> GetEstimatedValues(Dataset dataset, IEnumerable<int> rows) { 90 return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, rows) 91 .LimitToRange(lowerEstimationLimit, upperEstimationLimit); 97 public override void RecalculateModelParameters(IClassificationProblemData problemData, IEnumerable<int> rows) { 98 double[] classValues; 99 double[] thresholds; 100 var targetClassValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 101 var estimatedTrainingValues = GetEstimatedValues(problemData.Dataset, rows); 102 thresholdCalculator.Calculate(problemData, estimatedTrainingValues, targetClassValues, out classValues, out thresholds); 103 SetThresholdsAndClassValues(thresholds, classValues); 92 104 } 93 105 94 public IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows) { 106 public IEnumerable<double> GetEstimatedValues(Dataset dataset, IEnumerable<int> rows) { 107 return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, rows).LimitToRange(LowerEstimationLimit, UpperEstimationLimit); 108 } 109 110 public override IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows) { 111 if (!Thresholds.Any() && !ClassValues.Any()) throw new ArgumentException("No thresholds and class values were set for the current symbolic classification model."); 95 112 foreach (var x in GetEstimatedValues(dataset, rows)) { 96 113 int classIndex = 0; … … 104 121 } 105 122 106 public SymbolicDiscriminantFunctionClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) { 107 return new SymbolicDiscriminantFunctionClassificationSolution(this, problemData); 123 124 public override ISymbolicClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) { 125 return CreateDiscriminantClassificationSolution(problemData); 126 } 127 public SymbolicDiscriminantFunctionClassificationSolution CreateDiscriminantClassificationSolution(IClassificationProblemData problemData) { 128 return new SymbolicDiscriminantFunctionClassificationSolution(this, new ClassificationProblemData(problemData)); 108 129 } 109 130 IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) { 110 return Create ClassificationSolution(problemData);131 return CreateDiscriminantClassificationSolution(problemData); 111 132 } 112 133 IDiscriminantFunctionClassificationSolution IDiscriminantFunctionClassificationModel.CreateDiscriminantFunctionClassificationSolution(IClassificationProblemData problemData) { 113 return Create ClassificationSolution(problemData);134 return CreateDiscriminantClassificationSolution(problemData); 114 135 } 115 136 … … 121 142 } 122 143 #endregion 123 124 public static void Scale(SymbolicDiscriminantFunctionClassificationModel model, IClassificationProblemData problemData) {125 var dataset = problemData.Dataset;126 var targetVariable = problemData.TargetVariable;127 var rows = problemData.TrainingIndices;128 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, rows);129 var targetValues = dataset.GetDoubleValues(targetVariable, rows);130 double alpha;131 double beta;132 OnlineCalculatorError errorState;133 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out alpha, out beta, out errorState);134 if (errorState != OnlineCalculatorError.None) return;135 136 ConstantTreeNode alphaTreeNode = null;137 ConstantTreeNode betaTreeNode = null;138 // check if model has been scaled previously by analyzing the structure of the tree139 var startNode = model.SymbolicExpressionTree.Root.GetSubtree(0);140 if (startNode.GetSubtree(0).Symbol is Addition) {141 var addNode = startNode.GetSubtree(0);142 if (addNode.SubtreeCount == 2 && addNode.GetSubtree(0).Symbol is Multiplication && addNode.GetSubtree(1).Symbol is Constant) {143 alphaTreeNode = addNode.GetSubtree(1) as ConstantTreeNode;144 var mulNode = addNode.GetSubtree(0);145 if (mulNode.SubtreeCount == 2 && mulNode.GetSubtree(1).Symbol is Constant) {146 betaTreeNode = mulNode.GetSubtree(1) as ConstantTreeNode;147 }148 }149 }150 // if tree structure matches the structure necessary for linear scaling then reuse the existing tree nodes151 if (alphaTreeNode != null && betaTreeNode != null) {152 betaTreeNode.Value *= beta;153 alphaTreeNode.Value *= beta;154 alphaTreeNode.Value += alpha;155 } else {156 var mainBranch = startNode.GetSubtree(0);157 startNode.RemoveSubtree(0);158 var scaledMainBranch = MakeSum(MakeProduct(mainBranch, beta), alpha);159 startNode.AddSubtree(scaledMainBranch);160 }161 }162 163 private static ISymbolicExpressionTreeNode MakeSum(ISymbolicExpressionTreeNode treeNode, double alpha) {164 if (alpha.IsAlmost(0.0)) {165 return treeNode;166 } else {167 var addition = new Addition();168 var node = addition.CreateTreeNode();169 var alphaConst = MakeConstant(alpha);170 node.AddSubtree(treeNode);171 node.AddSubtree(alphaConst);172 return node;173 }174 }175 176 private static ISymbolicExpressionTreeNode MakeProduct(ISymbolicExpressionTreeNode treeNode, double beta) {177 if (beta.IsAlmost(1.0)) {178 return treeNode;179 } else {180 var multipliciation = new Multiplication();181 var node = multipliciation.CreateTreeNode();182 var betaConst = MakeConstant(beta);183 node.AddSubtree(treeNode);184 node.AddSubtree(betaConst);185 return node;186 }187 }188 189 private static ISymbolicExpressionTreeNode MakeConstant(double c) {190 var node = (ConstantTreeNode)(new Constant()).CreateTreeNode();191 node.Value = c;192 return node;193 }194 144 } 195 145 } -
branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationSolution.cs
r7259 r8915 20 20 #endregion 21 21 22 using System.Linq; 22 23 using HeuristicLab.Common; 23 24 using HeuristicLab.Core; … … 35 36 private const string ModelLengthResultName = "Model Length"; 36 37 private const string ModelDepthResultName = "Model Depth"; 38 39 private const string EstimationLimitsResultsResultName = "Estimation Limits Results"; 40 private const string EstimationLimitsResultName = "Estimation Limits"; 41 private const string TrainingUpperEstimationLimitHitsResultName = "Training Upper Estimation Limit Hits"; 42 private const string TestLowerEstimationLimitHitsResultName = "Test Lower Estimation Limit Hits"; 43 private const string TrainingLowerEstimationLimitHitsResultName = "Training Lower Estimation Limit Hits"; 44 private const string TestUpperEstimationLimitHitsResultName = "Test Upper Estimation Limit Hits"; 45 private const string TrainingNaNEvaluationsResultName = "Training NaN Evaluations"; 46 private const string TestNaNEvaluationsResultName = "Test NaN Evaluations"; 37 47 38 48 public new ISymbolicDiscriminantFunctionClassificationModel Model { … … 57 67 private set { ((IntValue)this[ModelDepthResultName].Value).Value = value; } 58 68 } 69 70 private ResultCollection EstimationLimitsResultCollection { 71 get { return (ResultCollection)this[EstimationLimitsResultsResultName].Value; } 72 } 73 public DoubleLimit EstimationLimits { 74 get { return (DoubleLimit)EstimationLimitsResultCollection[EstimationLimitsResultName].Value; } 75 } 76 77 public int TrainingUpperEstimationLimitHits { 78 get { return ((IntValue)EstimationLimitsResultCollection[TrainingUpperEstimationLimitHitsResultName].Value).Value; } 79 private set { ((IntValue)EstimationLimitsResultCollection[TrainingUpperEstimationLimitHitsResultName].Value).Value = value; } 80 } 81 public int TestUpperEstimationLimitHits { 82 get { return ((IntValue)EstimationLimitsResultCollection[TestUpperEstimationLimitHitsResultName].Value).Value; } 83 private set { ((IntValue)EstimationLimitsResultCollection[TestUpperEstimationLimitHitsResultName].Value).Value = value; } 84 } 85 public int TrainingLowerEstimationLimitHits { 86 get { return ((IntValue)EstimationLimitsResultCollection[TrainingLowerEstimationLimitHitsResultName].Value).Value; } 87 private set { ((IntValue)EstimationLimitsResultCollection[TrainingLowerEstimationLimitHitsResultName].Value).Value = value; } 88 } 89 public int TestLowerEstimationLimitHits { 90 get { return ((IntValue)EstimationLimitsResultCollection[TestLowerEstimationLimitHitsResultName].Value).Value; } 91 private set { ((IntValue)EstimationLimitsResultCollection[TestLowerEstimationLimitHitsResultName].Value).Value = value; } 92 } 93 public int TrainingNaNEvaluations { 94 get { return ((IntValue)EstimationLimitsResultCollection[TrainingNaNEvaluationsResultName].Value).Value; } 95 private set { ((IntValue)EstimationLimitsResultCollection[TrainingNaNEvaluationsResultName].Value).Value = value; } 96 } 97 public int TestNaNEvaluations { 98 get { return ((IntValue)EstimationLimitsResultCollection[TestNaNEvaluationsResultName].Value).Value; } 99 private set { ((IntValue)EstimationLimitsResultCollection[TestNaNEvaluationsResultName].Value).Value = value; } 100 } 101 59 102 [StorableConstructor] 60 103 private SymbolicDiscriminantFunctionClassificationSolution(bool deserializing) : base(deserializing) { } … … 66 109 Add(new Result(ModelLengthResultName, "Length of the symbolic classification model.", new IntValue())); 67 110 Add(new Result(ModelDepthResultName, "Depth of the symbolic classification model.", new IntValue())); 68 RecalculateResults(); 111 112 113 ResultCollection estimationLimitResults = new ResultCollection(); 114 estimationLimitResults.Add(new Result(EstimationLimitsResultName, "", new DoubleLimit())); 115 estimationLimitResults.Add(new Result(TrainingUpperEstimationLimitHitsResultName, "", new IntValue())); 116 estimationLimitResults.Add(new Result(TestUpperEstimationLimitHitsResultName, "", new IntValue())); 117 estimationLimitResults.Add(new Result(TrainingLowerEstimationLimitHitsResultName, "", new IntValue())); 118 estimationLimitResults.Add(new Result(TestLowerEstimationLimitHitsResultName, "", new IntValue())); 119 estimationLimitResults.Add(new Result(TrainingNaNEvaluationsResultName, "", new IntValue())); 120 estimationLimitResults.Add(new Result(TestNaNEvaluationsResultName, "", new IntValue())); 121 Add(new Result(EstimationLimitsResultsResultName, "Results concerning the estimation limits of symbolic regression solution", estimationLimitResults)); 122 123 CalculateResults(); 69 124 } 70 125 … … 73 128 } 74 129 75 protected override void RecalculateResults() { 76 CalculateResults(); 77 CalculateRegressionResults(); 130 [StorableHook(HookType.AfterDeserialization)] 131 private void AfterDeserialization() { 132 if (!ContainsKey(EstimationLimitsResultsResultName)) { 133 ResultCollection estimationLimitResults = new ResultCollection(); 134 estimationLimitResults.Add(new Result(EstimationLimitsResultName, "", new DoubleLimit())); 135 estimationLimitResults.Add(new Result(TrainingUpperEstimationLimitHitsResultName, "", new IntValue())); 136 estimationLimitResults.Add(new Result(TestUpperEstimationLimitHitsResultName, "", new IntValue())); 137 estimationLimitResults.Add(new Result(TrainingLowerEstimationLimitHitsResultName, "", new IntValue())); 138 estimationLimitResults.Add(new Result(TestLowerEstimationLimitHitsResultName, "", new IntValue())); 139 estimationLimitResults.Add(new Result(TrainingNaNEvaluationsResultName, "", new IntValue())); 140 estimationLimitResults.Add(new Result(TestNaNEvaluationsResultName, "", new IntValue())); 141 Add(new Result(EstimationLimitsResultsResultName, "Results concerning the estimation limits of symbolic regression solution", estimationLimitResults)); 142 CalculateResults(); 143 } 144 } 145 146 147 private void CalculateResults() { 78 148 ModelLength = Model.SymbolicExpressionTree.Length; 79 149 ModelDepth = Model.SymbolicExpressionTree.Depth; 150 151 EstimationLimits.Lower = Model.LowerEstimationLimit; 152 EstimationLimits.Upper = Model.UpperEstimationLimit; 153 154 TrainingUpperEstimationLimitHits = EstimatedTrainingValues.Count(x => x.IsAlmost(Model.UpperEstimationLimit)); 155 TestUpperEstimationLimitHits = EstimatedTestValues.Count(x => x.IsAlmost(Model.UpperEstimationLimit)); 156 TrainingLowerEstimationLimitHits = EstimatedTrainingValues.Count(x => x.IsAlmost(Model.LowerEstimationLimit)); 157 TestLowerEstimationLimitHits = EstimatedTestValues.Count(x => x.IsAlmost(Model.LowerEstimationLimit)); 158 TrainingNaNEvaluations = Model.Interpreter.GetSymbolicExpressionTreeValues(Model.SymbolicExpressionTree, ProblemData.Dataset, ProblemData.TrainingIndices).Count(double.IsNaN); 159 TestNaNEvaluations = Model.Interpreter.GetSymbolicExpressionTreeValues(Model.SymbolicExpressionTree, ProblemData.Dataset, ProblemData.TestIndices).Count(double.IsNaN); 160 } 161 162 protected override void RecalculateResults() { 163 base.RecalculateResults(); 164 CalculateResults(); 80 165 } 81 166 }
Note: See TracChangeset
for help on using the changeset viewer.