package org.neuroph.eval;

import java.util.ArrayList;
import java.util.List;
import org.neuroph.eval.classification.ClassificationMetrics;

/**
 *
 * @author zoran
 */
public class CrossValidationResult {
    List results;  
    ClassificationMetrics.Stats average; 
    int numberOfFolds;
    int numberOfInstances;
    
    public CrossValidationResult() {        
        results = new ArrayList<>();
    }
    
    public void addEvaluationResult(EvaluationResult result) {
        results.add(result);
    }
    
    // add statistics here? 
    
    // calculate avg, max, min, variation, std,  for 
     
    // should we also calculate stats for each class???           
         
    /**
     * Calculate average over all classes and datasets
     */
    public void calculateStatistics() {
        
        average = new ClassificationMetrics.Stats();
       // ClassificationMetrics.Stats max = new ClassificationMetrics.Stats();

        double count = 0;

        List classLabels = new ArrayList<>();
        // avg max min variation std
        for (EvaluationResult er : results) {
            ClassificationMetrics[] ccm = er.getClassificationMetricses();
            for (ClassificationMetrics cm : ccm) {
                average.accuracy += cm.getAccuracy();
                average.precision += cm.getPrecision();
                average.recall += cm.getRecall();
                average.fScore += cm.getFMeasure();
                average.mserror += er.getMeanSquareError();
                average.correlationCoefficient += cm.getMatthewsCorrelationCoefficient();

                if(!classLabels.contains(cm.getClassLabel()))
                    classLabels.add(cm.getClassLabel());
            }
            count++;
        }
        count = count * classLabels.size(); // * classes count
        average.accuracy = average.accuracy / count;
        average.precision = average.precision / count;
        average.recall = average.recall / count;
        average.fScore = average.fScore / count;
        average.mserror = average.mserror / count;
        average.correlationCoefficient = average.correlationCoefficient / count;
                                
    }       
    
    public ClassificationMetrics.Stats getAverages() {
        return average;
    } 

    @Override
    public String toString() {
        return "CrossValidationResult{" + "results=" + results + ", average=" + average + '}';
    }
    
    public void printResult() {
        System.out.println("=== Cross validation result ===");
        System.out.println("Instances: " + numberOfInstances);
        System.out.println("Number of folds: " + numberOfFolds);
        System.out.println("\n");
        System.out.println("=== Summary ===");
        System.out.println("Mean squared error: " + average.mserror);
        System.out.println("Accuracy: " + average.accuracy);
        System.out.println("Precision: " + average.precision);
        System.out.println("Recall: " +average.recall);
        System.out.println("FScore: " + average.fScore);
        System.out.println("Correlation coefficient: " + average.correlationCoefficient);        
    }   
    
    
    
    
}

 

Ads help maintain this website.