ModelPerformanceCalculator.java

package com.kapil.verbametrics.ml.calculators;

import com.kapil.verbametrics.ml.config.MLModelProperties;
import com.kapil.verbametrics.ml.domain.ModelEvaluationResult;
import com.kapil.verbametrics.ml.domain.ModelTrainingResult;
import com.kapil.verbametrics.ml.utils.MetricsCalculationUtils;
import com.kapil.verbametrics.util.VerbaMetricsConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * Calculator for evaluating machine learning model performance metrics.
 * Handles metrics like accuracy, precision, recall, F1 score, and overall quality score.
 *
 * @author Kapil Garg
 */
@Component
public class ModelPerformanceCalculator {

    private final MLModelProperties properties;

    @Autowired
    public ModelPerformanceCalculator(MLModelProperties properties) {
        this.properties = properties;
    }

    /**
     * Calculates performance metrics from training result.
     *
     * @param trainingResult the training result
     * @return performance metrics map
     */
    public Map<String, Object> calculatePerformanceMetrics(ModelTrainingResult trainingResult) {
        Map<String, Object> metrics = new HashMap<>();
        metrics.put("accuracy", trainingResult.accuracy());
        metrics.put("precision", trainingResult.precision());
        metrics.put("recall", trainingResult.recall());
        metrics.put("f1Score", trainingResult.f1Score());
        metrics.put("qualityScore", MetricsCalculationUtils.calculateQualityScore(
                trainingResult.accuracy(), trainingResult.precision(),
                trainingResult.recall(), trainingResult.f1Score()));
        metrics.put("performanceLevel", calculatePerformanceLevel(
                MetricsCalculationUtils.calculateQualityScore(trainingResult.accuracy(), trainingResult.precision(),
                        trainingResult.recall(), trainingResult.f1Score())));
        metrics.put("trainingTimeMs", trainingResult.trainingTimeMs());
        metrics.put("trainingDataSize", trainingResult.trainingDataSize());
        return metrics;
    }

    /**
     * Calculates performance metrics from evaluation result.
     *
     * @param evaluationResult the evaluation result
     * @return performance metrics map
     */
    public Map<String, Object> calculatePerformanceMetrics(ModelEvaluationResult evaluationResult) {
        Map<String, Object> metrics = new HashMap<>();
        metrics.put("accuracy", evaluationResult.accuracy());
        metrics.put("precision", evaluationResult.precision());
        metrics.put("recall", evaluationResult.recall());
        metrics.put("f1Score", evaluationResult.f1Score());
        metrics.put("qualityScore", MetricsCalculationUtils.calculateQualityScore(
                evaluationResult.accuracy(), evaluationResult.precision(),
                evaluationResult.recall(), evaluationResult.f1Score()));
        metrics.put("performanceLevel", calculatePerformanceLevel(
                MetricsCalculationUtils.calculateQualityScore(evaluationResult.accuracy(), evaluationResult.precision(),
                        evaluationResult.recall(), evaluationResult.f1Score())));
        metrics.put("evaluationTimeMs", evaluationResult.evaluationTimeMs());
        metrics.put("testDataSize", evaluationResult.testDataSize());
        return metrics;
    }


    /**
     * Calculates model performance level based on metrics.
     *
     * @param qualityScore the quality score
     * @return performance level string
     */
    public String calculatePerformanceLevel(double qualityScore) {
        Map<String, Double> thresholds = properties.getPerformanceThresholds();
        double excellent = thresholds.getOrDefault("excellent", 0.9);
        double good = thresholds.getOrDefault("good", 0.8);
        double fair = thresholds.getOrDefault("fair", 0.7);
        double poor = thresholds.getOrDefault("poor", 0.6);
        if (qualityScore >= excellent) {
            return VerbaMetricsConstants.K_EXCELLENT;
        }
        if (qualityScore >= good) {
            return VerbaMetricsConstants.K_GOOD;
        }
        if (qualityScore >= fair) {
            return VerbaMetricsConstants.K_FAIR;
        }
        if (qualityScore >= poor) {
            return VerbaMetricsConstants.K_POOR;
        }
        return VerbaMetricsConstants.K_VERY_POOR;
    }

}