Changeset 11763


Ignore:
Timestamp:
01/15/15 11:37:49 (3 years ago)
Author:
mkommend
Message:

#2278: Merged changes in HL.Problems.DataAnalysis into the trunk.

Location:
trunk/sources/HeuristicLab.Problems.DataAnalysis
Files:
5 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis

  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj

    r11623 r11763  
    124124    </Compile>
    125125    <Compile Include="Implementation\Classification\ClassificationEnsembleSolution.cs" />
     126    <Compile Include="Implementation\Classification\ClassificationPerformanceMeasures.cs" />
    126127    <Compile Include="Implementation\Classification\ClassificationProblemData.cs" />
    127128    <Compile Include="Implementation\Classification\ClassificationProblem.cs" />
     
    178179    <Compile Include="Interfaces\TimeSeriesPrognosis\ITimeSeriesPrognosisSolution.cs" />
    179180    <Compile Include="OnlineCalculators\AutoCorrelationCalculator.cs" />
     181    <Compile Include="OnlineCalculators\ClassificationPerformanceMeasuresCalculator.cs" />
    180182    <Compile Include="OnlineCalculators\DependencyCalculator\HoeffdingsDependenceCalculator.cs" />
    181183    <Compile Include="OnlineCalculators\DependencyCalculator\PearsonsRDependenceCalculator.cs" />
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs

    r11171 r11763  
    3636    protected const string ClassNamesParameterName = "ClassNames";
    3737    protected const string ClassificationPenaltiesParameterName = "ClassificationPenalties";
     38    protected const string PositiveClassNameParameterName = "PositiveClass";
    3839    protected const int MaximumNumberOfClasses = 100;
    3940    protected const int InspectedRowsToDetermineTargets = 2000;
     
    213214      get { return (IFixedValueParameter<StringMatrix>)Parameters[ClassNamesParameterName]; }
    214215    }
     216    public IConstrainedValueParameter<StringValue> PositiveClassNameParameter {
     217      get { return (IConstrainedValueParameter<StringValue>)Parameters[PositiveClassNameParameterName]; }
     218    }
    215219    public IFixedValueParameter<DoubleMatrix> ClassificationPenaltiesParameter {
    216220      get { return (IFixedValueParameter<DoubleMatrix>)Parameters[ClassificationPenaltiesParameterName]; }
     
    262266      get { return ClassNamesCache; }
    263267    }
     268
     269    public string PositiveClassName {
     270      get { return PositiveClassNameParameter.Value.Value; }
     271      set {
     272        var matchingValue = PositiveClassNameParameter.ValidValues.SingleOrDefault(x => x.Value == value);
     273        if (matchingValue == null) throw new ArgumentException(string.Format("{0} cannot be set as positive class.", value));
     274        PositiveClassNameParameter.Value = matchingValue;
     275      }
     276    }
    264277    #endregion
    265278
     
    270283    private void AfterDeserialization() {
    271284      RegisterParameterEvents();
     285      // BackwardsCompatibility3.4
     286      #region Backwards compatible code, remove with 3.5
     287      if (!Parameters.ContainsKey(PositiveClassNameParameterName)) {
     288        var validValues = new ItemSet<StringValue>(ClassNames.Select(s => new StringValue(s).AsReadOnly()));
     289        Parameters.Add(new ConstrainedValueParameter<StringValue>(PositiveClassNameParameterName,
     290          "The positive class which is used for quality measure calculation (e.g., specifity, sensitivity,...)", validValues, validValues.First()));
     291      }
     292      #endregion
     293
    272294    }
    273295
     
    307329      Parameters.Add(new ConstrainedValueParameter<StringValue>(TargetVariableParameterName, new ItemSet<StringValue>(validTargetVariableValues), target));
    308330      Parameters.Add(new FixedValueParameter<StringMatrix>(ClassNamesParameterName, ""));
     331      Parameters.Add(new ConstrainedValueParameter<StringValue>(PositiveClassNameParameterName, "The positive class which is used for quality measure calculation (e.g., specifity, sensitivity,...)"));
    309332      Parameters.Add(new FixedValueParameter<DoubleMatrix>(ClassificationPenaltiesParameterName, ""));
    310333
     
    340363      ClassNamesParameter.Value.RowNames = ClassValues.Select(s => "ClassValue: " + s);
    341364
     365      PositiveClassNameParameter.ValidValues.Clear();
     366      foreach (var className in ClassNames) {
     367        PositiveClassNameParameter.ValidValues.Add(new StringValue(className).AsReadOnly());
     368      }
     369
    342370      ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Rows = Classes;
    343371      ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Columns = Classes;
     
    411439    }
    412440    private void Parameter_ValueChanged(object sender, EventArgs e) {
     441      var oldPositiveClass = PositiveClassName;
     442      var oldClassNames = classNamesCache;
     443      var index = oldClassNames.IndexOf(oldPositiveClass);
     444
    413445      classNamesCache = null;
    414446      ClassificationPenaltiesParameter.Value.RowNames = ClassNames.Select(name => "Actual " + name);
    415447      ClassificationPenaltiesParameter.Value.ColumnNames = ClassNames.Select(name => "Estimated " + name);
     448
     449      PositiveClassNameParameter.ValidValues.Clear();
     450      foreach (var className in ClassNames) {
     451        PositiveClassNameParameter.ValidValues.Add(new StringValue(className).AsReadOnly());
     452      }
     453      PositiveClassNameParameter.Value = PositiveClassNameParameter.ValidValues.ElementAt(index);
     454
    416455      OnChanged();
    417456    }
     
    435474      if (!newClassValues.SequenceEqual(ClassValues)) {
    436475        errorMessage = errorMessage + string.Format("The class values differ in the provided classification problem data.");
    437         return false;
     476        returnValue = false;
     477      }
     478
     479      var newPositivieClassName = classificationProblemData.PositiveClassName;
     480      if (newPositivieClassName != PositiveClassName) {
     481        errorMessage = errorMessage + string.Format("The positive class differs in the provided classification problem data.");
     482        returnValue = false;
    438483      }
    439484
     
    452497        ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i);
    453498
     499      PositiveClassName = classificationProblemData.PositiveClassName;
     500
    454501      for (int i = 0; i < Classes; i++) {
    455502        for (int j = 0; j < Classes; j++) {
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationSolutionBase.cs

    r11171 r11763  
    3434    private const string TrainingNormalizedGiniCoefficientResultName = "Normalized Gini Coefficient (training)";
    3535    private const string TestNormalizedGiniCoefficientResultName = "Normalized Gini Coefficient (test)";
     36    private const string ClassificationPerformanceMeasuresResultName = "Classification Performance Measures";
    3637
    3738    public new IClassificationModel Model {
     
    6263      protected set { ((DoubleValue)this[TestNormalizedGiniCoefficientResultName].Value).Value = value; }
    6364    }
     65    public ClassificationPerformanceMeasuresResultCollection ClassificationPerformanceMeasures {
     66      get { return ((ClassificationPerformanceMeasuresResultCollection)this[ClassificationPerformanceMeasuresResultName].Value); }
     67      protected set { (this[ClassificationPerformanceMeasuresResultName].Value) = value; }
     68    }
    6469    #endregion
    6570
     
    7580      Add(new Result(TrainingNormalizedGiniCoefficientResultName, "Normalized Gini coefficient of the model on the training partition.", new DoubleValue()));
    7681      Add(new Result(TestNormalizedGiniCoefficientResultName, "Normalized Gini coefficient of the model on the test partition.", new DoubleValue()));
     82      Add(new Result(ClassificationPerformanceMeasuresResultName, @"Classification performance measures.\n
     83                              In a multiclass classification all misclassifications of the negative class will be treated as true negatives except on positive class estimations.",
     84                            new ClassificationPerformanceMeasuresResultCollection()));
    7785    }
    7886
     
    8391      if (!this.ContainsKey(TestNormalizedGiniCoefficientResultName))
    8492        Add(new Result(TestNormalizedGiniCoefficientResultName, "Normalized Gini coefficient of the model on the test partition.", new DoubleValue()));
     93      if (!this.ContainsKey(ClassificationPerformanceMeasuresResultName)) {
     94        Add(new Result(ClassificationPerformanceMeasuresResultName, @"Classification performance measures.\n
     95                              In a multiclass classification all misclassifications of the negative class will be treated as true negatives except on positive class estimations.",
     96                              new ClassificationPerformanceMeasuresResultCollection()));
     97        RecalculateResults();
     98      }
    8599    }
    86100
     
    88102      double[] estimatedTrainingClassValues = EstimatedTrainingClassValues.ToArray(); // cache values
    89103      double[] originalTrainingClassValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices).ToArray();
     104
    90105      double[] estimatedTestClassValues = EstimatedTestClassValues.ToArray(); // cache values
    91106      double[] originalTestClassValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TestIndices).ToArray();
     107
     108      var positiveClassName = ProblemData.PositiveClassName;
     109      double positiveClassValue = ProblemData.GetClassValue(positiveClassName);
     110      ClassificationPerformanceMeasuresCalculator trainingPerformanceCalculator = new ClassificationPerformanceMeasuresCalculator(positiveClassName, positiveClassValue);
     111      ClassificationPerformanceMeasuresCalculator testPerformanceCalculator = new ClassificationPerformanceMeasuresCalculator(positiveClassName, positiveClassValue);
    92112
    93113      OnlineCalculatorError errorState;
     
    107127      TrainingNormalizedGiniCoefficient = trainingNormalizedGini;
    108128      TestNormalizedGiniCoefficient = testNormalizedGini;
     129
     130      trainingPerformanceCalculator.Calculate(originalTrainingClassValues, estimatedTrainingClassValues);
     131      if (trainingPerformanceCalculator.ErrorState == OnlineCalculatorError.None)
     132        ClassificationPerformanceMeasures.SetTrainingResults(trainingPerformanceCalculator);
     133
     134      testPerformanceCalculator.Calculate(originalTestClassValues, estimatedTestClassValues);
     135      if (testPerformanceCalculator.ErrorState == OnlineCalculatorError.None)
     136        ClassificationPerformanceMeasures.SetTestResults(testPerformanceCalculator);
    109137    }
    110138
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.4/Interfaces/Classification/IClassificationProblemData.cs

    r11171 r11763  
    2626
    2727    IEnumerable<string> ClassNames { get; }
     28    string PositiveClassName { get; set; }
    2829    IEnumerable<double> ClassValues { get; }
    2930    int Classes { get; }
Note: See TracChangeset for help on using the changeset viewer.