Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/25/19 23:14:06 (5 years ago)
Author:
mkommend
Message:

#2435: Updated branch with most recent trunk changes.

Location:
branches/2435-alglib_3_15
Files:
13 edited
2 copied

Legend:

Unmodified
Added
Removed
  • branches/2435-alglib_3_15

  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis

  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4

  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/GradientBoostedTreesAlgorithm.cs

    r16565 r17034  
    2121#endregion
    2222
     23using System;
    2324using System.Linq;
    2425using System.Threading;
     26using HeuristicLab.Algorithms.DataAnalysis.GradientBoostedTrees;
    2527using HeuristicLab.Analysis;
    2628using HeuristicLab.Common;
     
    4850    private const string LossFunctionParameterName = "LossFunction";
    4951    private const string UpdateIntervalParameterName = "UpdateInterval";
    50     private const string CreateSolutionParameterName = "CreateSolution";
     52    private const string ModelCreationParameterName = "ModelCreation";
    5153    #endregion
    5254
     
    7981      get { return (IFixedValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; }
    8082    }
    81     public IFixedValueParameter<BoolValue> CreateSolutionParameter {
    82       get { return (IFixedValueParameter<BoolValue>)Parameters[CreateSolutionParameterName]; }
     83    private IFixedValueParameter<EnumValue<ModelCreation>> ModelCreationParameter {
     84      get { return (IFixedValueParameter<EnumValue<ModelCreation>>)Parameters[ModelCreationParameterName]; }
    8385    }
    8486    #endregion
     
    113115      set { MParameter.Value.Value = value; }
    114116    }
    115     public bool CreateSolution {
    116       get { return CreateSolutionParameter.Value.Value; }
    117       set { CreateSolutionParameter.Value.Value = value; }
     117    public ModelCreation ModelCreation {
     118      get { return ModelCreationParameter.Value.Value; }
     119      set { ModelCreationParameter.Value.Value = value; }
    118120    }
    119121    #endregion
     
    146148      Parameters.Add(new FixedValueParameter<IntValue>(SeedParameterName, "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
    147149      Parameters.Add(new FixedValueParameter<BoolValue>(SetSeedRandomlyParameterName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
    148       Parameters.Add(new FixedValueParameter<IntValue>(MaxSizeParameterName, "Maximal size of the tree learned in each step (prefer smaller sizes if possible)", new IntValue(10)));
     150      Parameters.Add(new FixedValueParameter<IntValue>(MaxSizeParameterName, "Maximal size of the tree learned in each step (prefer smaller sizes (3 to 10) if possible)", new IntValue(10)));
    149151      Parameters.Add(new FixedValueParameter<DoubleValue>(RParameterName, "Ratio of training rows selected randomly in each step (0 < R <= 1)", new DoubleValue(0.5)));
    150152      Parameters.Add(new FixedValueParameter<DoubleValue>(MParameterName, "Ratio of variables selected randomly in each step (0 < M <= 1)", new DoubleValue(0.5)));
     
    152154      Parameters.Add(new FixedValueParameter<IntValue>(UpdateIntervalParameterName, "", new IntValue(100)));
    153155      Parameters[UpdateIntervalParameterName].Hidden = true;
    154       Parameters.Add(new FixedValueParameter<BoolValue>(CreateSolutionParameterName, "Flag that indicates if a solution should be produced at the end of the run", new BoolValue(true)));
    155       Parameters[CreateSolutionParameterName].Hidden = true;
     156      Parameters.Add(new FixedValueParameter<EnumValue<ModelCreation>>(ModelCreationParameterName, "Defines the results produced at the end of the run (Surrogate => Less disk space, lazy recalculation of model)", new EnumValue<ModelCreation>(ModelCreation.Model)));
     157      Parameters[ModelCreationParameterName].Hidden = true;
    156158
    157159      var lossFunctions = ApplicationManager.Manager.GetInstances<ILossFunction>();
     
    164166      // BackwardsCompatibility3.4
    165167      #region Backwards compatible code, remove with 3.5
     168
     169      #region LossFunction
    166170      // parameter type has been changed
    167171      var lossFunctionParam = Parameters[LossFunctionParameterName] as ConstrainedValueParameter<StringValue>;
     
    182186      }
    183187      #endregion
     188
     189      #region CreateSolution
     190      // parameter type has been changed
     191      if (Parameters.ContainsKey("CreateSolution")) {
     192        var createSolutionParam = Parameters["CreateSolution"] as FixedValueParameter<BoolValue>;
     193        Parameters.Remove(createSolutionParam);
     194
     195        ModelCreation value = createSolutionParam.Value.Value ? ModelCreation.Model : ModelCreation.QualityOnly;
     196        Parameters.Add(new FixedValueParameter<EnumValue<ModelCreation>>(ModelCreationParameterName, "Defines the results produced at the end of the run (Surrogate => Less disk space, lazy recalculation of model)", new EnumValue<ModelCreation>(value)));
     197        Parameters[ModelCreationParameterName].Hidden = true;
     198      }
     199      #endregion
     200      #endregion
    184201    }
    185202
     
    248265
    249266      // produce solution
    250       if (CreateSolution) {
    251         var model = state.GetModel();
     267      if (ModelCreation == ModelCreation.SurrogateModel || ModelCreation == ModelCreation.Model) {
     268        IRegressionModel model = state.GetModel();
     269
     270        if (ModelCreation == ModelCreation.SurrogateModel) {
     271          model = new GradientBoostedTreesModelSurrogate(problemData, (uint)Seed, lossFunction, Iterations, MaxSize, R, M, Nu, (GradientBoostedTreesModel)model);
     272        }
    252273
    253274        // for logistic regression we produce a classification solution
     
    271292          Results.Add(new Result("Solution", new GradientBoostedTreesSolution(model, problemData)));
    272293        }
     294      } else if (ModelCreation == ModelCreation.QualityOnly) {
     295        //Do nothing
     296      } else {
     297        throw new NotImplementedException("Selected parameter for CreateSolution isn't implemented yet");
    273298      }
    274299    }
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/GradientBoostedTreesAlgorithmStatic.cs

    r16565 r17034  
    101101
    102102      public IRegressionModel GetModel() {
    103 #pragma warning disable 618
    104         var model = new GradientBoostedTreesModel(models, weights);
    105 #pragma warning restore 618
    106         // we don't know the number of iterations here but the number of weights is equal
    107         // to the number of iterations + 1 (for the constant model)
    108         // wrap the actual model in a surrogate that enables persistence and lazy recalculation of the model if necessary
    109         return new GradientBoostedTreesModelSurrogate(problemData, randSeed, lossFunction, weights.Count - 1, maxSize, r, m, nu, model);
     103        return new GradientBoostedTreesModel(models, weights);
    110104      }
    111105      public IEnumerable<KeyValuePair<string, double>> GetVariableRelevance() {
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/GradientBoostedTreesModel.cs

    r16565 r17034  
    3636    // BackwardsCompatibility3.4 for allowing deserialization & serialization of old models
    3737    #region Backwards compatible code, remove with 3.5
    38     private bool isCompatibilityLoaded = false; // only set to true if the model is deserialized from the old format, needed to make sure that information is serialized again if it was loaded from the old format
    3938
    4039    [Storable(Name = "models")]
    4140    private IList<IRegressionModel> __persistedModels {
    4241      set {
    43         this.isCompatibilityLoaded = true;
    4442        this.models.Clear();
    4543        foreach (var m in value) this.models.Add(m);
    4644      }
    47       get { if (this.isCompatibilityLoaded) return models; else return null; }
     45      get { return models; }
    4846    }
    4947    [Storable(Name = "weights")]
    5048    private IList<double> __persistedWeights {
    5149      set {
    52         this.isCompatibilityLoaded = true;
    5350        this.weights.Clear();
    5451        foreach (var w in value) this.weights.Add(w);
    5552      }
    56       get { if (this.isCompatibilityLoaded) return weights; else return null; }
     53      get { return weights; }
    5754    }
    5855    #endregion
     
    7774      this.weights = new List<double>(original.weights);
    7875      this.models = new List<IRegressionModel>(original.models.Select(m => cloner.Clone(m)));
    79       this.isCompatibilityLoaded = original.isCompatibilityLoaded;
    8076    }
    81     [Obsolete("The constructor of GBTModel should not be used directly anymore (use GBTModelSurrogate instead)")]
     77
    8278    internal GradientBoostedTreesModel(IEnumerable<IRegressionModel> models, IEnumerable<double> weights)
    8379      : base(string.Empty, "Gradient boosted tree model", string.Empty) {
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/GradientBoostedTrees/RegressionTreeModel.cs

    r16565 r17034  
    9191    #region old storable format
    9292    // remove with HL 3.4
    93     [Storable(AllowOneWay = true)]
     93    [Storable(OldName = "SerializedTree")]
    9494    // to prevent storing the references to data caches in nodes
    9595    // seemingly, it is bad (performance-wise) to persist tuples (tuples are used as keys in a dictionary)
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj

    r16658 r17034  
    217217    <Compile Include="GradientBoostedTrees\LossFunctions\SquaredErrorLoss.cs" />
    218218    <Compile Include="GradientBoostedTrees\GradientBoostedTreesSolution.cs" />
     219    <Compile Include="GradientBoostedTrees\ModelCreation.cs" />
    219220    <Compile Include="GradientBoostedTrees\RegressionTreeBuilder.cs" />
    220221    <Compile Include="GradientBoostedTrees\RegressionTreeModel.cs" />
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs

    r16565 r17034  
    294294        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
    295295
    296       throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
     296      throw new ArgumentException("The problem data is not compatible with this nearest neighbour model. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
    297297    }
    298298
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs

    r16565 r17034  
    144144        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
    145145
    146       throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
     146      throw new ArgumentException("The problem data is not compatible with this neural network ensemble. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
    147147    }
    148148
     
    153153      return new NeuralNetworkEnsembleClassificationSolution(this, new ClassificationEnsembleProblemData(problemData));
    154154    }
    155    
     155
    156156    #region persistence
    157157    [Storable]
     
    183183      }
    184184    }
    185     [Storable(AllowOneWay = true)]
     185    [Storable(OldName = "MultiLayerPerceptronEnsembleDfdnet")]
    186186    private double[] MultiLayerPerceptronEnsembleDfdnet {
    187187      set {
     
    197197      }
    198198    }
    199     [Storable(AllowOneWay = true)]
     199    [Storable(OldName = "MultiLayerPerceptronEnsembleNeurons")]
    200200    private double[] MultiLayerPerceptronEnsembleNeurons {
    201201      set { mlpEnsemble.innerobj.network.neurons = value; }
    202202    }
    203     [Storable(AllowOneWay = true)]
     203    [Storable(OldName = "MultiLayerPerceptronEnsembleSerializedMlp")]
    204204    private double[] MultiLayerPerceptronEnsembleSerializedMlp {
    205205      set {
     
    207207      }
    208208    }
    209     [Storable(AllowOneWay = true)]
     209    [Storable(OldName = "MultiLayerPerceptronStuctinfo")]
    210210    private int[] MultiLayerPerceptronStuctinfo {
    211211      set {
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs

    r16565 r17034  
    147147        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
    148148
    149       throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
     149      throw new ArgumentException("The problem data is not compatible with this neural network. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
    150150    }
    151151
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs

    r16565 r17034  
    300300        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
    301301
    302       throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
     302      throw new ArgumentException("The problem data is not compatible with this random forest. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
    303303    }
    304304
  • branches/2435-alglib_3_15/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs

    r16565 r17034  
    143143        return IsProblemDataCompatible(classificationProblemData, out errorMessage);
    144144
    145       throw new ArgumentException("The problem data is not a regression nor a classification problem data. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
     145      throw new ArgumentException("The problem data is not compatible with this SVM. Instead a " + problemData.GetType().GetPrettyName() + " was provided.", "problemData");
    146146    }
    147147
Note: See TracChangeset for help on using the changeset viewer.