Source code for machinelens.core.data_classes.results
"""Strongly-typed data structures for diagnostic results.
This module defines the **Data Object Layer** — a hierarchy of
``dataclass`` objects that serve as the strict contract and single source
of truth for a model's diagnostic state.
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import List, Optional
import numpy as np
import pandas as pd
from machinelens.core.data_classes.classification import (
CalibrationCurveData,
ClassificationMetrics,
ClassificationSubsetData,
MisclassificationResult,
PrCurveData,
RocCurveData,
ThresholdAnalysisData,
)
from machinelens.core.data_classes.regression import (
OutlierAnalysisResult,
QQData,
RegressionMetrics,
RegressionSubsetData,
)
from machinelens.core.data_classes.shap import ShapData
# Import specialized components to define DiagnosticResults and keep backward compatibility
from machinelens.core.data_classes.shared import LowessData, SubsetData
# Explicitly export everything for backward compatibility
__all__ = [
"SubsetData",
"LowessData",
"RegressionSubsetData",
"QQData",
"OutlierAnalysisResult",
"RegressionMetrics",
"ClassificationSubsetData",
"RocCurveData",
"PrCurveData",
"MisclassificationResult",
"ClassificationMetrics",
"CalibrationCurveData",
"ThresholdAnalysisData",
"ShapData",
"DiagnosticResults",
]
[docs]
@dataclass
class DiagnosticResults:
"""Complete diagnostic state for a model — single source of truth.
This object is the **strict contract** between the processing layer
(``ModelAnalyzer``) and the visualisation layer
(``DiagnosticPlotter``). Every calculation result has a dedicated,
typed field — no opaque dictionaries.
Attributes
----------
problem_type : str
``"classification"`` or ``"regression"``.
model_name : str
Human-readable name of the estimator class.
algorithm_family : str
Pretty-printed sklearn sub-module family.
feature_names : list of str
Feature column names.
train_data / test_data
Aligned arrays for each subset (type depends on problem).
train_metrics / test_metrics
Scalar evaluation metrics for each subset.
Regression-specific fields
``*_qq``, ``*_linearity_lowess``, ``*_scale_loc_lowess``,
``leverage``, ``leverage_lowess``, ``cooks_distance``,
``outlier_analysis``.
Classification-specific fields
``*_confusion_matrix``, ``*_roc_curves``, ``*_pr_curves``,
``*_misclassification``.
"""
# ---- identity ----
problem_type: str
model_name: str
algorithm_family: str
feature_names: List[str] = field(default_factory=list)
# ---- subset data ----
train_data: Optional[SubsetData] = None
test_data: Optional[SubsetData] = None
# ---- regression metrics ----
train_metrics: Optional[RegressionMetrics] = None
test_metrics: Optional[RegressionMetrics] = None
# ---- classification metrics ----
train_clf_metrics: Optional[ClassificationMetrics] = None
test_clf_metrics: Optional[ClassificationMetrics] = None
# ---- regression-specific ----
train_qq: Optional[QQData] = None
test_qq: Optional[QQData] = None
train_linearity_lowess: Optional[LowessData] = None
test_linearity_lowess: Optional[LowessData] = None
train_scale_loc_lowess: Optional[LowessData] = None
test_scale_loc_lowess: Optional[LowessData] = None
leverage: Optional[np.ndarray] = None
leverage_lowess: Optional[LowessData] = None
cooks_distance: Optional[np.ndarray] = None
outlier_analysis: Optional[OutlierAnalysisResult] = None
# ---- classification-specific ----
train_confusion_matrix: Optional[pd.DataFrame] = None
test_confusion_matrix: Optional[pd.DataFrame] = None
train_roc_curves: Optional[List[RocCurveData]] = None
test_roc_curves: Optional[List[RocCurveData]] = None
train_pr_curves: Optional[List[PrCurveData]] = None
test_pr_curves: Optional[List[PrCurveData]] = None
train_calibration_curves: Optional[List[CalibrationCurveData]] = None
test_calibration_curves: Optional[List[CalibrationCurveData]] = None
train_threshold_analysis: Optional[List[ThresholdAnalysisData]] = None
test_threshold_analysis: Optional[List[ThresholdAnalysisData]] = None
train_misclassification: Optional[MisclassificationResult] = None
test_misclassification: Optional[MisclassificationResult] = None
# ---- SHAP explanations ----
train_shap: Optional[ShapData] = None
test_shap: Optional[ShapData] = None