Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/06/18 11:35:10 (7 years ago)
Author:
pfleck
Message:

#2906 Updated project references + small refactoring

Location:
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs

    r15769 r15885  
    142142    }
    143143
    144     protected Dataset(Dataset dataset) : this(dataset.variableNames, dataset.variableValues.Values) { }
     144    public Dataset(Dataset dataset) : this(dataset.variableNames, dataset.variableValues.Values) { }
    145145
    146146    #region Backwards compatible code, remove with 3.5
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs

    r15846 r15885  
    314314
    315315    public ClassificationProblemData(IClassificationProblemData classificationProblemData)
    316       : this(classificationProblemData.Dataset, classificationProblemData.AllowedInputVariables, classificationProblemData.TargetVariable) {
     316      : this(classificationProblemData.Dataset, classificationProblemData.AllowedInputVariables, classificationProblemData.TargetVariable, classificationProblemData.Transformations) {
    317317      TrainingPartition.Start = classificationProblemData.TrainingPartition.Start;
    318318      TrainingPartition.End = classificationProblemData.TrainingPartition.End;
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationTransformationModel.cs

    r15884 r15885  
    3838    public ClassificationTransformationModel(IClassificationModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
    3939      : base(originalModel, transformations) {
    40       if (DataAnalysisTransformation.GetTransitiveVariables(new[] { originalModel.TargetVariable }, transformations).Any())
     40      if (transformations.Any(t => t.TransformedVariable == originalModel.TargetVariable))
    4141        throw new NotSupportedException("Classification with a transformed target variable is not allowed");
    4242    }
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblemData.cs

    r15846 r15885  
    8787    }
    8888
    89     public ClusteringProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<IDataAnalysisTransformation> transformations = null)
     89    public ClusteringProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, IEnumerable<IDataAnalysisTransformation> transformations = null)
    9090      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<IDataAnalysisTransformation>()) {
    9191    }
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs

    r15884 r15885  
    6666      Parameters.Add(new FixedValueParameter<StringValue>("Original Variable", new StringValue(originalVariable).AsReadOnly()));
    6767      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
    6969    }
    7070
     
    9292    // originals => include extended
    9393    public static IEnumerable<string> ExtendVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations) {
    94       return GetTransitiveVariables(variables, transformations);
     94      return GetTransitiveVariables(variables, transformations, inverse: false);
    9595    }
    9696
     
    9898    public static IEnumerable<string> ReduceVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations) {
    9999      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
    102105      return originalVariables;
    103106    }
    104107
     108    // return all reachable variables
    105109    public static IEnumerable<string> GetTransitiveVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations, bool inverse = false) {
    106110      var reachableVariables = new HashSet<string>(variables);
     
    116120    }
    117121
    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;
    119125      if (inverse) transformations = transformations.Reverse();
    120126      foreach (var transformation in transformations) {
    121127        var source = inverse ? transformation.TransformedVariable : transformation.OriginalVariable;
    122128        var target = inverse ? transformation.OriginalVariable : transformation.TransformedVariable;
    123         if (variable == source)
     129        if (variable == source) {
    124130          variable = target;
    125       }
    126 
    127       return variable;
     131          yield return variable;
     132        }
     133      }
    128134    }
    129135    #endregion
     
    137143
    138144        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 with
    143         // e.g. impact calculation -> replacement=most common -> originalMean is zero
    144 
    145145        var transformedData = trans.Apply(originalData).ToList();
    146146        if (modifiableDataset.VariableNames.Contains(transformation.TransformedVariable))
     
    150150      }
    151151
    152       return modifiableDataset; // TODO: to regular dataset?
     152      return new Dataset(modifiableDataset);
    153153    }
    154154
     
    178178      }
    179179
    180       return modifiableDataset; // TODO: to regular dataset?
     180      return new Dataset(modifiableDataset);
    181181    }
    182182    #endregion
     
    200200      IDataAnalysisProblemData newProblemData;
    201201      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);
    204211      } else if (problemData is IClassificationProblemData classificationProblemData) {
    205212        newProblemData = new ClassificationProblemData(dataset, inputs, classificationProblemData.TargetVariable, problemData.Transformations);
     213      } else if (problemData is IClusteringProblemData) {
     214        newProblemData = new ClusteringProblemData(dataset, inputs, problemData.Transformations);
    206215      } else throw new NotSupportedException("Type of ProblemData not supported");
    207216
     
    216225
    217226    #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) {
    219229      if (model is IDataAnalysisTransformationModel)
    220230        throw new InvalidOperationException("Model already is a transformation model.");
    221231
    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;");
    234242    }
    235243
     
    247255      var model = solution.Model is IDataAnalysisTransformationModel // TODO: what if model is a integrated sym-reg model?
    248256        ? RestoreTrainedModel(solution.Model, transformations)
    249         : CreateTransformationIntegratedModel(solution.Model, transformations);
     257        : CreateTransformationIntegratedModel(solution.Model, transformations, solution.ProblemData);
    250258
    251259      var data = solution.Model is IDataAnalysisTransformationModel
     
    257265
    258266    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.");
    269277    }
    270278    #endregion
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionTransformationModel.cs

    r15884 r15885  
    4242    public RegressionTransformationModel(IRegressionModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
    4343      : 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();
    4749    }
    4850
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblemData.cs

    r15846 r15885  
    15961596
    15971597    public TimeSeriesPrognosisProblemData(ITimeSeriesPrognosisProblemData timeseriesProblemData)
    1598       : this(timeseriesProblemData.Dataset, timeseriesProblemData.AllowedInputVariables, timeseriesProblemData.TargetVariable) {
     1598      : this(timeseriesProblemData.Dataset, timeseriesProblemData.AllowedInputVariables, timeseriesProblemData.TargetVariable, timeseriesProblemData.Transformations) {
    15991599
    16001600      TrainingPartition.Start = timeseriesProblemData.TrainingPartition.Start;
Note: See TracChangeset for help on using the changeset viewer.