Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/06/17 09:22:48 (7 years ago)
Author:
gkronber
Message:

#2690: merged r14345, r14346, r14368 from trunk to stable

Location:
stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestClassificationSolution.cs

    r14186 r15127  
    3838    }
    3939
     40    public int NumberOfTrees {
     41      get { return Model.NumberOfTrees; }
     42    }
     43
    4044    [StorableConstructor]
    4145    private RandomForestClassificationSolution(bool deserializing) : base(deserializing) { }
  • stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs

    r14822 r15127  
    2525using HeuristicLab.Common;
    2626using HeuristicLab.Core;
     27using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    2728using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2829using HeuristicLab.Problems.DataAnalysis;
     30using HeuristicLab.Problems.DataAnalysis.Symbolic;
    2931
    3032namespace HeuristicLab.Algorithms.DataAnalysis {
     
    4951    }
    5052
     53    public int NumberOfTrees {
     54      get { return nTrees; }
     55    }
    5156
    5257    // instead of storing the data of the model itself
     
    6469    [Storable]
    6570    private double m;
    66 
    6771
    6872    [StorableConstructor]
     
    197201    }
    198202
     203    public ISymbolicExpressionTree ExtractTree(int treeIdx) {
     204      var rf = RandomForest;
     205      // hoping that the internal representation of alglib is stable
     206
     207      // TREE FORMAT
     208      // W[Offs]      -   size of sub-array (for the tree)
     209      //     node info:
     210      // W[K+0]       -   variable number        (-1 for leaf mode)
     211      // W[K+1]       -   threshold              (class/value for leaf node)
     212      // W[K+2]       -   ">=" branch index      (absent for leaf node)
     213
     214      // skip irrelevant trees
     215      int offset = 0;
     216      for (int i = 0; i < treeIdx - 1; i++) {
     217        offset = offset + (int)Math.Round(rf.innerobj.trees[offset]);
     218      }
     219
     220      var constSy = new Constant();
     221      var varCondSy = new VariableCondition() { IgnoreSlope = true };
     222
     223      var node = CreateRegressionTreeRec(rf.innerobj.trees, offset, offset + 1, constSy, varCondSy);
     224
     225      var startNode = new StartSymbol().CreateTreeNode();
     226      startNode.AddSubtree(node);
     227      var root = new ProgramRootSymbol().CreateTreeNode();
     228      root.AddSubtree(startNode);
     229      return new SymbolicExpressionTree(root);
     230    }
     231
     232    private ISymbolicExpressionTreeNode CreateRegressionTreeRec(double[] trees, int offset, int k, Constant constSy, VariableCondition varCondSy) {
     233
     234      // alglib source for evaluation of one tree (dfprocessinternal)
     235      // offs = 0
     236      //
     237      // Set pointer to the root
     238      //
     239      // k = offs + 1;
     240      //
     241      // //
     242      // // Navigate through the tree
     243      // //
     244      // while (true) {
     245      //   if ((double)(df.trees[k]) == (double)(-1)) {
     246      //     if (df.nclasses == 1) {
     247      //       y[0] = y[0] + df.trees[k + 1];
     248      //     } else {
     249      //       idx = (int)Math.Round(df.trees[k + 1]);
     250      //       y[idx] = y[idx] + 1;
     251      //     }
     252      //     break;
     253      //   }
     254      //   if ((double)(x[(int)Math.Round(df.trees[k])]) < (double)(df.trees[k + 1])) {
     255      //     k = k + innernodewidth;
     256      //   } else {
     257      //     k = offs + (int)Math.Round(df.trees[k + 2]);
     258      //   }
     259      // }
     260
     261      if ((double)(trees[k]) == (double)(-1)) {
     262        var constNode = (ConstantTreeNode)constSy.CreateTreeNode();
     263        constNode.Value = trees[k + 1];
     264        return constNode;
     265      } else {
     266        var condNode = (VariableConditionTreeNode)varCondSy.CreateTreeNode();
     267        condNode.VariableName = AllowedInputVariables[(int)Math.Round(trees[k])];
     268        condNode.Threshold = trees[k + 1];
     269        condNode.Slope = double.PositiveInfinity;
     270
     271        var left = CreateRegressionTreeRec(trees, offset, k + 3, constSy, varCondSy);
     272        var right = CreateRegressionTreeRec(trees, offset, offset + (int)Math.Round(trees[k + 2]), constSy, varCondSy);
     273
     274        condNode.AddSubtree(left); // not 100% correct because interpreter uses: if(x <= thres) left() else right() and RF uses if(x < thres) left() else right() (see above)
     275        condNode.AddSubtree(right);
     276        return condNode;
     277      }
     278    }
     279
    199280
    200281    public IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
  • stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestRegressionSolution.cs

    r14822 r15127  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
    2425using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2526using HeuristicLab.Problems.DataAnalysis;
     27using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
    2628
    2729namespace HeuristicLab.Algorithms.DataAnalysis {
     
    3638      get { return (IRandomForestModel)base.Model; }
    3739      set { base.Model = value; }
     40    }
     41
     42    public int NumberOfTrees {
     43      get { return Model.NumberOfTrees; }
    3844    }
    3945
Note: See TracChangeset for help on using the changeset viewer.