Changeset 13083 for branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
- Timestamp:
- 10/29/15 18:33:51 (8 years ago)
- Location:
- branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis
- Property svn:mergeinfo changed
-
branches/ClassificationModelComparison/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
r10556 r13083 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 3Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 36 36 protected const string ClassNamesParameterName = "ClassNames"; 37 37 protected const string ClassificationPenaltiesParameterName = "ClassificationPenalties"; 38 protected const string PositiveClassParameterName = "PositiveClass"; 38 39 protected const int MaximumNumberOfClasses = 100; 39 40 protected const int InspectedRowsToDetermineTargets = 2000; … … 213 214 get { return (IFixedValueParameter<StringMatrix>)Parameters[ClassNamesParameterName]; } 214 215 } 216 public IConstrainedValueParameter<StringValue> PositiveClassParameter { 217 get { return (IConstrainedValueParameter<StringValue>)Parameters[PositiveClassParameterName]; } 218 } 215 219 public IFixedValueParameter<DoubleMatrix> ClassificationPenaltiesParameter { 216 220 get { return (IFixedValueParameter<DoubleMatrix>)Parameters[ClassificationPenaltiesParameterName]; } … … 262 266 get { return ClassNamesCache; } 263 267 } 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 } 264 277 #endregion 265 278 … … 270 283 private void AfterDeserialization() { 271 284 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 272 294 } 273 295 … … 290 312 TestPartition.End = classificationProblemData.TestPartition.End; 291 313 314 PositiveClass = classificationProblemData.PositiveClass; 315 292 316 for (int i = 0; i < classificationProblemData.ClassNames.Count(); i++) 293 317 ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i); … … 300 324 } 301 325 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>()) { 304 328 var validTargetVariableValues = CheckVariablesForPossibleTargetVariables(dataset).Select(x => new StringValue(x).AsReadOnly()).ToList(); 305 329 var target = validTargetVariableValues.Where(x => x.Value == targetVariable).DefaultIfEmpty(validTargetVariableValues.First()).First(); … … 307 331 Parameters.Add(new ConstrainedValueParameter<StringValue>(TargetVariableParameterName, new ItemSet<StringValue>(validTargetVariableValues), target)); 308 332 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,...)")); 309 334 Parameters.Add(new FixedValueParameter<DoubleMatrix>(ClassificationPenaltiesParameterName, "")); 310 335 … … 313 338 } 314 339 315 public static IEnumerable<string> CheckVariablesForPossibleTargetVariables( Dataset dataset) {340 public static IEnumerable<string> CheckVariablesForPossibleTargetVariables(IDataset dataset) { 316 341 int maxSamples = Math.Min(InspectedRowsToDetermineTargets, dataset.Rows); 317 342 var validTargetVariables = (from v in dataset.DoubleVariables … … 339 364 ClassNamesParameter.Value.ColumnNames = new List<string>() { "ClassNames" }; 340 365 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 } 341 371 342 372 ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Rows = Classes; … … 411 441 } 412 442 private void Parameter_ValueChanged(object sender, EventArgs e) { 443 var oldPositiveClass = PositiveClass; 444 var oldClassNames = classNamesCache; 445 var index = oldClassNames.IndexOf(oldPositiveClass); 446 413 447 classNamesCache = null; 414 448 ClassificationPenaltiesParameter.Value.RowNames = ClassNames.Select(name => "Actual " + name); 415 449 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 416 457 OnChanged(); 417 458 } … … 435 476 if (!newClassValues.SequenceEqual(ClassValues)) { 436 477 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; 438 485 } 439 486 … … 452 499 ClassNamesParameter.Value[i, 0] = classificationProblemData.ClassNames.ElementAt(i); 453 500 501 PositiveClass = classificationProblemData.PositiveClass; 502 454 503 for (int i = 0; i < Classes; i++) { 455 504 for (int j = 0; j < Classes; j++) {
Note: See TracChangeset
for help on using the changeset viewer.