File size: 2,626 Bytes
9c1c0ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from __future__ import annotations

from enum import StrEnum
from typing import Any

from pydantic import BaseModel, Field


class TaskType(StrEnum):
    classification = "classification"
    regression = "regression"


class Severity(StrEnum):
    info = "info"
    warning = "warning"
    critical = "critical"


class Evidence(BaseModel):
    evidence_id: str
    claim: str
    metric: str
    value: float | int | str
    source: str
    method: str


class QualityIssue(BaseModel):
    code: str
    severity: Severity
    column: str | None = None
    message: str
    evidence_ids: list[str] = Field(default_factory=list)


class DatasetProfile(BaseModel):
    rows: int
    columns: int
    numeric_columns: list[str]
    categorical_columns: list[str]
    datetime_columns: list[str]
    duplicate_rows: int
    missing_cells: int
    missing_rate: float
    memory_mb: float
    target: str
    task_type: TaskType
    target_cardinality: int


class AnalysisPlan(BaseModel):
    objective: str
    target: str
    task_type: TaskType
    primary_metric: str
    validation_strategy: str
    candidate_models: list[str]
    risk_controls: list[str]


class ModelResult(BaseModel):
    name: str
    primary_metric: str
    primary_score: float
    metrics: dict[str, float]
    cross_validation_mean: float | None = None
    cross_validation_std: float | None = None
    training_seconds: float
    selection_score: float | None = None
    final_test_score: float | None = None
    final_test_metrics: dict[str, float] = Field(default_factory=dict)


class ModelFailure(BaseModel):
    name: str
    stage: str
    exception_category: str
    sanitized_error: str
    training_seconds: float
    expected: bool = False


class CriticDecision(BaseModel):
    approved: bool
    score: float
    threshold: float
    reasons: list[str]
    retry_number: int


class ExplainabilityResult(BaseModel):
    method: str
    feature_importance: dict[str, float]
    caveats: list[str]


class RunSummary(BaseModel):
    run_id: str
    status: str
    dataset_name: str
    profile: DatasetProfile
    plan: AnalysisPlan
    quality_issues: list[QualityIssue]
    evidence: list[Evidence]
    model_results: list[ModelResult]
    model_failures: list[ModelFailure] = Field(default_factory=list)
    best_model: str
    critic: CriticDecision
    explainability: ExplainabilityResult
    executive_summary: list[str]
    recommendations: list[str]
    artifacts: dict[str, str]
    trace: list[dict[str, Any]]