Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/29/15 18:33:51 (8 years ago)
Author:
gkronber
Message:

#1998: merged changesets r10551:13081 (only on HeuristicLab.Problems.DataAnalysis) from trunk to branch

Location:
branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis

  • branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs

    r10556 r13083  
    11#region License Information
    22/* HeuristicLab
    3  * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44 *
    55 * This file is part of HeuristicLab.
     
    3636    protected const string ClassNamesParameterName = "ClassNames";
    3737    protected const string ClassificationPenaltiesParameterName = "ClassificationPenalties";
     38    protected const string PositiveClassParameterName = "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> PositiveClassParameter {
     217      get { return (IConstrainedValueParameter<StringValue>)Parameters[PositiveClassParameterName]; }
     218    }
    215219    public IFixedValueParameter<DoubleMatrix> ClassificationPenaltiesParameter {
    216220      get { return (IFixedValueParameter<DoubleMatrix>)Parameters[ClassificationPenaltiesParameterName]; }
     
    262266      get { return ClassNamesCache; }
    263267    }
     268
     269    public string PositiveClass {
     270      get { return PositiveClassParameter.Value.Value; }
     271      set {
     272        var matchingValue = PositiveClassParameter.ValidValues.SingleOrDefault(x => x.Value == value);
     273        if (matchingValue == null) throw new ArgumentException(string.Format("{0} cannot be set as positive class.", value));
     274        PositiveClassParameter.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(PositiveClassParameterName)) {
     288        var validValues = new ItemSet<StringValue>(ClassNames.Select(s => new StringValue(s).AsReadOnly()));
     289        Parameters.Add(new ConstrainedValueParameter<StringValue>(PositiveClassParameterName,
     290          "The positive class which is used for quality measure calculation (e.g., specifity, sensitivity,...)", validValues, validValues.First()));
     291      }
     292      #endregion
     293
    272294    }
    273295
     
    290312      TestPartition.End = classificationProblemData.TestPartition.End;
    291313
     314      PositiveClass = classificationProblemData.PositiveClass;
     315
    292316      for (int i = 0; i < classificationProblemData.ClassNames.Count(); i++)
    293317        ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i);
     
    300324    }
    301325
    302     public ClassificationProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable)
    303       : base(dataset, allowedInputVariables) {
     326    public ClassificationProblemData(IDataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable, IEnumerable<ITransformation> transformations = null)
     327      : base(dataset, allowedInputVariables, transformations ?? Enumerable.Empty<ITransformation>()) {
    304328      var validTargetVariableValues = CheckVariablesForPossibleTargetVariables(dataset).Select(x => new StringValue(x).AsReadOnly()).ToList();
    305329      var target = validTargetVariableValues.Where(x => x.Value == targetVariable).DefaultIfEmpty(validTargetVariableValues.First()).First();
     
    307331      Parameters.Add(new ConstrainedValueParameter<StringValue>(TargetVariableParameterName, new ItemSet<StringValue>(validTargetVariableValues), target));
    308332      Parameters.Add(new FixedValueParameter<StringMatrix>(ClassNamesParameterName, ""));
     333      Parameters.Add(new ConstrainedValueParameter<StringValue>(PositiveClassParameterName, "The positive class which is used for quality measure calculation (e.g., specifity, sensitivity,...)"));
    309334      Parameters.Add(new FixedValueParameter<DoubleMatrix>(ClassificationPenaltiesParameterName, ""));
    310335
     
    313338    }
    314339
    315     public static IEnumerable<string> CheckVariablesForPossibleTargetVariables(Dataset dataset) {
     340    public static IEnumerable<string> CheckVariablesForPossibleTargetVariables(IDataset dataset) {
    316341      int maxSamples = Math.Min(InspectedRowsToDetermineTargets, dataset.Rows);
    317342      var validTargetVariables = (from v in dataset.DoubleVariables
     
    339364      ClassNamesParameter.Value.ColumnNames = new List<string>() { "ClassNames" };
    340365      ClassNamesParameter.Value.RowNames = ClassValues.Select(s => "ClassValue: " + s);
     366
     367      PositiveClassParameter.ValidValues.Clear();
     368      foreach (var className in ClassNames) {
     369        PositiveClassParameter.ValidValues.Add(new StringValue(className).AsReadOnly());
     370      }
    341371
    342372      ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Rows = Classes;
     
    411441    }
    412442    private void Parameter_ValueChanged(object sender, EventArgs e) {
     443      var oldPositiveClass = PositiveClass;
     444      var oldClassNames = classNamesCache;
     445      var index = oldClassNames.IndexOf(oldPositiveClass);
     446
    413447      classNamesCache = null;
    414448      ClassificationPenaltiesParameter.Value.RowNames = ClassNames.Select(name => "Actual " + name);
    415449      ClassificationPenaltiesParameter.Value.ColumnNames = ClassNames.Select(name => "Estimated " + name);
     450
     451      PositiveClassParameter.ValidValues.Clear();
     452      foreach (var className in ClassNames) {
     453        PositiveClassParameter.ValidValues.Add(new StringValue(className).AsReadOnly());
     454      }
     455      PositiveClassParameter.Value = PositiveClassParameter.ValidValues.ElementAt(index);
     456
    416457      OnChanged();
    417458    }
     
    435476      if (!newClassValues.SequenceEqual(ClassValues)) {
    436477        errorMessage = errorMessage + string.Format("The class values differ in the provided classification problem data.");
    437         return false;
     478        returnValue = false;
     479      }
     480
     481      var newPositivieClassName = classificationProblemData.PositiveClass;
     482      if (newPositivieClassName != PositiveClass) {
     483        errorMessage = errorMessage + string.Format("The positive class differs in the provided classification problem data.");
     484        returnValue = false;
    438485      }
    439486
     
    452499        ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i);
    453500
     501      PositiveClass = classificationProblemData.PositiveClass;
     502
    454503      for (int i = 0; i < Classes; i++) {
    455504        for (int j = 0; j < Classes; j++) {
Note: See TracChangeset for help on using the changeset viewer.