ai-critic 0.2.2__py3-none-any.whl → 0.2.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ai_critic/critic.py +63 -22
- ai_critic/evaluators/__init__.py +11 -4
- ai_critic/evaluators/performance.py +40 -11
- ai_critic/evaluators/robustness.py +7 -2
- ai_critic/evaluators/validation.py +41 -0
- ai_critic-0.2.4.dist-info/METADATA +76 -0
- ai_critic-0.2.4.dist-info/RECORD +13 -0
- ai_critic-0.2.2.dist-info/METADATA +0 -225
- ai_critic-0.2.2.dist-info/RECORD +0 -12
- {ai_critic-0.2.2.dist-info → ai_critic-0.2.4.dist-info}/WHEEL +0 -0
- {ai_critic-0.2.2.dist-info → ai_critic-0.2.4.dist-info}/top_level.txt +0 -0
ai_critic/critic.py
CHANGED
|
@@ -10,53 +10,92 @@ from ai_critic.evaluators.summary import HumanSummary
|
|
|
10
10
|
class AICritic:
|
|
11
11
|
"""
|
|
12
12
|
Automated reviewer for scikit-learn models.
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
Produces a multi-layered risk assessment including:
|
|
15
|
+
- Data integrity analysis
|
|
16
|
+
- Model configuration sanity checks
|
|
17
|
+
- Performance evaluation (CV + learning curves)
|
|
18
|
+
- Robustness & leakage heuristics
|
|
19
|
+
- Human-readable executive and technical summaries
|
|
14
20
|
"""
|
|
15
21
|
|
|
16
|
-
def __init__(self, model, X, y):
|
|
22
|
+
def __init__(self, model, X, y, random_state=None):
|
|
23
|
+
"""
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
model : sklearn-compatible estimator
|
|
27
|
+
X : np.ndarray
|
|
28
|
+
Feature matrix
|
|
29
|
+
y : np.ndarray
|
|
30
|
+
Target vector
|
|
31
|
+
random_state : int or None
|
|
32
|
+
Global seed for reproducibility (optional)
|
|
33
|
+
"""
|
|
17
34
|
self.model = model
|
|
18
35
|
self.X = X
|
|
19
36
|
self.y = y
|
|
37
|
+
self.random_state = random_state
|
|
20
38
|
|
|
21
39
|
def evaluate(self, view="all", plot=False):
|
|
22
40
|
"""
|
|
23
41
|
Evaluate the model.
|
|
24
42
|
|
|
25
|
-
Parameters
|
|
26
|
-
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
27
45
|
view : str or list
|
|
28
|
-
- "all" :
|
|
29
|
-
- "executive" :
|
|
30
|
-
- "technical" :
|
|
31
|
-
- "details" :
|
|
32
|
-
- list : subset of views
|
|
46
|
+
- "all" : full payload (default)
|
|
47
|
+
- "executive" : executive summary only
|
|
48
|
+
- "technical" : technical summary only
|
|
49
|
+
- "details" : low-level evaluator outputs
|
|
50
|
+
- list : subset of views (e.g. ["executive", "details"])
|
|
33
51
|
plot : bool
|
|
34
52
|
- True : generate plots (learning curve, heatmap, robustness)
|
|
35
53
|
- False : no plots
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
dict
|
|
58
|
+
Evaluation payload according to selected view
|
|
36
59
|
"""
|
|
37
60
|
|
|
38
61
|
# =========================
|
|
39
|
-
# Low-level
|
|
62
|
+
# Low-level evaluator outputs
|
|
40
63
|
# =========================
|
|
41
64
|
details = {}
|
|
42
65
|
|
|
43
|
-
#
|
|
44
|
-
|
|
66
|
+
# -------------------------
|
|
67
|
+
# Data analysis
|
|
68
|
+
# -------------------------
|
|
69
|
+
data_report = data.evaluate(
|
|
70
|
+
self.X,
|
|
71
|
+
self.y,
|
|
72
|
+
plot=plot
|
|
73
|
+
)
|
|
45
74
|
details["data"] = data_report
|
|
46
75
|
|
|
47
|
-
#
|
|
76
|
+
# -------------------------
|
|
77
|
+
# Model configuration sanity
|
|
78
|
+
# -------------------------
|
|
48
79
|
details["config"] = config.evaluate(
|
|
49
80
|
self.model,
|
|
50
81
|
n_samples=data_report["n_samples"],
|
|
51
82
|
n_features=data_report["n_features"]
|
|
52
83
|
)
|
|
53
84
|
|
|
54
|
-
#
|
|
85
|
+
# -------------------------
|
|
86
|
+
# Performance evaluation
|
|
87
|
+
# (CV strategy inferred automatically)
|
|
88
|
+
# -------------------------
|
|
55
89
|
details["performance"] = performance.evaluate(
|
|
56
|
-
self.model,
|
|
90
|
+
self.model,
|
|
91
|
+
self.X,
|
|
92
|
+
self.y,
|
|
93
|
+
plot=plot
|
|
57
94
|
)
|
|
58
95
|
|
|
59
|
-
#
|
|
96
|
+
# -------------------------
|
|
97
|
+
# Robustness & leakage analysis
|
|
98
|
+
# -------------------------
|
|
60
99
|
details["robustness"] = robustness.evaluate(
|
|
61
100
|
self.model,
|
|
62
101
|
self.X,
|
|
@@ -66,17 +105,19 @@ class AICritic:
|
|
|
66
105
|
)
|
|
67
106
|
|
|
68
107
|
# =========================
|
|
69
|
-
# Human
|
|
108
|
+
# Human-centered summaries
|
|
70
109
|
# =========================
|
|
71
|
-
|
|
110
|
+
human_summary = HumanSummary().generate(details)
|
|
72
111
|
|
|
73
112
|
# =========================
|
|
74
|
-
# Full payload
|
|
113
|
+
# Full payload (PUBLIC API)
|
|
75
114
|
# =========================
|
|
76
115
|
payload = {
|
|
77
|
-
"executive":
|
|
78
|
-
"technical":
|
|
79
|
-
"details": details
|
|
116
|
+
"executive": human_summary["executive_summary"],
|
|
117
|
+
"technical": human_summary["technical_summary"],
|
|
118
|
+
"details": details,
|
|
119
|
+
# Convenience shortcut (prevents KeyError in user code)
|
|
120
|
+
"performance": details["performance"]
|
|
80
121
|
}
|
|
81
122
|
|
|
82
123
|
# =========================
|
ai_critic/evaluators/__init__.py
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
from .
|
|
2
|
-
from .
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
1
|
+
from . import data
|
|
2
|
+
from . import performance
|
|
3
|
+
from . import robustness
|
|
4
|
+
from . import config
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"data",
|
|
8
|
+
"performance",
|
|
9
|
+
"robustness",
|
|
10
|
+
"config",
|
|
11
|
+
]
|
|
@@ -2,9 +2,21 @@ from sklearn.model_selection import cross_val_score, learning_curve
|
|
|
2
2
|
import matplotlib.pyplot as plt
|
|
3
3
|
import numpy as np
|
|
4
4
|
|
|
5
|
+
from .validation import make_cv
|
|
6
|
+
|
|
7
|
+
|
|
5
8
|
def evaluate(model, X, y, plot=False):
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
"""
|
|
10
|
+
Avalia a performance do modelo usando validação cruzada
|
|
11
|
+
automaticamente adequada (StratifiedKFold ou KFold).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# =========================
|
|
15
|
+
# Cross-validation adaptativa
|
|
16
|
+
# =========================
|
|
17
|
+
cv = make_cv(y)
|
|
18
|
+
|
|
19
|
+
scores = cross_val_score(model, X, y, cv=cv)
|
|
8
20
|
mean = float(scores.mean())
|
|
9
21
|
std = float(scores.std())
|
|
10
22
|
suspicious = mean > 0.995
|
|
@@ -13,9 +25,11 @@ def evaluate(model, X, y, plot=False):
|
|
|
13
25
|
"cv_mean_score": mean,
|
|
14
26
|
"cv_std": std,
|
|
15
27
|
"suspiciously_perfect": suspicious,
|
|
28
|
+
"validation_strategy": type(cv).__name__,
|
|
16
29
|
"message": (
|
|
17
30
|
"Perfect CV score detected — possible data leakage."
|
|
18
|
-
if suspicious
|
|
31
|
+
if suspicious
|
|
32
|
+
else "CV performance within expected range."
|
|
19
33
|
)
|
|
20
34
|
}
|
|
21
35
|
|
|
@@ -24,15 +38,30 @@ def evaluate(model, X, y, plot=False):
|
|
|
24
38
|
# =========================
|
|
25
39
|
if plot:
|
|
26
40
|
train_sizes, train_scores, test_scores = learning_curve(
|
|
27
|
-
model,
|
|
41
|
+
model,
|
|
42
|
+
X,
|
|
43
|
+
y,
|
|
44
|
+
cv=cv, # <- MESMA estratégia de validação
|
|
45
|
+
train_sizes=np.linspace(0.1, 1.0, 5)
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
plt.figure(figsize=(6, 4))
|
|
49
|
+
plt.plot(
|
|
50
|
+
train_sizes,
|
|
51
|
+
np.mean(train_scores, axis=1),
|
|
52
|
+
label="Treino"
|
|
53
|
+
)
|
|
54
|
+
plt.plot(
|
|
55
|
+
train_sizes,
|
|
56
|
+
np.mean(test_scores, axis=1),
|
|
57
|
+
label="Validação"
|
|
58
|
+
)
|
|
59
|
+
plt.fill_between(
|
|
60
|
+
train_sizes,
|
|
61
|
+
np.mean(test_scores, axis=1) - np.std(test_scores, axis=1),
|
|
62
|
+
np.mean(test_scores, axis=1) + np.std(test_scores, axis=1),
|
|
63
|
+
alpha=0.2
|
|
28
64
|
)
|
|
29
|
-
plt.figure(figsize=(6,4))
|
|
30
|
-
plt.plot(train_sizes, np.mean(train_scores, axis=1), label="Treino")
|
|
31
|
-
plt.plot(train_sizes, np.mean(test_scores, axis=1), label="Validação")
|
|
32
|
-
plt.fill_between(train_sizes,
|
|
33
|
-
np.mean(test_scores, axis=1)-np.std(test_scores, axis=1),
|
|
34
|
-
np.mean(test_scores, axis=1)+np.std(test_scores, axis=1),
|
|
35
|
-
alpha=0.2)
|
|
36
65
|
plt.xlabel("Amostra de treino")
|
|
37
66
|
plt.ylabel("Score")
|
|
38
67
|
plt.title("Learning Curve")
|
|
@@ -12,8 +12,13 @@ def evaluate(model, X, y, leakage_suspected=False, plot=False):
|
|
|
12
12
|
model_clean = clone(model)
|
|
13
13
|
model_noisy = clone(model)
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
from .validation import make_cv
|
|
16
|
+
|
|
17
|
+
cv = make_cv(y)
|
|
18
|
+
|
|
19
|
+
score_clean = cross_val_score(model_clean, X, y, cv=cv, n_jobs=1).mean()
|
|
20
|
+
score_noisy = cross_val_score(model_noisy, X_noisy, y, cv=cv, n_jobs=1).mean()
|
|
21
|
+
|
|
17
22
|
drop = score_clean - score_noisy
|
|
18
23
|
|
|
19
24
|
# =========================
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# validation.py
|
|
2
|
+
import numpy as np
|
|
3
|
+
from sklearn.model_selection import KFold, StratifiedKFold
|
|
4
|
+
|
|
5
|
+
def infer_problem_type(y):
|
|
6
|
+
"""
|
|
7
|
+
Infer whether the task is classification or regression.
|
|
8
|
+
"""
|
|
9
|
+
y = np.asarray(y)
|
|
10
|
+
|
|
11
|
+
unique_values = np.unique(y)
|
|
12
|
+
n_unique = len(unique_values)
|
|
13
|
+
|
|
14
|
+
# Heurística conservadora
|
|
15
|
+
if (
|
|
16
|
+
np.issubdtype(y.dtype, np.integer)
|
|
17
|
+
or n_unique <= 20
|
|
18
|
+
):
|
|
19
|
+
return "classification"
|
|
20
|
+
|
|
21
|
+
return "regression"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def make_cv(y, n_splits=3, random_state=42):
|
|
25
|
+
"""
|
|
26
|
+
Automatically selects the correct CV strategy.
|
|
27
|
+
"""
|
|
28
|
+
problem_type = infer_problem_type(y)
|
|
29
|
+
|
|
30
|
+
if problem_type == "classification":
|
|
31
|
+
return StratifiedKFold(
|
|
32
|
+
n_splits=n_splits,
|
|
33
|
+
shuffle=True,
|
|
34
|
+
random_state=random_state
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
return KFold(
|
|
38
|
+
n_splits=n_splits,
|
|
39
|
+
shuffle=True,
|
|
40
|
+
random_state=random_state
|
|
41
|
+
)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ai-critic
|
|
3
|
+
Version: 0.2.4
|
|
4
|
+
Summary: Fast AI evaluator for scikit-learn models
|
|
5
|
+
Author-email: Luiz Seabra <filipedemarco@yahoo.com>
|
|
6
|
+
Requires-Python: >=3.9
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: numpy
|
|
9
|
+
Requires-Dist: scikit-learn
|
|
10
|
+
|
|
11
|
+
Performance under noise
|
|
12
|
+
|
|
13
|
+
> Visualizations are optional and do not affect the decision logic.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## ⚙️ Main API
|
|
18
|
+
|
|
19
|
+
### `AICritic(model, X, y)`
|
|
20
|
+
|
|
21
|
+
* `model`: scikit-learn compatible estimator
|
|
22
|
+
* `X`: feature matrix
|
|
23
|
+
* `y`: target vector
|
|
24
|
+
|
|
25
|
+
### `evaluate(view="all", plot=False)`
|
|
26
|
+
|
|
27
|
+
* `view`: `"executive"`, `"technical"`, `"details"`, `"all"` or custom list
|
|
28
|
+
* `plot`: generates graphs when `True`
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 🧠 What ai-critic Detects
|
|
33
|
+
|
|
34
|
+
| Category | Risks |
|
|
35
|
+
|
|
36
|
+
| ------------ | ---------------------------------------- |
|
|
37
|
+
|
|
38
|
+
| 🔍 Data | Target Leakage, NaNs, Imbalance |
|
|
39
|
+
|
|
40
|
+
| 🧱 Structure | Excessive Complexity, Overfitting |
|
|
41
|
+
|
|
42
|
+
| 📈 Validation | Perfect or Statistically Suspicious CV |
|
|
43
|
+
|
|
44
|
+
| 🧪 Robustness | Stable, Fragile, or Misleading |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 🛡️ Best Practices
|
|
49
|
+
|
|
50
|
+
* **CI/CD:** Use executive output as a *quality gate*
|
|
51
|
+
* **Iteration:** Use technical output during tuning
|
|
52
|
+
* **Governance:** Log detailed output
|
|
53
|
+
* **Skepticism:** Never blindly trust a perfect CV
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🧭 Use Cases
|
|
58
|
+
|
|
59
|
+
* Pre-deployment Audit
|
|
60
|
+
* ML Governance
|
|
61
|
+
* CI/CD Pipelines
|
|
62
|
+
* Risk Communication for Non-Technical Users
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 📄 License
|
|
67
|
+
|
|
68
|
+
Distributed under the **MIT License**.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 🧠 Final Note
|
|
73
|
+
|
|
74
|
+
**ai-critic** is not a *benchmarking* tool. It's a **decision-making tool**.
|
|
75
|
+
|
|
76
|
+
If a model fails here, it doesn't mean it's bad—it means it **shouldn't be trusted yet**.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
ai_critic/__init__.py,sha256=H6DlPMmbcFUamhsNULPLk9vHx81XCiXuKKf63EJ8eM0,53
|
|
2
|
+
ai_critic/critic.py,sha256=0fsMpvvV4JSp59vsj4ie9xUSJcTpzM1P8MBRtYKHzxc,3785
|
|
3
|
+
ai_critic/evaluators/__init__.py,sha256=ri6InmL8_LIcO-JZpU_gEFKLO4URdqo3z6rh7fV6M8Y,169
|
|
4
|
+
ai_critic/evaluators/config.py,sha256=gBXaS8Qxl14f40JnvMWgA0Z0SGEtbCuCHpTOPem0H90,1163
|
|
5
|
+
ai_critic/evaluators/data.py,sha256=YAK5NkwCeJOny_UueZ5ALwvEcRDIbEck404eV2oqWnc,1871
|
|
6
|
+
ai_critic/evaluators/performance.py,sha256=1CQx5DueK0XkelYyJnAGRJ3AjQtjsKeW8_1JQZqKVOI,1973
|
|
7
|
+
ai_critic/evaluators/robustness.py,sha256=mfVQ67Z6t6aRvtIq-XQEQYbwvyf8UefM1myeOGVrnAE,1869
|
|
8
|
+
ai_critic/evaluators/summary.py,sha256=O9ZCrph93VV6pFcMIx2a7DizPIccRUqbGcUZ6oDmOLs,3791
|
|
9
|
+
ai_critic/evaluators/validation.py,sha256=rnzRwD78Cugey33gl9geE8JoBURsKEEnqrIOhBZv0LY,904
|
|
10
|
+
ai_critic-0.2.4.dist-info/METADATA,sha256=ldrqxE_VPP5IqXOrpiwB65WP5OTILQ4rizx_IfWuGBQ,1615
|
|
11
|
+
ai_critic-0.2.4.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
12
|
+
ai_critic-0.2.4.dist-info/top_level.txt,sha256=TRyZkm1vyLLcFDg_80yeg5cHvPis_oW1Ti170417jkw,10
|
|
13
|
+
ai_critic-0.2.4.dist-info/RECORD,,
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: ai-critic
|
|
3
|
-
Version: 0.2.2
|
|
4
|
-
Summary: Fast AI evaluator for scikit-learn models
|
|
5
|
-
Author-email: Luiz Seabra <filipedemarco@yahoo.com>
|
|
6
|
-
Requires-Python: >=3.9
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
Requires-Dist: numpy
|
|
9
|
-
Requires-Dist: scikit-learn
|
|
10
|
-
|
|
11
|
-
# ai-critic: Automated Risk Auditor for Machine Learning Models
|
|
12
|
-
|
|
13
|
-
[](https://pypi.org/project/ai-critic/)
|
|
14
|
-
[](https://opensource.org/licenses/MIT)
|
|
15
|
-
[](https://pypi.org/project/ai-critic/)
|
|
16
|
-
|
|
17
|
-
O **ai-critic** é um auditor de risco automatizado baseado em heurísticas para modelos de Machine Learning. Ele avalia modelos treinados antes da implantação e traduz riscos técnicos complexos em decisões claras e centradas no ser humano.
|
|
18
|
-
|
|
19
|
-
Diferente das ferramentas tradicionais que focam apenas em métricas de desempenho, o **ai-critic** adota uma postura cética por design, respondendo à pergunta fundamental: **“Este modelo pode ser implantado com segurança?”**
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 🚀 O que é o ai-critic?
|
|
24
|
-
|
|
25
|
-
O `ai-critic` avalia modelos treinados antes da implantação, analisando quatro áreas principais de risco:
|
|
26
|
-
|
|
27
|
-
* **Integridade dos Dados:** (*data leakage*, desequilíbrio, NaNs).
|
|
28
|
-
* **Estrutura do Modelo:** (risco de *overfitting*, complexidade, configurações suspeitas).
|
|
29
|
-
* **Comportamento de Validação:** (pontuações suspeitamente perfeitas de cross-validation).
|
|
30
|
-
* **Robustez:** (sensibilidade a ruído e estabilidade do modelo).
|
|
31
|
-
|
|
32
|
-
Os resultados são organizados em três camadas semânticas para diferentes *stakeholders*:
|
|
33
|
-
* **Executiva:** Decisões para stakeholders e gerentes.
|
|
34
|
-
* **Técnica:** Diagnósticos para engenheiros de ML.
|
|
35
|
-
* **Detalhada:** Saída completa de métricas e análises técnicas, incluindo gráficos opcionais.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## 🎯 Por que o ai-critic Existe: Filosofia Central
|
|
40
|
-
|
|
41
|
-
A maioria das ferramentas de ML tradicionais assume que métricas são a verdade absoluta, confia cegamente na validação cruzada e entrega números brutos sem interpretação.
|
|
42
|
-
|
|
43
|
-
O **ai-critic** é cético por design. Ele trata:
|
|
44
|
-
* **Pontuações perfeitas** como sinais de alerta, não necessariamente sucesso.
|
|
45
|
-
* **Métricas de robustez** como dependentes do contexto.
|
|
46
|
-
* **Implantação** como uma decisão de gestão de risco, não apenas uma meta técnica.
|
|
47
|
-
|
|
48
|
-
A filosofia central é: **Métricas não falham modelos — o contexto falha.** O `ai-critic` aplica heurísticas de raciocínio humano:
|
|
49
|
-
* “Isso é bom demais para ser verdade?”
|
|
50
|
-
* “Isso pode estar vazando o alvo (*target*)?”
|
|
51
|
-
* “A robustez importa se a linha de base estiver errada?”
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## 🛠️ Instalação
|
|
56
|
-
|
|
57
|
-
Instale o `ai-critic` via pip:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
pip install ai-critic
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Requisitos:**
|
|
64
|
-
* Python ≥ 3.8
|
|
65
|
-
* `scikit-learn`
|
|
66
|
-
* `matplotlib`, `seaborn`, `numpy`, `pandas` (para visualizações opcionais)
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## 💡 Início Rápido
|
|
71
|
-
|
|
72
|
-
Audite seu modelo treinado em apenas algumas linhas:
|
|
73
|
-
|
|
74
|
-
```python
|
|
75
|
-
from sklearn.datasets import load_breast_cancer
|
|
76
|
-
from sklearn.ensemble import RandomForestClassifier
|
|
77
|
-
from ai_critic import AICritic
|
|
78
|
-
|
|
79
|
-
# 1. Carregar dados e treinar um modelo (exemplo)
|
|
80
|
-
X, y = load_breast_cancer(return_X_y=True)
|
|
81
|
-
model = RandomForestClassifier(max_depth=20, random_state=42)
|
|
82
|
-
model.fit(X, y)
|
|
83
|
-
|
|
84
|
-
# 2. Inicializar e avaliar com ai-critic
|
|
85
|
-
critic = AICritic(model, X, y)
|
|
86
|
-
|
|
87
|
-
# Realização de avaliação completa (padrão view="all")
|
|
88
|
-
report = critic.evaluate(plot=True)
|
|
89
|
-
print(report)
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## 🧩 Saída Multi-Camadas
|
|
95
|
-
|
|
96
|
-
O `ai-critic` estrutura os resultados em camadas de decisão claras através do parâmetro `view`.
|
|
97
|
-
|
|
98
|
-
### 🔹 Visualização Executiva (`view="executive"`)
|
|
99
|
-
Projetado para stakeholders e gestores. Sem jargão técnico.
|
|
100
|
-
|
|
101
|
-
```python
|
|
102
|
-
critic.evaluate(view="executive")
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
**Exemplo de Saída:**
|
|
106
|
-
```json
|
|
107
|
-
{
|
|
108
|
-
"verdict": "❌ Não Confiável",
|
|
109
|
-
"risk_level": "high",
|
|
110
|
-
"deploy_recommended": false,
|
|
111
|
-
"main_reason": "Forte evidência de vazamento de dados inflando o desempenho do modelo."
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### 🔹 Visualização Técnica (`view="technical"`)
|
|
116
|
-
Projetado para engenheiros de ML. Focado em diagnósticos e ações corretivas.
|
|
117
|
-
|
|
118
|
-
```python
|
|
119
|
-
critic.evaluate(view="technical")
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**Exemplo de Saída:**
|
|
123
|
-
```json
|
|
124
|
-
{
|
|
125
|
-
"key_risks": [
|
|
126
|
-
"Vazamento de dados suspeito devido à correlação quase perfeita entre recurso e alvo.",
|
|
127
|
-
"Pontuação de validação cruzada perfeita detectada (estatisticamente improvável).",
|
|
128
|
-
"A profundidade da árvore pode ser muito alta para o tamanho do conjunto de dados."
|
|
129
|
-
],
|
|
130
|
-
"model_health": {
|
|
131
|
-
"data_leakage": true,
|
|
132
|
-
"suspicious_cv": true,
|
|
133
|
-
"structural_risk": true,
|
|
134
|
-
"robustness_verdict": "misleading"
|
|
135
|
-
},
|
|
136
|
-
"recommendations": [
|
|
137
|
-
"Auditar e remover recursos com vazamento.",
|
|
138
|
-
"Reduzir a complexidade do modelo.",
|
|
139
|
-
"Executar novamente a validação após a mitigação do vazamento."
|
|
140
|
-
]
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### 🔹 Visualização Detalhada (`view="details"`)
|
|
145
|
-
Projetado para auditoria, depuração e conformidade. Agrega todos os outputs dos módulos internos.
|
|
146
|
-
|
|
147
|
-
```python
|
|
148
|
-
details = critic.evaluate(view="details")
|
|
149
|
-
print(details["data"]["class_balance"])
|
|
150
|
-
print(details["robustness"]["performance_drop"])
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### 🔹 Visualização Combinada (`view="all"`)
|
|
154
|
-
Retorna todas as três camadas em um único dicionário, facilitando a integração com pipelines de CI/CD.
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## 📊 Visualizações e Gráficos
|
|
159
|
-
|
|
160
|
-
Ao definir `plot=True` no método `evaluate()`, o `ai-critic` gera automaticamente:
|
|
161
|
-
* **Heatmap de Correlação:** Identificação visual de vazamento de dados.
|
|
162
|
-
* **Learning Curve:** Diagnóstico de overfitting e necessidade de mais dados.
|
|
163
|
-
* **Gráfico de Robustez:** Visualização da queda de performance sob ruído.
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## ⚙️ API Principal e Modularização
|
|
168
|
-
|
|
169
|
-
### `AICritic(model, X, y)`
|
|
170
|
-
* `model`: Modelo `scikit-learn` treinado.
|
|
171
|
-
* `X`: Matriz de recursos.
|
|
172
|
-
* `y`: Vetor alvo.
|
|
173
|
-
|
|
174
|
-
### `evaluate(view="all", plot=False)`
|
|
175
|
-
* `view`: Camada de saída (`"executive"`, `"technical"`, `"details"`, `"all"` ou lista customizada).
|
|
176
|
-
* `plot`: `True` para gerar gráficos automáticos.
|
|
177
|
-
|
|
178
|
-
### Uso Modular (Avançado)
|
|
179
|
-
Cada módulo retorna um dicionário padronizado consistente:
|
|
180
|
-
```python
|
|
181
|
-
from ai_critic.evaluators import data, config, performance, robustness
|
|
182
|
-
|
|
183
|
-
data_report = data.evaluate(X, y, plot=True)
|
|
184
|
-
config_report = config.evaluate(model, n_samples=data_report["n_samples"], n_features=data_report["n_features"])
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## 🧠 O que o ai-critic Detecta
|
|
190
|
-
|
|
191
|
-
| Categoria | Riscos Detectados |
|
|
192
|
-
| :--- | :--- |
|
|
193
|
-
| **🔍 Dados** | Vazamento de alvo via correlação, NaNs, desequilíbrio de classes. |
|
|
194
|
-
| **🧱 Estrutura** | Árvores excessivamente complexas, altas taxas de recurso/amostra, configurações suspeitas. |
|
|
195
|
-
| **📈 Validação** | Pontuações de CV suspeitosamente perfeitas, variância irreal. |
|
|
196
|
-
| **🧪 Robustez** | Sensibilidade a ruído, robustez enganosa (stable, fragile, misleading). |
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## 🛡️ Melhores Práticas
|
|
201
|
-
|
|
202
|
-
* **CI/CD:** Use a Visualização Executiva como um portão de qualidade automatizado.
|
|
203
|
-
* **Debugging:** Use a Visualização Técnica durante a iteração do modelo.
|
|
204
|
-
* **Compliance:** Utilize a Visualização Detalhada para rastreabilidade e auditoria.
|
|
205
|
-
* **Ceticismo:** Nunca confie cegamente em pontuações de CV perfeitas.
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## 🧭 Casos de Uso Típicos
|
|
210
|
-
* Auditorias de modelo pré-implantação.
|
|
211
|
-
* Governança e conformidade de ML.
|
|
212
|
-
* Portões de modelo em pipelines CI/CD.
|
|
213
|
-
* Explicação de riscos para stakeholders não técnicos.
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 📄 Licença
|
|
218
|
-
|
|
219
|
-
Distribuído sob a **MIT License**.
|
|
220
|
-
|
|
221
|
-
---
|
|
222
|
-
|
|
223
|
-
## 🧠 Nota Final
|
|
224
|
-
|
|
225
|
-
O **ai-critic** não é uma ferramenta de benchmarking. É uma **ferramenta de decisão**. Se um modelo falhar aqui, não significa que seja ruim — significa que **não deve ser confiável ainda**.
|
ai_critic-0.2.2.dist-info/RECORD
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
ai_critic/__init__.py,sha256=H6DlPMmbcFUamhsNULPLk9vHx81XCiXuKKf63EJ8eM0,53
|
|
2
|
-
ai_critic/critic.py,sha256=XShAtVzrvdqVSNVzzusDFSywOOmJYO-TjbodJXw9-IM,2521
|
|
3
|
-
ai_critic/evaluators/__init__.py,sha256=Jmmz9899YD__4Uj3bA6R7vYOwlH2giPc1wuCSLv7FVw,170
|
|
4
|
-
ai_critic/evaluators/config.py,sha256=gBXaS8Qxl14f40JnvMWgA0Z0SGEtbCuCHpTOPem0H90,1163
|
|
5
|
-
ai_critic/evaluators/data.py,sha256=YAK5NkwCeJOny_UueZ5ALwvEcRDIbEck404eV2oqWnc,1871
|
|
6
|
-
ai_critic/evaluators/performance.py,sha256=JpXM_7-RN_q_FvXga4TkSVBBo90Nk0AdBWbjmS-D1oI,1469
|
|
7
|
-
ai_critic/evaluators/robustness.py,sha256=UiGTpE-h2d2U19p1Ce4XpcMv4NMb2I4MmrlTrsPTIag,1808
|
|
8
|
-
ai_critic/evaluators/summary.py,sha256=O9ZCrph93VV6pFcMIx2a7DizPIccRUqbGcUZ6oDmOLs,3791
|
|
9
|
-
ai_critic-0.2.2.dist-info/METADATA,sha256=ZmxIS3QFXr8Lng4aM5c8Tuh65eUKxpIuXoGF6OGHW3s,7854
|
|
10
|
-
ai_critic-0.2.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
11
|
-
ai_critic-0.2.2.dist-info/top_level.txt,sha256=TRyZkm1vyLLcFDg_80yeg5cHvPis_oW1Ti170417jkw,10
|
|
12
|
-
ai_critic-0.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|