Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/07/15 11:57:37 (9 years ago)
Author:
gkronber
Message:

#2261 implemented node expansion using a priority queue (and changed parameter MaxDepth to MaxSize). Moved unit tests to a separate project.

Location:
branches/GBT-trunkintegration/Tests
Files:
1 added
1 moved

Legend:

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

    r12622 r12632  
    44using System.Linq;
    55using System.Runtime.CompilerServices;
     6using System.Threading;
     7using HeuristicLab.Data;
     8using HeuristicLab.Optimization;
    69using HeuristicLab.Problems.DataAnalysis;
    710using HeuristicLab.Random;
     
    2528        var allVariables = new string[] { "y", "x1", "x2" };
    2629
    27         // x1 <= 15 -> 1
    28         // x1 >  15 -> 2
     30        // x1 <= 15 -> 2
     31        // x1 >  15 -> 1
    2932        BuildTree(xy, allVariables, 10);
    3033      }
     
    4245
    4346        // ignore irrelevant variables
    44         // x1 <= 15 -> 1
    45         // x1 >  15 -> 2
     47        // x1 <= 15 -> 2
     48        // x1 >  15 -> 1
    4649        BuildTree(xy, allVariables, 10);
    4750      }
     
    6164        // x1 <= 15 AND x2 <= 0 -> 3
    6265        // x1 <= 15 AND x2 >  0 -> 4
    63         // x1 >  15 AND x2 <= 0 -> 1
    64         // x1 >  15 AND x2 >  0 -> 2
     66        // x1 >  15 AND x2 <= 0 -> 2
     67        // x1 >  15 AND x2 >  0 -> 1
    6568        BuildTree(xy, allVariables, 10);
    6669      }
     
    8487        // x1 <= 15 AND x2 <= 0 -> 3
    8588        // x1 <= 15 AND x2 >  0 -> 4
    86         // x1 >  15 AND x2 <= 0 -> 1
    87         // x1 >  15 AND x2 >  0 -> 2
     89        // x1 >  15 AND x2 <= 0 -> 2
     90        // x1 >  15 AND x2 >  0 -> 1
    8891        BuildTree(xy, allVariables, 10);
    8992      }
     
    103106
    104107        // split cannot be found
     108        // -> 5.50
    105109        BuildTree(xy, allVariables, 3);
    106110      }
     
    116120
    117121        var allVariables = new string[] { "y", "x1", "x2" };
     122        // (two possible solutions)
     123        // x2 <= 1.5 -> 5.50
     124        // x2 >  1.5 -> 5.55
     125        BuildTree(xy, allVariables, 3);
     126
    118127        // x1 <= 1.5 AND x2 <= 1.5 -> 10
    119128        // x1 <= 1.5 AND x2 >  1.5 -> 1
    120129        // x1 >  1.5 AND x2 <= 1.5 -> 1
    121130        // x1 >  1.5 AND x2 >  1.5 -> 10.1
    122         BuildTree(xy, allVariables, 3);
     131        BuildTree(xy, allVariables, 7);
    123132      }
    124133      {
     
    136145        // x1 >  1.5 AND x2 <= 1.5 -> 0.9
    137146        // x1 >  1.5 AND x2 >  1.5 -> 1.1
    138         BuildTree(xy, allVariables, 3);
    139       }
    140 
    141     }
    142 
     147        BuildTree(xy, allVariables, 10);
     148      }
     149
     150      {
     151        // unbalanced split
     152        var xy = new double[,]
     153        {
     154          {-1, 1, 1},
     155          {-1, 1, 2},
     156          {-1, 2, 1},
     157          { 1, 2, 2},
     158        };
     159
     160        var allVariables = new string[] { "y", "x1", "x2" };
     161        // (two possible solutions)
     162        // x2 <= 1.5 -> -1.0
     163        // x2 >  1.5 AND x1 <= 1.5 -> -1.0
     164        // x2 >  1.5 AND x1 >  1.5 ->  1.0
     165        BuildTree(xy, allVariables, 10);
     166      }
     167    }
     168
     169    [TestMethod]
     170    [TestCategory("Algorithms.DataAnalysis")]
     171    [TestProperty("Time", "long")]
     172    public void GradientBoostingTestTowerSquaredError() {
     173      var gbt = new GradientBoostedTreesAlgorithm();
     174      var provider = new HeuristicLab.Problems.Instances.DataAnalysis.RegressionRealWorldInstanceProvider();
     175      var instance = provider.GetDataDescriptors().Single(x => x.Name.Contains("Tower"));
     176      var regProblem = new RegressionProblem();
     177      regProblem.Load(provider.LoadData(instance));
     178
     179      #region Algorithm Configuration
     180      gbt.Problem = regProblem;
     181      gbt.Seed = 0;
     182      gbt.SetSeedRandomly = false;
     183      gbt.Iterations = 5000;
     184      gbt.MaxSize = 20;
     185      #endregion
     186
     187      RunAlgorithm(gbt);
     188
     189      Assert.AreEqual(267.68704241153921, ((DoubleValue)gbt.Results["Loss (train)"].Value).Value, 1E-6);
     190      Assert.AreEqual(393.84704062205469, ((DoubleValue)gbt.Results["Loss (test)"].Value).Value, 1E-6);
     191    }
     192
     193    [TestMethod]
     194    [TestCategory("Algorithms.DataAnalysis")]
     195    [TestProperty("Time", "long")]
     196    public void GradientBoostingTestTowerAbsoluteError() {
     197      var gbt = new GradientBoostedTreesAlgorithm();
     198      var provider = new HeuristicLab.Problems.Instances.DataAnalysis.RegressionRealWorldInstanceProvider();
     199      var instance = provider.GetDataDescriptors().Single(x => x.Name.Contains("Tower"));
     200      var regProblem = new RegressionProblem();
     201      regProblem.Load(provider.LoadData(instance));
     202
     203      #region Algorithm Configuration
     204      gbt.Problem = regProblem;
     205      gbt.Seed = 0;
     206      gbt.SetSeedRandomly = false;
     207      gbt.Iterations = 1000;
     208      gbt.MaxSize = 20;
     209      gbt.Nu = 0.02;
     210      gbt.LossFunctionParameter.Value = gbt.LossFunctionParameter.ValidValues.First(l => l.ToString().Contains("Absolute"));
     211      #endregion
     212
     213      RunAlgorithm(gbt);
     214
     215      Assert.AreEqual(10.551385044666661, ((DoubleValue)gbt.Results["Loss (train)"].Value).Value, 1E-6);
     216      Assert.AreEqual(12.918001745581172, ((DoubleValue)gbt.Results["Loss (test)"].Value).Value, 1E-6);
     217    }
     218
     219    [TestMethod]
     220    [TestCategory("Algorithms.DataAnalysis")]
     221    [TestProperty("Time", "long")]
     222    public void GradientBoostingTestTowerRelativeError() {
     223      var gbt = new GradientBoostedTreesAlgorithm();
     224      var provider = new HeuristicLab.Problems.Instances.DataAnalysis.RegressionRealWorldInstanceProvider();
     225      var instance = provider.GetDataDescriptors().Single(x => x.Name.Contains("Tower"));
     226      var regProblem = new RegressionProblem();
     227      regProblem.Load(provider.LoadData(instance));
     228
     229      #region Algorithm Configuration
     230      gbt.Problem = regProblem;
     231      gbt.Seed = 0;
     232      gbt.SetSeedRandomly = false;
     233      gbt.Iterations = 3000;
     234      gbt.MaxSize = 20;
     235      gbt.Nu = 0.005;
     236      gbt.LossFunctionParameter.Value = gbt.LossFunctionParameter.ValidValues.First(l => l.ToString().Contains("Relative"));
     237      #endregion
     238
     239      RunAlgorithm(gbt);
     240
     241      Assert.AreEqual(0.061954221604374943, ((DoubleValue)gbt.Results["Loss (train)"].Value).Value, 1E-6);
     242      Assert.AreEqual(0.06316303473499961, ((DoubleValue)gbt.Results["Loss (test)"].Value).Value, 1E-6);
     243    }
     244
     245    // same as in SamplesUtil
     246    private void RunAlgorithm(IAlgorithm a) {
     247      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
     248      Exception ex = null;
     249      a.Stopped += (src, e) => { trigger.Set(); };
     250      a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); };
     251      a.Prepare();
     252      a.Start();
     253      trigger.WaitOne();
     254
     255      Assert.AreEqual(ex, null);
     256    }
     257
     258    #region helper
    143259    private void BuildTree(double[,] xy, string[] allVariables, int maxDepth) {
    144260      int nRows = xy.GetLength(0);
     
    161277    private void WriteTree(RegressionTreeModel.TreeNode[] tree, int idx, string partialRule, double offset) {
    162278      var n = tree[idx];
    163       if (n.varName == RegressionTreeModel.TreeNode.NO_VARIABLE) {
    164         Console.WriteLine("{0} -> {1:F}", partialRule, n.val + offset);
     279      if (n.VarName == RegressionTreeModel.TreeNode.NO_VARIABLE) {
     280        Console.WriteLine("{0} -> {1:F}", partialRule, n.Val + offset);
    165281      } else {
    166         WriteTree(tree, n.leftIdx,
     282        WriteTree(tree, n.LeftIdx,
    167283          string.Format(CultureInfo.InvariantCulture, "{0}{1}{2} <= {3:F}",
    168284          partialRule,
    169285          string.IsNullOrEmpty(partialRule) ? "" : " and ",
    170           n.varName,
    171           n.val), offset);
    172         WriteTree(tree, n.rightIdx,
     286          n.VarName,
     287          n.Val), offset);
     288        WriteTree(tree, n.RightIdx,
    173289          string.Format(CultureInfo.InvariantCulture, "{0}{1}{2} >  {3:F}",
    174290          partialRule,
    175291          string.IsNullOrEmpty(partialRule) ? "" : " and ",
    176           n.varName,
    177           n.val), offset);
    178       }
    179     }
     292          n.VarName,
     293          n.Val), offset);
     294      }
     295    }
     296    #endregion
    180297  }
    181298}
Note: See TracChangeset for help on using the changeset viewer.