ai-critic 0.2.0__py3-none-any.whl → 0.2.2__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 CHANGED
@@ -10,7 +10,7 @@ from ai_critic.evaluators.summary import HumanSummary
10
10
  class AICritic:
11
11
  """
12
12
  Automated reviewer for scikit-learn models.
13
- Produces a multi-layered risk assessment.
13
+ Produces a multi-layered risk assessment with visualizations.
14
14
  """
15
15
 
16
16
  def __init__(self, model, X, y):
@@ -18,14 +18,21 @@ class AICritic:
18
18
  self.X = X
19
19
  self.y = y
20
20
 
21
- def evaluate(self, view="all"):
21
+ def evaluate(self, view="all", plot=False):
22
22
  """
23
- view:
24
- - "all"
25
- - "executive"
26
- - "technical"
27
- - "details"
28
- - list of views
23
+ Evaluate the model.
24
+
25
+ Parameters:
26
+ -----------
27
+ view : str or list
28
+ - "all" : return full payload
29
+ - "executive" : only executive summary
30
+ - "technical" : only technical summary
31
+ - "details" : only low-level module outputs
32
+ - list : subset of views
33
+ plot : bool
34
+ - True : generate plots (learning curve, heatmap, robustness)
35
+ - False : no plots
29
36
  """
30
37
 
31
38
  # =========================
@@ -33,24 +40,29 @@ class AICritic:
33
40
  # =========================
34
41
  details = {}
35
42
 
36
- data_report = data(self.X, self.y)
43
+ # Data analysis + heatmap
44
+ data_report = data.evaluate(self.X, self.y, plot=plot)
37
45
  details["data"] = data_report
38
46
 
