Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/27/16 16:30:54 (8 years ago)
Author:
gkronber
Message:

changed interpreter and grammar to smooth ch and ins uptake using a compartement model

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Problems.GeneticProgramming.BloodGlucosePrediction/Problem.cs

    r13865 r14310  
    2121
    2222using System;
     23using System.Collections;
    2324using System.Collections.Generic;
    2425using System.Linq;
     26using HeuristicLab.Analysis;
    2527using HeuristicLab.Common;
    2628using HeuristicLab.Core;
     
    6264
    6365    public override bool Maximization {
    64       get { return false; }
     66      get { return true; }
    6567    }
    6668
     
    98100      var rows = problemData.TrainingIndices.ToArray();
    99101      var target = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
    100       var predicted = Interpreter.Apply(tree.Root.GetSubtree(0).GetSubtree(0), problemData.Dataset, rows); 
    101 
     102      var predicted0 = Interpreter.Apply(tree.Root.GetSubtree(0).GetSubtree(0).GetSubtree(0), problemData.Dataset, rows);
     103      var predicted1 = Interpreter.Apply(tree.Root.GetSubtree(0).GetSubtree(0).GetSubtree(1), problemData.Dataset, rows);
     104      var predicted2 = Interpreter.Apply(tree.Root.GetSubtree(0).GetSubtree(0).GetSubtree(2), problemData.Dataset, rows);
     105
     106      var pred0_rsq = Rsq(predicted0, target);
     107      var pred1_rsq = Rsq(predicted1, target);
     108      var pred2_rsq = Rsq(predicted2, target);
     109      return pred0_rsq + pred1_rsq + pred2_rsq;
     110    }
     111
     112    private double Rsq(IEnumerable<double> predicted, IEnumerable<double> target) {
    102113      // only take predictions for which the target is not NaN
    103114      var selectedTuples = target.Zip(predicted, Tuple.Create).Where(t => !double.IsNaN(t.Item1)).ToArray();
     
    106117
    107118      OnlineCalculatorError errorState;
    108       var mse = OnlineMeanSquaredErrorCalculator.Calculate(target, predicted, out errorState);
    109       if (errorState != OnlineCalculatorError.None) mse = 1E6;
    110       return mse;
    111     }
    112 
    113     public override void Analyze(ISymbolicExpressionTree[] trees, double[] qualities, ResultCollection results, IRandom random) {
     119      var r = OnlinePearsonsRCalculator.Calculate(target, predicted, out errorState);
     120      if (errorState != OnlineCalculatorError.None) r = 0;
     121      return r * r;
     122    }
     123
     124    public override void Analyze(ISymbolicExpressionTree[] trees, double[] qualities, ResultCollection results,
     125      IRandom random) {
    114126      base.Analyze(trees, qualities, results, random);
    115127
    116128      if (!results.ContainsKey("Solution")) {
    117129        results.Add(new Result("Solution", typeof(IRegressionSolution)));
     130      }
     131      if (!results.ContainsKey("Terms")) {
     132        results.Add(new Result("Terms", typeof(DataTable)));
    118133      }
    119134
     
    121136      var bestQuality = qualities.First();
    122137      for (int i = 1; i < trees.Length; i++) {
    123         if (qualities[i] < bestQuality) {
     138        if (qualities[i] > bestQuality) {
    124139          bestQuality = qualities[i];
    125140          bestTree = trees[i];
     
    127142      }
    128143
     144
    129145      var clonedProblemData = (IRegressionProblemData)ProblemData.Clone();
    130       var model = new Model(clonedProblemData, (ISymbolicExpressionTree)bestTree.Clone());
    131       results["Solution"].Value = model.CreateRegressionSolution(clonedProblemData);
     146      var rows = clonedProblemData.TrainingIndices.ToArray();
     147      var target = clonedProblemData.Dataset.GetDoubleValues(clonedProblemData.TargetVariable, rows).ToArray();
     148      var predicted0 =
     149        Interpreter.Apply(bestTree.Root.GetSubtree(0).GetSubtree(0).GetSubtree(0), clonedProblemData.Dataset, rows)
     150          .ToArray();
     151      var predicted1 =
     152        Interpreter.Apply(bestTree.Root.GetSubtree(0).GetSubtree(0).GetSubtree(1), clonedProblemData.Dataset, rows)
     153          .ToArray();
     154      var predicted2 =
     155        Interpreter.Apply(bestTree.Root.GetSubtree(0).GetSubtree(0).GetSubtree(2), clonedProblemData.Dataset, rows)
     156          .ToArray();
     157
     158      var termsTable = new HeuristicLab.Analysis.DataTable("Terms");
     159      var r0 = new DataRow("GlucTerm", "GlucTerm", predicted0);
     160      var r1 = new DataRow("InsTerm", "InsTerm", predicted1);
     161      r1.VisualProperties.SecondYAxis = true;
     162      var r2 = new DataRow("ChTerm", "ChTerm", predicted2);
     163      r2.VisualProperties.SecondYAxis = true;
     164      var r3 = new DataRow("Target", "Target", target);
     165      termsTable.Rows.Add(r0);
     166      termsTable.Rows.Add(r1);
     167      termsTable.Rows.Add(r2);
     168      termsTable.Rows.Add(r3);
     169      results["Terms"].Value = termsTable;
     170
     171
     172      var filteredPredicted0 = rows.Where(r => !double.IsNaN(target[r])).Select(r => predicted0[r]).ToArray();
     173      var filteredPredicted1 = rows.Where(r => !double.IsNaN(target[r])).Select(r => predicted1[r]).ToArray();
     174      var filteredPredicted2 = rows.Where(r => !double.IsNaN(target[r])).Select(r => predicted2[r]).ToArray();
     175      var filteredTarget = target.Where(t => !double.IsNaN(t)).ToArray();
     176
     177
     178      var ds = new ModifiableDataset(new string[] { "pred0", "pred1", "pred2", "target" },
     179        new List<IList>
     180        {
     181          filteredPredicted0.ToList(),
     182          filteredPredicted1.ToList(),
     183          filteredPredicted2.ToList(),
     184          filteredTarget.ToList()
     185        });
     186      var lrProbData = new RegressionProblemData(ds, new string[] { "pred0", "pred1", "pred2" }, "target");
     187      lrProbData.TrainingPartition.Start = clonedProblemData.TrainingPartition.Start;
     188      lrProbData.TrainingPartition.End = clonedProblemData.TrainingPartition.End;
     189      lrProbData.TestPartition.Start = clonedProblemData.TestPartition.Start;
     190      lrProbData.TestPartition.End = clonedProblemData.TestPartition.End;
     191
     192      try {
     193        double rmsError, cvRmsError;
     194        var lrSolution = HeuristicLab.Algorithms.DataAnalysis.LinearRegression.CreateLinearRegressionSolution(
     195          lrProbData, out rmsError, out cvRmsError);
     196        results["Solution"].Value = lrSolution;
     197      } catch (Exception) {
     198        // ignore
     199      }
    132200    }
    133201
Note: See TracChangeset for help on using the changeset viewer.