Changeset 15885 for branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation
- Timestamp:
- 04/06/18 11:35:10 (7 years ago)
- Location:
- branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
r15846 r15885 314 314 315 315 public ClassificationProblemData(IClassificationProblemData classificationProblemData) 316 : this(classificationProblemData.Dataset, classificationProblemData.AllowedInputVariables, classificationProblemData.TargetVariable ) {316 : this(classificationProblemData.Dataset, classificationProblemData.AllowedInputVariables, classificationProblemData.TargetVariable, classificationProblemData.Transformations) { 317 317 TrainingPartition.Start = classificationProblemData.TrainingPartition.Start; 318 318 TrainingPartition.End = classificationProblemData.TrainingPartition.End; -
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationTransformationModel.cs
r15884 r15885 38 38 public ClassificationTransformationModel(IClassificationModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations) 39 39 : base(originalModel, transformations) { 40 if ( DataAnalysisTransformation.GetTransitiveVariables(new[] { originalModel.TargetVariable }, transformations).Any())40 if (transformations.Any(t => t.TransformedVariable == originalModel.TargetVariable)) 41 41 throw new NotSupportedException("Classification with a transformed target variable is not allowed"); 42 42 } -
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblemData.cs
r15846 r15885 87 87 } 88 88 89 public ClusteringProblemData( Dataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<IDataAnalysisTransformation> transformations = null)89 public ClusteringProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<IDataAnalysisTransformation> transformations = null) 90 90 : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<IDataAnalysisTransformation>()) { 91 91 } -
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs
r15884 r15885 66 66 Parameters.Add(new FixedValueParameter<StringValue>("Original Variable", new StringValue(originalVariable).AsReadOnly())); 67 67 Parameters.Add(new FixedValueParameter<StringValue>("Transformed Variable", new StringValue(transformedVariable).AsReadOnly())); 68 Parameters.Add(new ValueParameter<ITransformation>("Transformation", transformation)); // TODO: should be readonly/fixed 68 Parameters.Add(new ValueParameter<ITransformation>("Transformation", transformation)); // TODO: should be readonly/fixed; alternatively lock in view 69 69 } 70 70 … … 92 92 // originals => include extended 93 93 public static IEnumerable<string> ExtendVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations) { 94 return GetTransitiveVariables(variables, transformations );94 return GetTransitiveVariables(variables, transformations, inverse: false); 95 95 } 96 96 … … 98 98 public static IEnumerable<string> ReduceVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations) { 99 99 var originalVariables = new HashSet<string>(); 100 foreach (var variable in variables) 101 originalVariables.Add(GetLastTransitiveVariable(variable, transformations, inverse: true)); 100 foreach (var variable in variables) { 101 var originalVariable = GetStrictTransitiveVariables(variable, transformations, inverse: true).Last(); 102 originalVariables.Add(originalVariable); 103 } 104 102 105 return originalVariables; 103 106 } 104 107 108 // return all reachable variables 105 109 public static IEnumerable<string> GetTransitiveVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations, bool inverse = false) { 106 110 var reachableVariables = new HashSet<string>(variables); … … 116 120 } 117 121 118 public static string GetLastTransitiveVariable(string variable, IEnumerable<IDataAnalysisTransformation> transformations, bool inverse = false) { 122 // return the (unique) chain of transformations for a given variable 123 public static IEnumerable<string> GetStrictTransitiveVariables(string variable, IEnumerable<IDataAnalysisTransformation> transformations, bool inverse = false) { 124 yield return variable; 119 125 if (inverse) transformations = transformations.Reverse(); 120 126 foreach (var transformation in transformations) { 121 127 var source = inverse ? transformation.TransformedVariable : transformation.OriginalVariable; 122 128 var target = inverse ? transformation.OriginalVariable : transformation.TransformedVariable; 123 if (variable == source) 129 if (variable == source) { 124 130 variable = target; 125 }126 127 return variable;131 yield return variable; 132 } 133 } 128 134 } 129 135 #endregion … … 137 143 138 144 var originalData = modifiableDataset.GetDoubleValues(transformation.OriginalVariable); 139 //if (!trans.Check(originalData, out string errorMessage))140 // throw new InvalidOperationException($"Cannot estimate Values, Transformation is invalid: {errorMessage}");141 // TODO: check was already called before configure (in preprocessing)142 // TODO: newly specified data might not pass the check but it does not matter because the data is not configured with143 // e.g. impact calculation -> replacement=most common -> originalMean is zero144 145 145 var transformedData = trans.Apply(originalData).ToList(); 146 146 if (modifiableDataset.VariableNames.Contains(transformation.TransformedVariable)) … … 150 150 } 151 151 152 return modifiableDataset; // TODO: to regular dataset?152 return new Dataset(modifiableDataset); 153 153 } 154 154 … … 178 178 } 179 179 180 return modifiableDataset; // TODO: to regular dataset?180 return new Dataset(modifiableDataset); 181 181 } 182 182 #endregion … … 200 200 IDataAnalysisProblemData newProblemData; 201 201 if (problemData is IRegressionProblemData regressionProblemData) { 202 var newTargetVariable = GetLastTransitiveVariable(regressionProblemData.TargetVariable, problemData.Transformations, inverse); 203 newProblemData = new RegressionProblemData(dataset, inputs, newTargetVariable, problemData.Transformations); 202 var newTargetVariable = GetStrictTransitiveVariables(regressionProblemData.TargetVariable, problemData.Transformations, inverse).Last(); 203 if (problemData is ITimeSeriesPrognosisProblemData timeSeriesPrognosisProblemData) { 204 newProblemData = new TimeSeriesPrognosisProblemData(dataset, inputs, newTargetVariable, problemData.Transformations) { 205 TrainingHorizon = timeSeriesPrognosisProblemData.TrainingHorizon, 206 TestHorizon = timeSeriesPrognosisProblemData.TestHorizon, 207 }; 208 209 } else 210 newProblemData = new RegressionProblemData(dataset, inputs, newTargetVariable, problemData.Transformations); 204 211 } else if (problemData is IClassificationProblemData classificationProblemData) { 205 212 newProblemData = new ClassificationProblemData(dataset, inputs, classificationProblemData.TargetVariable, problemData.Transformations); 213 } else if (problemData is IClusteringProblemData) { 214 newProblemData = new ClusteringProblemData(dataset, inputs, problemData.Transformations); 206 215 } else throw new NotSupportedException("Type of ProblemData not supported"); 207 216 … … 216 225 217 226 #region Transform Model 218 public static IDataAnalysisTransformationModel CreateTransformationIntegratedModel(IDataAnalysisModel model, IEnumerable<IDataAnalysisTransformation> transformations) { 227 // problemdata required for type-switch. cannot differ based on model type (e.g. RF model is both regression and classification) 228 public static IDataAnalysisTransformationModel CreateTransformationIntegratedModel(IDataAnalysisModel model, IEnumerable<IDataAnalysisTransformation> transformations, IDataAnalysisProblemData problemData) { 219 229 if (model is IDataAnalysisTransformationModel) 220 230 throw new InvalidOperationException("Model already is a transformation model."); 221 231 222 switch (model) { 223 case ITimeSeriesPrognosisModel timeSeriesPrognosisModel: 224 return new TimeSeriesPrognosisTransformationModel(timeSeriesPrognosisModel, transformations); 225 case IRegressionModel regressionModel: 226 return new RegressionTransformationModel(regressionModel, transformations); 227 case IClassificationModel classificationModel: 228 return new ClassificationTransformationModel(classificationModel, transformations); 229 case IClusteringModel clusteringModel: 230 return new ClusteringTransformationModel(clusteringModel, transformations); 231 default: 232 throw new NotSupportedException("Type of the model is not supported;"); 233 } 232 if (problemData is ITimeSeriesPrognosisProblemData) 233 return new TimeSeriesPrognosisTransformationModel((ITimeSeriesPrognosisModel)model, transformations); 234 if (problemData is IRegressionProblemData) 235 return new RegressionTransformationModel((IRegressionModel)model, transformations); 236 if (problemData is IClassificationProblemData) 237 return new ClassificationTransformationModel((IClassificationModel)model, transformations); 238 if (problemData is IClusteringProblemData) 239 return new ClusteringTransformationModel((IClusteringModel)model, transformations); 240 241 throw new NotSupportedException("Type of the model is not supported;"); 234 242 } 235 243 … … 247 255 var model = solution.Model is IDataAnalysisTransformationModel // TODO: what if model is a integrated sym-reg model? 248 256 ? RestoreTrainedModel(solution.Model, transformations) 249 : CreateTransformationIntegratedModel(solution.Model, transformations );257 : CreateTransformationIntegratedModel(solution.Model, transformations, solution.ProblemData); 250 258 251 259 var data = solution.Model is IDataAnalysisTransformationModel … … 257 265 258 266 private static IDataAnalysisSolution CreateSolution(IDataAnalysisModel model, IDataAnalysisProblemData problemData) { 259 switch (model) {260 case ITimeSeriesPrognosisModel timeSeriesPrognosisModel:261 return timeSeriesPrognosisModel.CreateTimeSeriesPrognosisSolution((ITimeSeriesPrognosisProblemData)problemData);262 case IRegressionModel regressionModel:263 return regressionModel.CreateRegressionSolution((IRegressionProblemData)problemData);264 case IClassificationModel classificationModel:265 return classificationModel.CreateClassificationSolution((IClassificationProblemData)problemData);266 default:267 throw new NotSupportedException("Cannot create Solution of the model type."); 268 }267 if (problemData is ITimeSeriesPrognosisProblemData) 268 return ((ITimeSeriesPrognosisModel)model).CreateTimeSeriesPrognosisSolution((ITimeSeriesPrognosisProblemData)problemData); 269 if (problemData is IRegressionProblemData) 270 return ((IRegressionModel)model).CreateRegressionSolution((IRegressionProblemData)problemData); 271 if (problemData is IClassificationProblemData) 272 return ((IClassificationModel)model).CreateClassificationSolution((IClassificationProblemData)problemData); 273 //if (problemData is IClusteringProblemData) 274 // return ((IClusteringModel)model).CreateClusteringSolution((IClusteringProblemData)problemData); 275 276 throw new NotSupportedException("Cannot create Solution of the model type."); 269 277 } 270 278 #endregion -
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionTransformationModel.cs
r15884 r15885 42 42 public RegressionTransformationModel(IRegressionModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations) 43 43 : base(originalModel, transformations) { 44 var transitiveTargets = DataAnalysisTransformation.GetTransitiveVariables(new[] { originalModel.TargetVariable }, transformations, inverse: true).ToList(); 45 TargetTransformations = new ItemList<IDataAnalysisTransformation>(transformations.Where(t => transitiveTargets.Contains(t.OriginalVariable))).AsReadOnly(); 46 TargetVariable = DataAnalysisTransformation.GetLastTransitiveVariable(originalModel.TargetVariable, TargetTransformations, inverse: true); 44 var learnedTarget = DataAnalysisTransformation.GetStrictTransitiveVariables(originalModel.TargetVariable, transformations, true).Last(); 45 var transitiveTargets = DataAnalysisTransformation.GetStrictTransitiveVariables(learnedTarget, transformations, inverse: false).ToList(); 46 TargetTransformations = new ItemList<IDataAnalysisTransformation>(transformations.Where(t => transitiveTargets.Contains(t.TransformedVariable))).AsReadOnly(); 47 48 TargetVariable = DataAnalysisTransformation.GetStrictTransitiveVariables(originalModel.TargetVariable, TargetTransformations, true).Last(); 47 49 } 48 50 -
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs
r15846 r15885 1596 1596 1597 1597 public TimeSeriesPrognosisProblemData(ITimeSeriesPrognosisProblemData timeseriesProblemData) 1598 : this(timeseriesProblemData.Dataset, timeseriesProblemData.AllowedInputVariables, timeseriesProblemData.TargetVariable ) {1598 : this(timeseriesProblemData.Dataset, timeseriesProblemData.AllowedInputVariables, timeseriesProblemData.TargetVariable, timeseriesProblemData.Transformations) { 1599 1599 1600 1600 TrainingPartition.Start = timeseriesProblemData.TrainingPartition.Start;
Note: See TracChangeset
for help on using the changeset viewer.