Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/07/15 17:42:24 (9 years ago)
Author:
gkronber
Message:

#2261: made TreeNode immutable and prevent change of TreeNode[] tree in RegressionTreeModel
ToString() override to make debugging easier and to enable inspection in unit test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GBT-trunkintegration/Tests/Test.cs

    r12632 r12658  
    1111using Microsoft.VisualStudio.TestTools.UnitTesting;
    1212
    13 namespace HeuristicLab.Algorithms.DataAnalysis.GradientBoostedTrees {
     13namespace HeuristicLab.Algorithms.DataAnalysis {
    1414  [TestClass()]
    1515  public class Test {
     
    2121        var xy = new double[,]
    2222        {
    23           {1, 20, 0},
    24           {1, 20, 0},
    25           {2, 10, 0},
    26           {2, 10, 0},
    27         };
    28         var allVariables = new string[] { "y", "x1", "x2" };
    29 
    30         // x1 <= 15 -> 2
    31         // x1 >  15 -> 1
    32         BuildTree(xy, allVariables, 10);
    33       }
    34 
    35 
    36       {
    37         var xy = new double[,]
    38         {
    39           {1, 20,  1},
    40           {1, 20, -1},
    41           {2, 10, -1},
    42           {2, 10, 1},
     23          {-1, 20, 0},
     24          {-1, 20, 0},
     25          { 1, 10, 0},
     26          { 1, 10, 0},
     27        };
     28        var allVariables = new string[] { "y", "x1", "x2" };
     29
     30        // x1 <= 15 -> 1
     31        // x1 >  15 -> -1
     32        BuildTree(xy, allVariables, 10);
     33      }
     34
     35
     36      {
     37        var xy = new double[,]
     38        {
     39          {-1, 20,  1},
     40          {-1, 20, -1},
     41          { 1, 10, -1},
     42          { 1, 10, 1},
    4343        };
    4444        var allVariables = new string[] { "y", "x1", "x2" };
    4545
    4646        // ignore irrelevant variables
    47         // x1 <= 15 -> 2
    48         // x1 >  15 -> 1
     47        // x1 <= 15 -> 1
     48        // x1 >  15 -> -1
    4949        BuildTree(xy, allVariables, 10);
    5050      }
     
    5454        var xy = new double[,]
    5555        {
    56           {1, 20,  1},
    57           {2, 20, -1},
    58           {3, 10, -1},
    59           {4, 10, 1},
    60         };
    61 
    62         var allVariables = new string[] { "y", "x1", "x2" };
    63 
    64         // x1 <= 15 AND x2 <= 0 -> 3
    65         // x1 <= 15 AND x2 >  0 -> 4
    66         // x1 >  15 AND x2 <= 0 -> 2
    67         // x1 >  15 AND x2 >  0 -> 1
     56          {-2, 20,  1},
     57          {-1, 20, -1},
     58          { 1, 10, -1},
     59          { 2, 10, 1},
     60        };
     61
     62        var allVariables = new string[] { "y", "x1", "x2" };
     63
     64        // x1 <= 15 AND x2 <= 0 -> 1
     65        // x1 <= 15 AND x2 >  0 -> 2
     66        // x1 >  15 AND x2 <= 0 -> -1
     67        // x1 >  15 AND x2 >  0 -> -2
    6868        BuildTree(xy, allVariables, 10);
    6969      }
     
    7373        var xy = new double[,]
    7474        {
    75           {0.5, 20,  1},
    76           {1.5, 20,  1},
    77           {1.5, 20, -1},
    78           {2.5, 20, -1},
    79           {2.5, 10, -1},
    80           {3.5, 10, -1},
    81           {3.5, 10, 1},
    82           {4.5, 10, 1},
    83         };
    84 
    85         var allVariables = new string[] { "y", "x1", "x2" };
    86 
    87         // x1 <= 15 AND x2 <= 0 -> 3
    88         // x1 <= 15 AND x2 >  0 -> 4
    89         // x1 >  15 AND x2 <= 0 -> 2
    90         // x1 >  15 AND x2 >  0 -> 1
     75          {-2.5, 20,  1},
     76          {-1.5, 20,  1},
     77          {-1.5, 20, -1},
     78          {0.5, 20, -1},
     79          {0.5, 10, -1},
     80          {1.5, 10, -1},
     81          {1.5, 10, 1},
     82          {2.5, 10, 1},
     83        };
     84
     85        var allVariables = new string[] { "y", "x1", "x2" };
     86
     87        // x1 <= 15 AND x2 <= 0 -> 1
     88        // x1 <= 15 AND x2 >  0 -> 2
     89        // x1 >  15 AND x2 <= 0 -> -1
     90        // x1 >  15 AND x2 >  0 -> -2
    9191        BuildTree(xy, allVariables, 10);
    9292      }
     
    9797        var xy = new double[,]
    9898        {
    99           {10, 1, 1},
    100           {1, 1, 2},
    101           {1, 2, 1},
    102           {10, 2, 2},
     99          { 1, 1, 1},
     100          {-1, 1, 2},
     101          {-1, 2, 1},
     102          { 1, 2, 2},
    103103        };
    104104
     
    106106
    107107        // split cannot be found
    108         // -> 5.50
     108        // -> 0.0
    109109        BuildTree(xy, allVariables, 3);
    110110      }
     
    113113        var xy = new double[,]
    114114        {
    115           {10, 1, 1},
    116           {1, 1, 2},
    117           {1, 2, 1},
    118           {10.1, 2, 2},
     115          { 1, 1, 1},
     116          {-1, 1, 2},
     117          {-1, 2, 1},
     118          { 1.0001, 2, 2},
    119119        };
    120120
    121121        var allVariables = new string[] { "y", "x1", "x2" };
    122122        // (two possible solutions)
    123         // x2 <= 1.5 -> 5.50
    124         // x2 >  1.5 -> 5.55
     123        // x2 <= 1.5 -> 0
     124        // x2 >  1.5 -> 0 (not quite)
    125125        BuildTree(xy, allVariables, 3);
    126126
    127         // x1 <= 1.5 AND x2 <= 1.5 -> 10
    128         // x1 <= 1.5 AND x2 >  1.5 -> 1
    129         // x1 >  1.5 AND x2 <= 1.5 -> 1
    130         // x1 >  1.5 AND x2 >  1.5 -> 10.1
     127        // x1 <= 1.5 AND x2 <= 1.5 -> 1
     128        // x1 <= 1.5 AND x2 >  1.5 -> -1
     129        // x1 >  1.5 AND x2 <= 1.5 -> -1
     130        // x1 >  1.5 AND x2 >  1.5 -> 1 (not quite)
    131131        BuildTree(xy, allVariables, 7);
    132132      }
     
    155155          {-1, 1, 2},
    156156          {-1, 2, 1},
    157           { 1, 2, 2},
     157          { 3, 2, 2},
    158158        };
    159159
     
    162162        // x2 <= 1.5 -> -1.0
    163163        // x2 >  1.5 AND x1 <= 1.5 -> -1.0
    164         // x2 >  1.5 AND x1 >  1.5 ->  1.0
     164        // x2 >  1.5 AND x1 >  1.5 ->  3.0
    165165        BuildTree(xy, allVariables, 10);
    166166      }
     
    269269      var builder = new RegressionTreeBuilder(problemData, rand);
    270270      var model = (GradientBoostedTreesModel)builder.CreateRegressionTree(maxDepth, 1, 1); // maximal depth and use all rows and cols
    271       var constM = model.Models.First() as ConstantRegressionModel;
    272271      var treeM = model.Models.Skip(1).First() as RegressionTreeModel;
    273       WriteTree(treeM.tree, 0, "", constM.Constant);
     272
     273      Console.WriteLine(treeM.ToString());
    274274      Console.WriteLine();
    275     }
    276 
    277     private void WriteTree(RegressionTreeModel.TreeNode[] tree, int idx, string partialRule, double offset) {
    278       var n = tree[idx];
    279       if (n.VarName == RegressionTreeModel.TreeNode.NO_VARIABLE) {
    280         Console.WriteLine("{0} -> {1:F}", partialRule, n.Val + offset);
    281       } else {
    282         WriteTree(tree, n.LeftIdx,
    283           string.Format(CultureInfo.InvariantCulture, "{0}{1}{2} <= {3:F}",
    284           partialRule,
    285           string.IsNullOrEmpty(partialRule) ? "" : " and ",
    286           n.VarName,
    287           n.Val), offset);
    288         WriteTree(tree, n.RightIdx,
    289           string.Format(CultureInfo.InvariantCulture, "{0}{1}{2} >  {3:F}",
    290           partialRule,
    291           string.IsNullOrEmpty(partialRule) ? "" : " and ",
    292           n.VarName,
    293           n.Val), offset);
    294       }
    295275    }
    296276    #endregion
Note: See TracChangeset for help on using the changeset viewer.