Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/28/18 17:17:31 (6 years ago)
Author:
pfleck
Message:

#2906

  • Implemented for classification, clustering, etc.
  • Simplified Transformation interfaces (read-only, ...).
  • Started moving transformation logic out of ProblemData.
Location:
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4
Files:
8 added
2 deleted
5 edited
2 moved

Legend:

Unmodified
Added
Removed
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj

    r15864 r15870  
    187187    <Compile Include="Implementation\Classification\ClassificationSolutionBase.cs" />
    188188    <Compile Include="Implementation\Classification\ClassificationSolutionVariableImpactsCalculator.cs" />
     189    <Compile Include="Implementation\Classification\ClassificationTransformationModel.cs" />
    189190    <Compile Include="Implementation\Classification\ConstantClassificationSolution.cs" />
    190191    <Compile Include="Implementation\Classification\DiscriminantFunctionClassificationSolutionBase.cs" />
     
    193194    <Compile Include="Implementation\Clustering\ClusteringProblemData.cs" />
    194195    <Compile Include="Implementation\Clustering\ClusteringSolution.cs" />
     196    <Compile Include="Implementation\Clustering\ClusteringTransformationModel.cs" />
    195197    <Compile Include="Implementation\ConstantModel.cs" />
    196198    <Compile Include="Implementation\DataAnalysisModel.cs" />
     
    206208    <Compile Include="Implementation\Regression\RegressionModel.cs" />
    207209    <Compile Include="Implementation\Regression\RegressionSolutionVariableImpactsCalculator.cs" />
    208     <Compile Include="Implementation\Regression\TransformedRegressionModel.cs" />
    209     <Compile Include="Implementation\Regression\TransformedRegressionSolution.cs" />
     210    <Compile Include="Implementation\DataAnalysisTransformationModel.cs" />
     211    <Compile Include="Implementation\Regression\RegressionTransformationModel.cs" />
    210212    <Compile Include="Implementation\TimeSeriesPrognosis\Models\ConstantTimeSeriesPrognosisModel.cs" />
    211213    <Compile Include="Implementation\TimeSeriesPrognosis\Models\TimeSeriesPrognosisAutoRegressiveModel.cs" />
     214    <Compile Include="Implementation\TimeSeriesPrognosis\Models\TimeSeriesPrognosisTransformationModel.cs" />
    212215    <Compile Include="Implementation\TimeSeriesPrognosis\TimeSeriesPrognosisProblem.cs" />
    213216    <Compile Include="Implementation\TimeSeriesPrognosis\TimeSeriesPrognosisProblemData.cs" />
     
    236239      <SubType>Code</SubType>
    237240    </Compile>
     241    <Compile Include="Interfaces\Classification\IClassificationTransformationModel.cs" />
    238242    <Compile Include="Interfaces\Classification\IDiscriminantFunctionThresholdCalculator.cs" />
     243    <Compile Include="Interfaces\Clustering\IClusteringTransformationModel.cs" />
    239244    <Compile Include="Interfaces\IDataAnalysisSolutionExporter.cs" />
    240245    <Compile Include="Interfaces\IDataAnalysisTransformation.cs" />
     246    <Compile Include="Interfaces\IDataAnalysisTransformationModel.cs" />
    241247    <Compile Include="Interfaces\IDataset.cs" />
    242248    <Compile Include="Interfaces\IDependencyCalculator.cs" />
    243249    <Compile Include="Interfaces\ITransformation.cs" />
    244     <Compile Include="Interfaces\Regression\ITransformedRegressionModel.cs" />
    245     <Compile Include="Interfaces\Regression\ITransformedRegressionSolution.cs" />
     250    <Compile Include="Interfaces\Regression\IRegressionTransformationModel.cs" />
    246251    <Compile Include="Interfaces\Regression\IConfidenceRegressionModel.cs" />
    247252    <Compile Include="Interfaces\Regression\IConfidenceRegressionSolution.cs" />
     
    256261    <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisProblemData.cs" />
    257262    <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisSolution.cs" />
     263    <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisTransformationModel.cs" />
    258264    <Compile Include="ModifiableDataset.cs" />
    259265    <Compile Include="OnlineCalculators\AutoCorrelationCalculator.cs" />
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs

    r15858 r15870  
    243243
    244244    public virtual IDataAnalysisProblemData Transform() {
    245       var newDataset = Transform(Dataset, Transformations);
     245      var newDataset = DataAnalysisTransformationModel.Transform(Dataset, Transformations);
    246246
    247247      var extendedInputs = ExtendInputVariables(AllowedInputVariables, Transformations);
     
    253253      cloner.RegisterClonedObject(Dataset, newDataset);
    254254      cloner.RegisterClonedObject(InputVariables, checkedInputs.AsReadOnly());
    255       //cloner.RegisterClonedObject(TransformationsParameter.Value, new ItemList<IDataAnalysisTransformation>(transformations).AsReadOnly());
     255      // TODO: valid values for target are not extended
    256256
    257257      return cloner.Clone(this);
     
    268268      cloner.RegisterClonedObject(Dataset, newDataset);
    269269      cloner.RegisterClonedObject(InputVariables, checkedInputs.AsReadOnly());
    270       //cloner.RegisterClonedObject(TransformationsParameter.Value, new ItemList<IDataAnalysisTransformation>().AsReadOnly());
     270      // TODO: check valid target values
    271271
    272272      return cloner.Clone(this);
    273     }
    274 
    275     public static IDataset Transform(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
    276       var modifiableDataset = ((Dataset)dataset).ToModifiable();
    277 
    278       foreach (var transformation in transformations) {
    279         var trans = (ITransformation<double>)transformation.Transformation;
    280 
    281         var originalData = modifiableDataset.GetDoubleValues(transformation.OriginalVariable);
    282         if (!trans.Check(originalData, out string errorMessage))
    283           throw new InvalidOperationException($"Cannot estimate Values, Transformation is invalid: {errorMessage}");
    284 
    285         var transformedData = trans.Apply(originalData).ToList();
    286         if (modifiableDataset.VariableNames.Contains(transformation.TransformedVariable))
    287           modifiableDataset.ReplaceVariable(transformation.TransformedVariable, transformedData);
    288         else
    289           modifiableDataset.AddVariable(transformation.TransformedVariable, transformedData);
    290       }
    291 
    292       return modifiableDataset;
    293273    }
    294274
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformation.cs

    r15865 r15870  
    2020#endregion
    2121
    22 using System;
    2322using HeuristicLab.Common;
    2423using HeuristicLab.Core;
     
    4039    }
    4140
    42     private IValueParameter<ITransformation> TransformationParameter {
    43       get { return (IValueParameter<ITransformation>)Parameters["Transformation"]; }
     41    private ValueParameter<ITransformation> TransformationParameter {
     42      get { return (ValueParameter<ITransformation>)Parameters["Transformation"]; }
    4443    }
    4544    #endregion
     
    4847    public string OriginalVariable {
    4948      get { return OriginalVariableParameter.Value.Value; }
    50       set { OriginalVariableParameter.Value.Value = value; }
    5149    }
    5250
    5351    public string TransformedVariable {
    5452      get { return TransformedVariableParameter.Value.Value; }
    55       set { TransformedVariableParameter.Value.Value = value; }
    5653    }
    5754
    5855    public ITransformation Transformation {
    5956      get { return TransformationParameter.Value; }
    60       set { TransformationParameter.Value = value; }
    6157    }
    6258    #endregion
    6359
    6460    #region Constructor, Cloning & Persistence
    65     public DataAnalysisTransformation()
    66       : this("", "", new IdentityTransformation()) {
    67     }
    6861    public DataAnalysisTransformation(string originalVariable, string transformedVariable, ITransformation transformation)
    6962      : base() {
    70       Parameters.Add(new FixedValueParameter<StringValue>("Original Variable", new StringValue(originalVariable)));
    71       Parameters.Add(new FixedValueParameter<StringValue>("Transformed Variable", new StringValue(transformedVariable)));
    72       Parameters.Add(new ValueParameter<ITransformation>("Transformation", transformation));
    73 
    74       RegisterEventHandlers();
     63      Parameters.Add(new FixedValueParameter<StringValue>("Original Variable", new StringValue(originalVariable).AsReadOnly()));
     64      Parameters.Add(new FixedValueParameter<StringValue>("Transformed Variable", new StringValue(transformedVariable).AsReadOnly()));
     65      Parameters.Add(new ValueParameter<ITransformation>("Transformation", transformation)); // TODO: should be readonly/fixed
    7566    }
    7667
    7768    protected DataAnalysisTransformation(DataAnalysisTransformation original, Cloner cloner)
    7869      : base(original, cloner) {
    79       RegisterEventHandlers();
    8070    }
    8171
     
    8979
    9080    [StorableHook(HookType.AfterDeserialization)]
    91     private void AfterDeserialization() {
    92       RegisterEventHandlers();
    93     }
    94     #endregion
    95 
    96     #region Event-Handling
    97     private void RegisterEventHandlers() {
    98       OriginalVariableParameter.Value.ValueChanged += OriginalVariableParameterValue_ValueChanged;
    99       TransformedVariableParameter.Value.ValueChanged += TransformedVariableParameterValue_ValueChanged;
    100       TransformationParameter.ValueChanged += TransformationParameter_ValueChanged;
    101     }
    102 
    103     private void OriginalVariableParameterValue_ValueChanged(object sender, EventArgs e) {
    104       OnToStringChanged();
    105     }
    106     private void TransformedVariableParameterValue_ValueChanged(object sender, EventArgs e) {
    107       OnToStringChanged();
    108     }
    109     private void TransformationParameter_ValueChanged(object sender, EventArgs e) {
    110       OnToStringChanged();
    111     }
    11281    #endregion
    11382
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformationModel.cs

    r15869 r15870  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
     
    2728
    2829namespace HeuristicLab.Problems.DataAnalysis {
    29   [Item("Transformed Regression Model", "A model that was transformed back to match the original variables after the training was performed on transformed variables.")]
     30  [Item("Data Analysis Transformation Model", "A model that was transformed back to match the original variables after the training was performed on transformed variables.")]
    3031  [StorableClass]
    31   public class TransformedRegressionModel : RegressionModel, ITransformedRegressionModel {
     32  public abstract class DataAnalysisTransformationModel : DataAnalysisModel, IDataAnalysisTransformationModel {
    3233
    3334    [Storable]
    34     public IRegressionModel OriginalModel { get; private set; }
     35    public IDataAnalysisModel OriginalModel { get; protected set; }
    3536
    3637    [Storable]
    37     public ItemList<IDataAnalysisTransformation> Transformations { get; private set; }
     38    public ReadOnlyItemList<IDataAnalysisTransformation> InputTransformations { get; protected set; }
     39
     40    [Storable]
     41    public ReadOnlyItemList<IDataAnalysisTransformation> TargetTransformations { get; protected set; }
     42
     43    // Usually, the TargetVariable is usually only implemented for Regression and Classification.
     44    // However, we implement it in the base class for reducing code duplication and to avoid quasi-identical views.
     45    [Storable]
     46    private string targetVariable;
     47    public string TargetVariable {
     48      get { return targetVariable; }
     49      set {
     50        if (string.IsNullOrEmpty(value) || targetVariable == value) return;
     51        targetVariable = value;
     52        OnTargetVariableChanged(this, EventArgs.Empty);
     53      }
     54    }
    3855
    3956    public override IEnumerable<string> VariablesUsedForPrediction {
    40       get { return OriginalModel.VariablesUsedForPrediction; }
     57      get { return OriginalModel.VariablesUsedForPrediction; /* TODO: reduce extend-inputs */}
    4158    }
    4259
    4360    #region Constructor, Cloning & Persistence
    44     public TransformedRegressionModel(IRegressionModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
    45       : base(RegressionProblemData.GetOriginalTragetVariable(originalModel.TargetVariable, transformations)) {
    46       Name = "Transformed " + originalModel.Name;
     61    protected DataAnalysisTransformationModel(IDataAnalysisModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations)
     62      : base(originalModel.Name) {
    4763      OriginalModel = originalModel;
    48       Transformations = new ItemList<IDataAnalysisTransformation>(transformations);
     64      var transitiveInputs = CalculateTransitiveVariables(originalModel.VariablesUsedForPrediction, transformations);
     65      InputTransformations = new ItemList<IDataAnalysisTransformation>(transformations.Where(t => transitiveInputs.Contains(t.OriginalVariable))).AsReadOnly();
     66      TargetTransformations = new ReadOnlyItemList<IDataAnalysisTransformation>();
    4967    }
    5068
    51     protected TransformedRegressionModel(TransformedRegressionModel original, Cloner cloner)
     69    protected DataAnalysisTransformationModel(DataAnalysisTransformationModel original, Cloner cloner)
    5270      : base(original, cloner) {
    5371      OriginalModel = cloner.Clone(original.OriginalModel);
    54       Transformations = cloner.Clone(original.Transformations);
    55     }
    56 
    57     public override IDeepCloneable Clone(Cloner cloner) {
    58       return new TransformedRegressionModel(this, cloner);
     72      InputTransformations = cloner.Clone(original.InputTransformations);
     73      TargetTransformations = cloner.Clone(original.TargetTransformations);
     74      targetVariable = original.targetVariable;
    5975    }
    6076
    6177    [StorableConstructor]
    62     protected TransformedRegressionModel(bool deserializing)
     78    protected DataAnalysisTransformationModel(bool deserializing)
    6379      : base(deserializing) { }
    6480    #endregion
    6581
     82    public static ISet<string> CalculateTransitiveVariables(IEnumerable<string> inputVariables, IEnumerable<IDataAnalysisTransformation> transformations) {
     83      var transitiveInputs = new HashSet<string>(inputVariables);
     84
     85      foreach (var transformation in transformations.Reverse()) {
     86        if (transitiveInputs.Contains(transformation.TransformedVariable)) {
     87          transitiveInputs.Add(transformation.OriginalVariable);
     88        }
     89      }
     90
     91      return transitiveInputs;
     92    }
     93
     94    public static IDataset Transform(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
     95      var modifiableDataset = ((Dataset)dataset).ToModifiable();
     96
     97      foreach (var transformation in transformations) {
     98        var trans = (ITransformation<double>)transformation.Transformation;
     99
     100        var originalData = modifiableDataset.GetDoubleValues(transformation.OriginalVariable);
     101        if (!trans.Check(originalData, out string errorMessage))
     102          throw new InvalidOperationException($"Cannot estimate Values, Transformation is invalid: {errorMessage}");
     103
     104        var transformedData = trans.Apply(originalData).ToList();
     105        if (modifiableDataset.VariableNames.Contains(transformation.TransformedVariable))
     106          modifiableDataset.ReplaceVariable(transformation.TransformedVariable, transformedData);
     107        else
     108          modifiableDataset.AddVariable(transformation.TransformedVariable, transformedData);
     109      }
     110
     111      return modifiableDataset;
     112    }
     113
     114
     115
     116    #region Events
     117    public event EventHandler TargetVariableChanged;
     118    private void OnTargetVariableChanged(object sender, EventArgs args) {
     119      var changed = TargetVariableChanged;
     120      if (changed != null)
     121        changed(sender, args);
     122    }
     123    #endregion
     124
     125
     126
     127
     128
     129
     130    /*
    66131    // dataset in original data range
    67132    public override IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
    68       var transformedDataset = TransformInputs(dataset, Transformations);
     133      var transformedDataset = Transform(dataset, Transformations);
    69134
    70135      var estimates = OriginalModel.GetEstimatedValues(transformedDataset, rows);
    71136
    72       return InverseTransformEstimates(estimates, Transformations, OriginalModel.TargetVariable);
     137      return InverseTransform(estimates, Transformations, OriginalModel.TargetVariable);
    73138    }
    74139
     
    76141    public override IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
    77142      // TODO: specialized views for the original solution type are lost (RandomForestSolutionView, ...)
    78       return new TransformedRegressionSolution(this, new RegressionProblemData(problemData));
    79     }
    80 
    81     private static IDataset TransformInputs(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {
    82       return DataAnalysisProblemData.Transform(dataset, transformations);
    83     }
    84 
    85     private static IEnumerable<double> InverseTransformEstimates(IEnumerable<double> data, IEnumerable<IDataAnalysisTransformation> transformations, string targetVariable) {
    86       var estimates = data.ToList();
    87 
    88       foreach (var transformation in transformations.Reverse()) {
    89         if (transformation.TransformedVariable == targetVariable) {
    90           var trans = (ITransformation<double>)transformation.Transformation;
    91 
    92           estimates = trans.InverseApply(estimates).ToList();
    93 
    94           // setup next iteration
    95           targetVariable = transformation.OriginalVariable;
    96         }
    97       }
    98 
    99       return estimates;
    100     }
     143      return new RegressionSolution(this, new RegressionProblemData(problemData));
     144    } */
    101145  }
    102146}
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs

    r15856 r15870  
    183183    public override IDataAnalysisProblemData Transform() {
    184184      var transformedProblemData = (IRegressionProblemData)base.Transform();
    185       var targetVariable = GetTransformedTragetVariable(TargetVariable, Transformations);
     185      var targetVariable = RegressionTransformationModel.GetTransformedTragetVariable(TargetVariable, Transformations);
    186186      transformedProblemData.TargetVariable = targetVariable;
    187187      return transformedProblemData;
     
    190190    public override IDataAnalysisProblemData InverseTransform() {
    191191      var transformedProblemData = (IRegressionProblemData)base.InverseTransform();
    192       var targetVariable = GetOriginalTragetVariable(TargetVariable, Transformations);
     192      var targetVariable = RegressionTransformationModel.GetOriginalTragetVariable(TargetVariable, Transformations);
    193193      transformedProblemData.TargetVariable = targetVariable;
    194194      return transformedProblemData;
    195195    }
    196 
    197     public static string GetTransformedTragetVariable(string originalTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
    198       var transformedTarget = originalTarget;
    199       foreach (var transformation in transformations) {
    200         if (transformation.OriginalVariable == transformedTarget)
    201           transformedTarget = transformation.TransformedVariable;
    202       }
    203       return transformedTarget;
    204     }
    205 
    206     public static string GetOriginalTragetVariable(string transformedTarget, IEnumerable<IDataAnalysisTransformation> transformations) {
    207       var originalTarget = transformedTarget;
    208       foreach (var transformation in transformations.Reverse()) {
    209         if (transformation.TransformedVariable == originalTarget)
    210           originalTarget = transformation.OriginalVariable;
    211       }
    212       return originalTarget;
    213     }
    214196  }
    215197}
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/IDataAnalysisTransformation.cs

    r15847 r15870  
    2525  public interface IDataAnalysisTransformation : INamedItem {
    2626
    27     string OriginalVariable { get; set; }
    28     string TransformedVariable { get; set; }
     27    string OriginalVariable { get; }
     28    string TransformedVariable { get; }
    2929
    30     ITransformation Transformation { get; set; }
     30    ITransformation Transformation { get; }
    3131  }
    3232}
  • branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Regression/IRegressionTransformationModel.cs

    r15869 r15870  
    2323
    2424namespace HeuristicLab.Problems.DataAnalysis {
    25   public interface ITransformedRegressionModel : IRegressionModel {
    26 
    27     IRegressionModel OriginalModel { get; }
    28 
    29     ItemList<IDataAnalysisTransformation> Transformations { get; }
     25  public interface IRegressionTransformationModel : IDataAnalysisTransformationModel, IRegressionModel {
     26    new IRegressionModel OriginalModel { get; }
    3027  }
    3128}
Note: See TracChangeset for help on using the changeset viewer.