39
- details["config"] = config(
47
+ # Model configuration
48
+ details["config"] = config.evaluate(
40
49
  self.model,
41
50
  n_samples=data_report["n_samples"],
42
51
  n_features=data_report["n_features"]
43
52
  )
44
53
 
45
- details["performance"] = performance(
46
- self.model, self.X, self.y
54
+ # Performance + learning curve
55
+ details["performance"] = performance.evaluate(
56
+ self.model, self.X, self.y, plot=plot
47
57
  )
48
58
 
49
- details["robustness"] = robustness(
59
+ # Robustness + CV clean vs noisy
60
+ details["robustness"] = robustness.evaluate(
50
61
  self.model,
51
62
  self.X,
52
63
  self.y,
53
- leakage_suspected=data_report["data_leakage"]["suspected"]
64
+ leakage_suspected=data_report["data_leakage"]["suspected"],
65
+ plot=plot
54
66
  )
55
67
 
56
68
  # =========================
@@ -1,49 +1,57 @@
1
1
  import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ import seaborn as sns
4
+ import pandas as pd
2
5
 
3
- def evaluate(X, y):
6
+ def evaluate(X, y, plot=False):
4
7
  report = {
5
8
  "n_samples": int(X.shape[0]),
6
9
  "n_features": int(X.shape[1]),
7
10
  "has_nan": bool(np.isnan(X).any() or np.isnan(y).any())
8
11
  }
9
12
 
10
- # Class balance (JSON-safe)
13
+ # Class balance
11
14
  if len(set(y)) < 20:
12
15
  values, counts = np.unique(y, return_counts=True)
13
- report["class_balance"] = {
14
- int(v): int(c) for v, c in zip(values, counts)
15
- }
16
+ report["class_balance"] = {int(v): int(c) for v, c in zip(values, counts)}
16
17
  else:
17
18
  report["class_balance"] = "many_classes"
18
19
 
19
- # 🔎 Data leakage detection (high correlation with target)
20
+ # Data leakage detection
20
21
  suspicious_features = []
21
-
22
22
  y_mean = np.mean(y)
23
23
  y_centered = y - y_mean
24
-
25
24
  for i in range(X.shape[1]):
26
25
  feature = X[:, i]
27
-
28
26
  if np.std(feature) == 0:
29
27
  continue
30
-
31
28
  corr = np.corrcoef(feature, y_centered)[0, 1]
32
-
33
29
  if abs(corr) > 0.98:
34
- suspicious_features.append({
35
- "feature_index": int(i),
36
- "correlation": float(corr)
37
- })
30
+ suspicious_features.append({"feature_index": int(i), "correlation": float(corr)})
38
31
 
39
32
  report["data_leakage"] = {
40
33
  "suspected": bool(len(suspicious_features) > 0),
41
34
  "details": suspicious_features,
42
35
  "message": (
43
36
  "Highly correlated features may reveal the target directly."
44
- if suspicious_features
45
- else "No obvious data leakage detected."
37
+ if suspicious_features else "No obvious data leakage detected."
46
38
  )
47
39
  }
48
40
 
41
+ # =========================
42
+ # Heatmap de correlação Features x Target
43
+ # =========================
44
+ if plot:
45
+ feature_names = [f"feat_{i}" for i in range(X.shape[1])]
46
+ df = pd.DataFrame(X, columns=feature_names)
47
+ df['target'] = y
48
+ corr_matrix = df.corr()
49
+
50
+ plt.figure(figsize=(10,8))
51
+ sns.heatmap(corr_matrix, annot=False, cmap="coolwarm") # <- removi os números
52
+ plt.title("Correlação Features x Target")
53
+ plt.tight_layout()
54
+ plt.savefig("heatmap_correlation.png", dpi=150) # Salva automaticamente
55
+ plt.show()
56
+
49
57
  return report
@@ -1,20 +1,43 @@
1
- from sklearn.model_selection import cross_val_score
1
+ from sklearn.model_selection import cross_val_score, learning_curve
2
+ import matplotlib.pyplot as plt
3
+ import numpy as np
2
4
 
3
- def evaluate(model, X, y):
5
+ def evaluate(model, X, y, plot=False):
6
+ # CV básico
4
7
  scores = cross_val_score(model, X, y, cv=3)
5
-
6
8
  mean = float(scores.mean())
7
9
  std = float(scores.std())
8
-
9
10
  suspicious = mean > 0.995
10
11
 
11
- return {
12
+ result = {
12
13
  "cv_mean_score": mean,
13
14
  "cv_std": std,
14
15
  "suspiciously_perfect": suspicious,
15
16
  "message": (
16
17
  "Perfect CV score detected — possible data leakage."
17
- if suspicious
18
- else "CV performance within expected range."
18
+ if suspicious else "CV performance within expected range."
19
19
  )
20
20
  }
21
+
22
+ # =========================
23
+ # Learning curve
24
+ # =========================
25
+ if plot:
26
+ train_sizes, train_scores, test_scores = learning_curve(
27
+ model, X, y, cv=3, train_sizes=np.linspace(0.1, 1.0, 5)
28
+ )
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
+ plt.xlabel("Amostra de treino")
37
+ plt.ylabel("Score")
38
+ plt.title("Learning Curve")
39
+ plt.legend()
40
+ plt.tight_layout()
41
+ plt.show()
42
+
43
+ return result
@@ -1,10 +1,10 @@
1
1
  import numpy as np
2
2
  from sklearn.base import clone
3
3
  from sklearn.model_selection import cross_val_score
4
+ import matplotlib.pyplot as plt
4
5
 
5
- def evaluate(model, X, y, leakage_suspected=False):
6
+ def evaluate(model, X, y, leakage_suspected=False, plot=False):
6
7
  noise_level = 0.02 # 2% relative noise
7
-
8
8
  scale = np.std(X)
9
9
  noise = np.random.normal(0, noise_level * scale, X.shape)
10
10
  X_noisy = X + noise
@@ -12,18 +12,12 @@ def evaluate(model, X, y, leakage_suspected=False):
12
12
  model_clean = clone(model)
13
13
  model_noisy = clone(model)
14
14
 
15
- score_clean = cross_val_score(
16
- model_clean, X, y, cv=3, n_jobs=1
17
- ).mean()
18
-
19
- score_noisy = cross_val_score(
20
- model_noisy, X_noisy, y, cv=3, n_jobs=1
21
- ).mean()
22
-
15
+ score_clean = cross_val_score(model_clean, X, y, cv=3, n_jobs=1).mean()
16
+ score_noisy = cross_val_score(model_noisy, X_noisy, y, cv=3, n_jobs=1).mean()
23
17
  drop = score_clean - score_noisy
24
18
 
25
19
  # =========================
26
- # Semantic robustness logic
20
+ # Verdict
27
21
  # =========================
28
22
  if leakage_suspected and score_clean > 0.98:
29
23
  verdict = "misleading"
@@ -38,6 +32,19 @@ def evaluate(model, X, y, leakage_suspected=False):
38
32
  verdict = "stable"
39
33
  message = "Model shows acceptable robustness to noise."
40
34
 
35
+ # =========================
36
+ # Plot CV Clean vs Noisy
37
+ # =========================
38
+ if plot:
39
+ plt.figure(figsize=(4,4))
40
+ plt.bar(["Original", "Com Ruído"], [score_clean, score_noisy], color=['green','red'])
41
+ plt.ylabel("CV Score")
42
+ plt.title("Robustez do Modelo")
43
+ plt.ylim(0, 1)
44
+ plt.tight_layout()
45
+ plt.savefig("robustness.png", dpi=150) # Salva automaticamente
46
+ plt.show()
47
+
41
48
  return {
42
49
  "cv_score_original": float(score_clean),
43
50
  "cv_score_noisy": float(score_noisy),
@@ -78,6 +78,13 @@ class HumanSummary:
78
78
  recommendations.append(
79
79
  "Fix baseline performance issues before trusting robustness metrics."
80
80
  )
81
+ elif robustness_verdict == "fragile":
82
+ key_risks.append(
83
+ "Model is fragile under noise perturbations."
84
+ )
85
+ recommendations.append(
86
+ "Consider regularization or simpler model architecture."
87
+ )
81
88
 
82
89
  technical_summary = {
83
90
  "key_risks": key_risks or ["No significant risks detected."],
@@ -0,0 +1,225 @@
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
+ [![PyPI version](https://img.shields.io/pypi/v/ai-critic.svg)](https://pypi.org/project/ai-critic/)
14
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
15
+ [![Python Versions](https://img.shields.io/pypi/pyversions/ai-critic.svg)](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**.
@@ -0,0 +1,12 @@
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,250 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: ai-critic
3
- Version: 0.2.0
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
12
-
13
- Automated Risk Auditor for Machine Learning Models
14
-
15
- [![PyPI version](https://img.shields.io/pypi/v/ai-critic.svg)](https://pypi.org/project/ai-critic/)
16
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
17
-
18
- ## 🚀 O que é ai-critic?
19
-
20
- **ai-critic** é um auditor de risco automatizado e baseado em heurísticas para modelos de *machine learning*. Ele avalia modelos treinados antes da implantação e traduz riscos técnicos de ML em decisões claras e centradas no ser humano.
21
-
22
- Em vez de apenas relatar métricas, **ai-critic** responde a uma pergunta crítica:
23
-
24
- > “Este modelo pode ser implantado com segurança?”
25
-
26
- Ele faz isso analisando:
27
- * **Integridade dos Dados:** (vazamento de dados, desequilíbrio, valores NaNs)
28
- * **Estrutura do Modelo:** (risco de *overfitting*, complexidade)
29
- * **Comportamento de Validação:** (pontuações suspeitamente perfeitas)
30
- * **Robustez:** (sensibilidade a ruído)
31
-
32
- Os resultados são organizados em três camadas semânticas para diferentes *stakeholders*:
33
- 1. **Executiva:** (tomadores de decisão)
34
- 2. **Técnica:** (engenheiros de ML)
35
- 3. **Detalhes:** (auditores e depuração)
36
-
37
- ## 🎯 Por que ai-critic existe: Filosofia Central
38
-
39
- A maioria das ferramentas de ML:
40
- * assume que métricas = verdade
41
- * confia cegamente na validação cruzada
42
- * expõe números brutos sem interpretação
43
-
44
- **ai-critic é cético por design.**
45
-
46
- Ele trata:
47
- * pontuações perfeitas como sinais, não como sucesso
48
- * métricas de robustez como dependentes do contexto
49
- * a implantação como uma decisão de risco, não um limite de métrica
50
-
51
- A filosofia central é: **Métricas não falham modelos — o contexto falha.**
52
-
53
- ai-critic aplica heurísticas de raciocínio humano à avaliação de *machine learning*:
54
- * “Isso é bom demais para ser verdade?”
55
- * “Isso pode estar vazando o alvo?”
56
- * “A robustez ainda importa se a linha de base estiver errada?”
57
-
58
- ## 🛠️ Instalação
59
-
60
- Você pode instalar `ai-critic` usando pip:
61
-
62
- ```bash
63
- pip install ai-critic
64
- ```
65
-
66
- **Requisitos:**
67
- * Python ≥ 3.8
68
- * scikit-learn
69
-
70
- ## 💡 Início Rápido
71
-
72
- Audite seu modelo treinado em poucas linhas de código:
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) # O modelo precisa estar treinado
83
-
84
- # 2. Inicializar e avaliar com ai-critic
85
- critic = AICritic(model, X, y)
86
- report = critic.evaluate()
87
-
88
- # O padrão é a visualização 'all' (todas as camadas)
89
- print(report)
90
- ```
91
-
92
- ## 🧩 Saída Multi-Camadas
93
-
94
- `ai-critic` nunca despeja tudo de uma vez. Ele estrutura os resultados em camadas de decisão claras.
95
-
96
- ### 🔹 Visão Executiva (`view="executive"`)
97
-
98
- Projetada para CTOs, gerentes e *stakeholders*. Zero jargão de ML.
99
-
100
- ```python
101
- critic.evaluate(view="executive")
102
- ```
103
-
104
- **Exemplo de Saída:**
105
- ```json
106
- {
107
- "verdict": "❌ Não Confiável",
108
- "risk_level": "high",
109
- "deploy_recommended": false,
110
- "main_reason": "Forte evidência de vazamento de dados inflando o desempenho do modelo."
111
- }
112
- ```
113
-
114
- ### 🔹 Visão Técnica (`view="technical"`)
115
-
116
- Projetada para engenheiros de ML. É acionável, diagnóstica e focada no que precisa ser corrigido.
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
- ### 🔹 Visão Detalhada (`view="details"`)
145
-
146
- Projetada para auditoria, depuração e conformidade.
147
-
148
- ```python
149
- critic.evaluate(view="details")
150
- ```
151
-
152
- Inclui:
153
- * Métricas brutas
154
- * Correlações
155
- * Pontuações de robustez
156
- * Avisos estruturais
157
- * Rastreabilidade completa
158
-
159
- ### 🔹 Visão Combinada (`view="all"`)
160
-
161
- Retorna todas as três camadas em um único dicionário.
162
-
163
- ```python
164
- critic.evaluate(view="all")
165
- ```
166
-
167
- **Retorna:**
168
- ```json
169
- {
170
- "executive": {...},
171
- "technical": {...},
172
- "details": {...}
173
- }
174
- ```
175
-
176
- ## ⚙️ API Principal
177
-
178
- ### `AICritic`
179
-
180
- | Parâmetro | Descrição |
181
- | :--- | :--- |
182
- | `model` | Modelo `scikit-learn` treinado. |
183
- | `X` | Matriz de recursos (features). |
184
- | `y` | Vetor alvo (target). |
185
-
186
- **Uso:** `AICritic(model, X, y)`
187
-
188
- ### `evaluate()`
189
-
190
- | Parâmetro | Descrição |
191
- | :--- | :--- |
192
- | `view` | A camada de saída desejada: `"executive"`, `"technical"`, `"details"`, ou `"all"` (padrão). |
193
-
194
- **Uso:** `evaluate(view="all")`
195
-
196
- ## 🧠 O que ai-critic Detecta
197
-
198
- | Categoria | Riscos Detectados |
199
- | :--- | :--- |
200
- | **🔍 Riscos de Dados** | Vazamento de alvo via correlação, NaNs, Desequilíbrio de classe. |
201
- | **🧱 Riscos Estruturais** | Árvores excessivamente complexas, Altas proporções de recurso/amostra, *Configuration smells*. |
202
- | **📈 Riscos de Validação** | Pontuações de CV suspeitamente perfeitas, Variância irrealista. |
203
- | **🧪 Riscos de Robustez** | Sensibilidade a ruído, Robustez enganosa quando a linha de base está inflada. |
204
-
205
- ### 🧪 Exemplo: Detecção de Vazamento de Dados
206
-
207
- ```python
208
- import numpy as np
209
- # ... (código de importação e modelo)
210
-
211
- # Vazamento artificial: adicionando o alvo como um recurso
212
- X_leaky = np.hstack([X, y.reshape(-1, 1)])
213
-
214
- critic = AICritic(model, X_leaky, y)
215
- executive_report = critic.evaluate(view="executive")
216
-
217
- print(executive_report)
218
- ```
219
-
220
- **Resultado (Executive View):**
221
- ```
222
- ❌ Não Confiável
223
- Forte evidência de vazamento de dados inflando o desempenho do modelo.
224
- ```
225
-
226
- ## 🛡️ Melhores Práticas
227
-
228
- * Execute `ai-critic` antes da implantação.
229
- * Nunca confie cegamente em pontuações de CV perfeitas.
230
- * Use a **Visão Executiva** no seu pipeline de CI/CD como um *gate* de modelo.
231
- * Use a **Visão Técnica** durante a iteração do modelo.
232
- * Use a **Visão Detalhada** para auditorias e conformidade.
233
-
234
- ## 🧭 Casos de Uso Típicos
235
-
236
- * Auditorias de modelo pré-implantação.
237
- * Governança e conformidade de ML.
238
- * *Gates* de modelo em CI/CD.
239
- * Ensino de ceticismo em ML.
240
- * Explicação de risco de ML para *stakeholders* não técnicos.
241
-
242
- ## 📄 Licença
243
-
244
- Distribuído sob a **Licença MIT**.
245
-
246
- ## 🧠 Nota Final
247
-
248
- `ai-critic` não é uma ferramenta de *benchmark*. **É uma ferramenta de decisão.**
249
-
250
- Se um modelo falhar aqui, isso não significa que ele é ruim — significa que ele não deve ser confiável **ainda**.
@@ -1,12 +0,0 @@
1
- ai_critic/__init__.py,sha256=H6DlPMmbcFUamhsNULPLk9vHx81XCiXuKKf63EJ8eM0,53
2
- ai_critic/critic.py,sha256=tGplbcJQgvXycuj9mIkYJkNQEMxHGC2Fpv946b05Ol4,1944
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=CStPVKSNR9lXFtLNsNleH-uc52_RMKo2rc3cfFzeTTs,1315
6
- ai_critic/evaluators/performance.py,sha256=SWknmNiS9G7WWwmxJJNLL3R5i_I1ZLBIDLW_71jkKBQ,521
7
- ai_critic/evaluators/robustness.py,sha256=2xAZe-puoUE9tde5giKxlGpPs7oyU4y2t8DR4bGW0zs,1365
8
- ai_critic/evaluators/summary.py,sha256=drP43HrWu1WJfLiUIQVczJ5Qs8sfoywpXFdavd2ogQI,3516
9
- ai_critic-0.2.0.dist-info/METADATA,sha256=L78H-7HH9B47puaVCkTNfO44AqSOkPMzifVS2wQ6E98,7256
10
- ai_critic-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
11
- ai_critic-0.2.0.dist-info/top_level.txt,sha256=TRyZkm1vyLLcFDg_80yeg5cHvPis_oW1Ti170417jkw,10
12
- ai_critic-0.2.0.dist-info/RECORD,,