ai-critic 0.1.0__tar.gz → 0.2.1__tar.gz

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.
Files changed (28) hide show
  1. ai_critic-0.2.1/PKG-INFO +258 -0
  2. ai_critic-0.2.1/README.md +248 -0
  3. ai_critic-0.2.1/ai_critic/critic.py +87 -0
  4. ai_critic-0.2.1/ai_critic/evaluators/config.py +35 -0
  5. ai_critic-0.2.1/ai_critic/evaluators/data.py +57 -0
  6. ai_critic-0.2.1/ai_critic/evaluators/performance.py +43 -0
  7. ai_critic-0.2.1/ai_critic/evaluators/robustness.py +54 -0
  8. ai_critic-0.2.1/ai_critic/evaluators/summary.py +96 -0
  9. ai_critic-0.2.1/ai_critic.egg-info/PKG-INFO +258 -0
  10. {ai_critic-0.1.0 → ai_critic-0.2.1}/ai_critic.egg-info/SOURCES.txt +1 -0
  11. {ai_critic-0.1.0 → ai_critic-0.2.1}/pyproject.toml +2 -2
  12. ai_critic-0.2.1/test/test_in_ia.py +56 -0
  13. ai_critic-0.1.0/PKG-INFO +0 -64
  14. ai_critic-0.1.0/README.md +0 -54
  15. ai_critic-0.1.0/ai_critic/critic.py +0 -30
  16. ai_critic-0.1.0/ai_critic/evaluators/config.py +0 -6
  17. ai_critic-0.1.0/ai_critic/evaluators/data.py +0 -14
  18. ai_critic-0.1.0/ai_critic/evaluators/performance.py +0 -11
  19. ai_critic-0.1.0/ai_critic/evaluators/robustness.py +0 -18
  20. ai_critic-0.1.0/ai_critic.egg-info/PKG-INFO +0 -64
  21. ai_critic-0.1.0/test/test_in_ia.py +0 -16
  22. {ai_critic-0.1.0 → ai_critic-0.2.1}/ai_critic/__init__.py +0 -0
  23. {ai_critic-0.1.0 → ai_critic-0.2.1}/ai_critic/evaluators/__init__.py +0 -0
  24. {ai_critic-0.1.0 → ai_critic-0.2.1}/ai_critic.egg-info/dependency_links.txt +0 -0
  25. {ai_critic-0.1.0 → ai_critic-0.2.1}/ai_critic.egg-info/requires.txt +0 -0
  26. {ai_critic-0.1.0 → ai_critic-0.2.1}/ai_critic.egg-info/top_level.txt +0 -0
  27. {ai_critic-0.1.0 → ai_critic-0.2.1}/setup.cfg +0 -0
  28. {ai_critic-0.1.0 → ai_critic-0.2.1}/test/test_model.py +0 -0
@@ -0,0 +1,258 @@
1
+ Metadata-Version: 2.4
2
+ Name: ai-critic
3
+ Version: 0.2.1
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
+ ---
14
+
15
+ ## 🚀 What is ai-critic?
16
+
17
+ `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 de ML em decisões claras e centradas no ser humano.
18
+
19
+ Em vez de apenas relatar métricas, o `ai-critic` responde à pergunta crítica:
20
+
21
+ > “Este modelo pode ser implantado com segurança?”
22
+
23
+ Ele faz isso analisando as principais áreas de risco:
24
+
25
+ * **Integridade dos Dados:** (*data leakage*, desequilíbrio, NaNs)
26
+ * **Estrutura do Modelo:** (risco de *overfitting*, complexidade)
27
+ * **Comportamento de Validação:** (pontuações suspeitamente perfeitas)
28
+ * **Robustez:** (sensibilidade a ruído)
29
+
30
+ Os resultados são organizados em três camadas semânticas para diferentes *stakeholders*:
31
+
32
+ * **Executiva:** (tomadores de decisão)
33
+ * **Técnica:** (engenheiros de ML)
34
+ * **Detalhada:** (auditores e depuração)
35
+
36
+ ## 🎯 Por que o ai-critic Existe: Filosofia Central
37
+
38
+ A maioria das ferramentas de ML:
39
+
40
+ * assume que métricas = verdade
41
+ * confia cegamente na validação cruzada
42
+ * despeja números brutos sem interpretação
43
+
44
+ O `ai-critic` é cético por design.
45
+
46
+ Ele trata:
47
+
48
+ * pontuações perfeitas como **sinais**, não sucesso
49
+ * métricas de robustez como **dependentes do contexto**
50
+ * implantação como uma **decisão de risco**, não um limite de métrica
51
+
52
+ A filosofia central é: **Métricas não falham modelos — o contexto falha.**
53
+
54
+ O `ai-critic` aplica heurísticas de raciocínio humano à avaliação de ML:
55
+
56
+ * “Isso é bom demais para ser verdade?”
57
+ * “Isso pode estar vazando o alvo (*target*)?”
58
+ * “A robustez importa se a linha de base estiver errada?”
59
+
60
+ ## 🛠️ Instalação
61
+
62
+ Instale o `ai-critic` via pip:
63
+
64
+ ```bash
65
+ pip install ai-critic
66
+ ```
67
+
68
+ **Requisitos:**
69
+
70
+ * Python ≥ 3.8
71
+ * `scikit-learn`
72
+
73
+ ## 💡 Início Rápido
74
+
75
+ Audite seu modelo treinado em apenas algumas linhas:
76
+
77
+ ```python
78
+ from sklearn.datasets import load_breast_cancer
79
+ from sklearn.ensemble import RandomForestClassifier
80
+ from ai_critic import AICritic
81
+
82
+ # 1. Carregar dados e treinar um modelo (exemplo)
83
+ X, y = load_breast_cancer(return_X_y=True)
84
+ model = RandomForestClassifier(max_depth=20, random_state=42)
85
+ model.fit(X, y) # O modelo deve estar treinado
86
+
87
+ # 2. Inicializar e avaliar com ai-critic
88
+ critic = AICritic(model, X, y)
89
+ report = critic.evaluate()
90
+
91
+ # A visualização padrão é 'all' (todas as camadas)
92
+ print(report)
93
+ ```
94
+
95
+ ## 🧩 Saída Multi-Camadas
96
+
97
+ O `ai-critic` nunca despeja tudo de uma vez. Ele estrutura os resultados em camadas de decisão claras.
98
+
99
+ ### 🔹 Visualização Executiva (`view="executive"`)
100
+
101
+ Projetado para CTOs, gerentes e *stakeholders*. Sem jargão de ML.
102
+
103
+ ```python
104
+ critic.evaluate(view="executive")
105
+ ```
106
+
107
+ **Exemplo de Saída:**
108
+
109
+ ```json
110
+ {
111
+ "verdict": "❌ Não Confiável",
112
+ "risk_level": "high",
113
+ "deploy_recommended": false,
114
+ "main_reason": "Forte evidência de vazamento de dados inflando o desempenho do modelo."
115
+ }
116
+ ```
117
+
118
+ ### 🔹 Visualização Técnica (`view="technical"`)
119
+
120
+ Projetado para engenheiros de ML. Acionável, diagnóstico e focado no que precisa ser corrigido.
121
+
122
+ ```python
123
+ critic.evaluate(view="technical")
124
+ ```
125
+
126
+ **Exemplo de Saída:**
127
+
128
+ ```json
129
+ {
130
+ "key_risks": [
131
+ "Vazamento de dados suspeito devido à correlação quase perfeita entre recurso e alvo.",
132
+ "Pontuação de validação cruzada perfeita detectada (estatisticamente improvável).",
133
+ "A profundidade da árvore pode ser muito alta para o tamanho do conjunto de dados."
134
+ ],
135
+ "model_health": {
136
+ "data_leakage": true,
137
+ "suspicious_cv": true,
138
+ "structural_risk": true,
139
+ "robustness_verdict": "misleading"
140
+ },
141
+ "recommendations": [
142
+ "Auditar e remover recursos com vazamento.",
143
+ "Reduzir a complexidade do modelo.",
144
+ "Executar novamente a validação após a mitigação do vazamento."
145
+ ]
146
+ }
147
+ ```
148
+
149
+ ### 🔹 Visualização Detalhada (`view="details"`)
150
+
151
+ Projetado para auditoria, depuração e conformidade.
152
+
153
+ ```python
154
+ critic.evaluate(view="details")
155
+ ```
156
+
157
+ Inclui:
158
+
159
+ * Métricas brutas
160
+ * Correlações de recursos
161
+ * Pontuações de robustez
162
+ * Avisos estruturais
163
+ * Rastreabilidade completa
164
+
165
+ ### 🔹 Visualização Combinada (`view="all"`)
166
+
167
+ Retorna todas as três camadas em um único dicionário.
168
+
169
+ ```python
170
+ critic.evaluate(view="all")
171
+ ```
172
+
173
+ **Retorna:**
174
+
175
+ ```json
176
+ {
177
+ "executive": {...},
178
+ "technical": {...},
179
+ "details": {...}
180
+ }
181
+ ```
182
+
183
+ ## ⚙️ API Principal
184
+
185
+ ### `AICritic`
186
+
187
+ | Parâmetro | Descrição |
188
+ | :--- | :--- |
189
+ | `model` | Modelo `scikit-learn` treinado |
190
+ | `X` | Matriz de recursos |
191
+ | `y` | Vetor alvo |
192
+
193
+ **Uso:** `AICritic(model, X, y)`
194
+
195
+ ### `evaluate()`
196
+
197
+ | Parâmetro | Descrição |
198
+ | :--- | :--- |
199
+ | `view` | Camada de saída desejada: `"executive"`, `"technical"`, `"details"`, ou `"all"` (padrão) |
200
+
201
+ **Uso:** `evaluate(view="all")`
202
+
203
+ ## 🧠 O que o ai-critic Detecta
204
+
205
+ | Categoria | Riscos Detectados |
206
+ | :--- | :--- |
207
+ | **🔍 Riscos de Dados** | Vazamento de alvo via correlação, NaNs, desequilíbrio de classes |
208
+ | **🧱 Riscos Estruturais** | Árvores excessivamente complexas, altas taxas de recurso/amostra, *configuration smells* |
209
+ | **📈 Riscos de Validação** | Pontuações de CV suspeitosamente perfeitas, variância irreal |
210
+ | **🧪 Riscos de Robustez** | Sensibilidade a ruído, robustez enganosa se a linha de base estiver inflada |
211
+
212
+ ## 🧪 Exemplo: Detectando Vazamento de Dados
213
+
214
+ ```python
215
+ import numpy as np
216
+ # ... (imports e código do modelo)
217
+
218
+ # Vazamento artificial: adicionando o alvo como um recurso
219
+ X_leaky = np.hstack([X, y.reshape(-1, 1)])
220
+
221
+ critic = AICritic(model, X_leaky, y)
222
+ executive_report = critic.evaluate(view="executive")
223
+
224
+ print(executive_report)
225
+ ```
226
+
227
+ **Saída (Visualização Executiva):**
228
+
229
+ ```
230
+ ❌ Não Confiável
231
+ Forte evidência de vazamento de dados inflando o desempenho do modelo.
232
+ ```
233
+
234
+ ## 🛡️ Melhores Práticas
235
+
236
+ * Execute o `ai-critic` antes da implantação.
237
+ * Nunca confie cegamente em pontuações de CV perfeitas.
238
+ * Use a Visualização Executiva em seu *pipeline* de CI/CD como um portão de modelo.
239
+ * Use a Visualização Técnica durante a iteração do modelo.
240
+ * Use a Visualização Detalhada para auditoria e conformidade.
241
+
242
+ ## 🧭 Casos de Uso Típicos
243
+
244
+ * Auditorias de modelo pré-implantação
245
+ * Governança e conformidade de ML
246
+ * Portões de modelo CI/CD
247
+ * Ensino de ceticismo em ML
248
+ * Explicação de risco de ML para *stakeholders* não técnicos
249
+
250
+ ## 📄 Licença
251
+
252
+ Distribuído sob a Licença MIT.
253
+
254
+ ## 🧠 Nota Final
255
+
256
+ O `ai-critic` não é uma ferramenta de *benchmarking*. É uma **ferramenta de decisão**.
257
+
258
+ Se um modelo falhar aqui, não significa que seja ruim — significa que **não deve ser confiável ainda**.
@@ -0,0 +1,248 @@
1
+ # ai-critic: Automated Risk Auditor for Machine Learning Models**
2
+
3
+ ---
4
+
5
+ ## 🚀 What is ai-critic?
6
+
7
+ `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 de ML em decisões claras e centradas no ser humano.
8
+
9
+ Em vez de apenas relatar métricas, o `ai-critic` responde à pergunta crítica:
10
+
11
+ > “Este modelo pode ser implantado com segurança?”
12
+
13
+ Ele faz isso analisando as principais áreas de risco:
14
+
15
+ * **Integridade dos Dados:** (*data leakage*, desequilíbrio, NaNs)
16
+ * **Estrutura do Modelo:** (risco de *overfitting*, complexidade)
17
+ * **Comportamento de Validação:** (pontuações suspeitamente perfeitas)
18
+ * **Robustez:** (sensibilidade a ruído)
19
+
20
+ Os resultados são organizados em três camadas semânticas para diferentes *stakeholders*:
21
+
22
+ * **Executiva:** (tomadores de decisão)
23
+ * **Técnica:** (engenheiros de ML)
24
+ * **Detalhada:** (auditores e depuração)
25
+
26
+ ## 🎯 Por que o ai-critic Existe: Filosofia Central
27
+
28
+ A maioria das ferramentas de ML:
29
+
30
+ * assume que métricas = verdade
31
+ * confia cegamente na validação cruzada
32
+ * despeja números brutos sem interpretação
33
+
34
+ O `ai-critic` é cético por design.
35
+
36
+ Ele trata:
37
+
38
+ * pontuações perfeitas como **sinais**, não sucesso
39
+ * métricas de robustez como **dependentes do contexto**
40
+ * implantação como uma **decisão de risco**, não um limite de métrica
41
+
42
+ A filosofia central é: **Métricas não falham modelos — o contexto falha.**
43
+
44
+ O `ai-critic` aplica heurísticas de raciocínio humano à avaliação de ML:
45
+
46
+ * “Isso é bom demais para ser verdade?”
47
+ * “Isso pode estar vazando o alvo (*target*)?”
48
+ * “A robustez importa se a linha de base estiver errada?”
49
+
50
+ ## 🛠️ Instalação
51
+
52
+ Instale o `ai-critic` via pip:
53
+
54
+ ```bash
55
+ pip install ai-critic
56
+ ```
57
+
58
+ **Requisitos:**
59
+
60
+ * Python ≥ 3.8
61
+ * `scikit-learn`
62
+
63
+ ## 💡 Início Rápido
64
+
65
+ Audite seu modelo treinado em apenas algumas linhas:
66
+
67
+ ```python
68
+ from sklearn.datasets import load_breast_cancer
69
+ from sklearn.ensemble import RandomForestClassifier
70
+ from ai_critic import AICritic
71
+
72
+ # 1. Carregar dados e treinar um modelo (exemplo)
73
+ X, y = load_breast_cancer(return_X_y=True)
74
+ model = RandomForestClassifier(max_depth=20, random_state=42)
75
+ model.fit(X, y) # O modelo deve estar treinado
76
+
77
+ # 2. Inicializar e avaliar com ai-critic
78
+ critic = AICritic(model, X, y)
79
+ report = critic.evaluate()
80
+
81
+ # A visualização padrão é 'all' (todas as camadas)
82
+ print(report)
83
+ ```
84
+
85
+ ## 🧩 Saída Multi-Camadas
86
+
87
+ O `ai-critic` nunca despeja tudo de uma vez. Ele estrutura os resultados em camadas de decisão claras.
88
+
89
+ ### 🔹 Visualização Executiva (`view="executive"`)
90
+
91
+ Projetado para CTOs, gerentes e *stakeholders*. Sem jargão de ML.
92
+
93
+ ```python
94
+ critic.evaluate(view="executive")
95
+ ```
96
+
97
+ **Exemplo de Saída:**
98
+
99
+ ```json
100
+ {
101
+ "verdict": "❌ Não Confiável",
102
+ "risk_level": "high",
103
+ "deploy_recommended": false,
104
+ "main_reason": "Forte evidência de vazamento de dados inflando o desempenho do modelo."
105
+ }
106
+ ```
107
+
108
+ ### 🔹 Visualização Técnica (`view="technical"`)
109
+
110
+ Projetado para engenheiros de ML. Acionável, diagnóstico e focado no que precisa ser corrigido.
111
+
112
+ ```python
113
+ critic.evaluate(view="technical")
114
+ ```
115
+
116
+ **Exemplo de Saída:**
117
+
118
+ ```json
119
+ {
120
+ "key_risks": [
121
+ "Vazamento de dados suspeito devido à correlação quase perfeita entre recurso e alvo.",
122
+ "Pontuação de validação cruzada perfeita detectada (estatisticamente improvável).",
123
+ "A profundidade da árvore pode ser muito alta para o tamanho do conjunto de dados."
124
+ ],
125
+ "model_health": {
126
+ "data_leakage": true,
127
+ "suspicious_cv": true,
128
+ "structural_risk": true,
129
+ "robustness_verdict": "misleading"
130
+ },
131
+ "recommendations": [
132
+ "Auditar e remover recursos com vazamento.",
133
+ "Reduzir a complexidade do modelo.",
134
+ "Executar novamente a validação após a mitigação do vazamento."
135
+ ]
136
+ }
137
+ ```
138
+
139
+ ### 🔹 Visualização Detalhada (`view="details"`)
140
+
141
+ Projetado para auditoria, depuração e conformidade.
142
+
143
+ ```python
144
+ critic.evaluate(view="details")
145
+ ```
146
+
147
+ Inclui:
148
+
149
+ * Métricas brutas
150
+ * Correlações de recursos
151
+ * Pontuações de robustez
152
+ * Avisos estruturais
153
+ * Rastreabilidade completa
154
+
155
+ ### 🔹 Visualização Combinada (`view="all"`)
156
+
157
+ Retorna todas as três camadas em um único dicionário.
158
+
159
+ ```python
160
+ critic.evaluate(view="all")
161
+ ```
162
+
163
+ **Retorna:**
164
+
165
+ ```json
166
+ {
167
+ "executive": {...},
168
+ "technical": {...},
169
+ "details": {...}
170
+ }
171
+ ```
172
+
173
+ ## ⚙️ API Principal
174
+
175
+ ### `AICritic`
176
+
177
+ | Parâmetro | Descrição |
178
+ | :--- | :--- |
179
+ | `model` | Modelo `scikit-learn` treinado |
180
+ | `X` | Matriz de recursos |
181
+ | `y` | Vetor alvo |
182
+
183
+ **Uso:** `AICritic(model, X, y)`
184
+
185
+ ### `evaluate()`
186
+
187
+ | Parâmetro | Descrição |
188
+ | :--- | :--- |
189
+ | `view` | Camada de saída desejada: `"executive"`, `"technical"`, `"details"`, ou `"all"` (padrão) |
190
+
191
+ **Uso:** `evaluate(view="all")`
192
+
193
+ ## 🧠 O que o ai-critic Detecta
194
+
195
+ | Categoria | Riscos Detectados |
196
+ | :--- | :--- |
197
+ | **🔍 Riscos de Dados** | Vazamento de alvo via correlação, NaNs, desequilíbrio de classes |
198
+ | **🧱 Riscos Estruturais** | Árvores excessivamente complexas, altas taxas de recurso/amostra, *configuration smells* |
199
+ | **📈 Riscos de Validação** | Pontuações de CV suspeitosamente perfeitas, variância irreal |
200
+ | **🧪 Riscos de Robustez** | Sensibilidade a ruído, robustez enganosa se a linha de base estiver inflada |
201
+
202
+ ## 🧪 Exemplo: Detectando Vazamento de Dados
203
+
204
+ ```python
205
+ import numpy as np
206
+ # ... (imports e código do modelo)
207
+
208
+ # Vazamento artificial: adicionando o alvo como um recurso
209
+ X_leaky = np.hstack([X, y.reshape(-1, 1)])
210
+
211
+ critic = AICritic(model, X_leaky, y)
212
+ executive_report = critic.evaluate(view="executive")
213
+
214
+ print(executive_report)
215
+ ```
216
+
217
+ **Saída (Visualização Executiva):**
218
+
219
+ ```
220
+ ❌ Não Confiável
221
+ Forte evidência de vazamento de dados inflando o desempenho do modelo.
222
+ ```
223
+
224
+ ## 🛡️ Melhores Práticas
225
+
226
+ * Execute o `ai-critic` antes da implantação.
227
+ * Nunca confie cegamente em pontuações de CV perfeitas.
228
+ * Use a Visualização Executiva em seu *pipeline* de CI/CD como um portão de modelo.
229
+ * Use a Visualização Técnica durante a iteração do modelo.
230
+ * Use a Visualização Detalhada para auditoria e conformidade.
231
+
232
+ ## 🧭 Casos de Uso Típicos
233
+
234
+ * Auditorias de modelo pré-implantação
235
+ * Governança e conformidade de ML
236
+ * Portões de modelo CI/CD
237
+ * Ensino de ceticismo em ML
238
+ * Explicação de risco de ML para *stakeholders* não técnicos
239
+
240
+ ## 📄 Licença
241
+
242
+ Distribuído sob a Licença MIT.
243
+
244
+ ## 🧠 Nota Final
245
+
246
+ O `ai-critic` não é uma ferramenta de *benchmarking*. É uma **ferramenta de decisão**.
247
+
248
+ Se um modelo falhar aqui, não significa que seja ruim — significa que **não deve ser confiável ainda**.
@@ -0,0 +1,87 @@
1
+ from ai_critic.evaluators import (
2
+ robustness,
3
+ config,
4
+ data,
5
+ performance
6
+ )
7
+ from ai_critic.evaluators.summary import HumanSummary
8
+
9
+
10
+ class AICritic:
11
+ """
12
+ Automated reviewer for scikit-learn models.
13
+ Produces a multi-layered risk assessment with visualizations.
14
+ """
15
+
16
+ def __init__(self, model, X, y):
17
+ self.model = model
18
+ self.X = X
19
+ self.y = y
20
+
21
+ def evaluate(self, view="all", plot=False):
22
+ """
23
+ view:
24
+ - "all"
25
+ - "executive"
26
+ - "technical"
27
+ - "details"
28
+ - list of views
29
+ plot:
30
+ - True: gera gráficos de learning curve, heatmap e robustez
31
+ - False: sem gráficos
32
+ """
33
+
34
+ # =========================
35
+ # Low-level technical details
36
+ # =========================
37
+ details = {}
38
+
39
+ # Data analysis + heatmap
40
+ data_report = data(self.X, self.y, plot=plot)
41
+ details["data"] = data_report
42
+
43
+ # Model configuration
44
+ details["config"] = config(
45
+ self.model,
46
+ n_samples=data_report["n_samples"],
47
+ n_features=data_report["n_features"]
48
+ )
49
+
50
+ # Performance + learning curve
51
+ details["performance"] = performance(
52
+ self.model, self.X, self.y, plot=plot
53
+ )
54
+
55
+ # Robustness + CV clean vs noisy
56
+ details["robustness"] = robustness(
57
+ self.model,
58
+ self.X,
59
+ self.y,
60
+ leakage_suspected=data_report["data_leakage"]["suspected"],
61
+ plot=plot
62
+ )
63
+
64
+ # =========================
65
+ # Human interpretation
66
+ # =========================
67
+ human = HumanSummary().generate(details)
68
+
69
+ # =========================
70
+ # Full payload
71
+ # =========================
72
+ payload = {
73
+ "executive": human["executive_summary"],
74
+ "technical": human["technical_summary"],
75
+ "details": details
76
+ }
77
+
78
+ # =========================
79
+ # View selector
80
+ # =========================
81
+ if view == "all":
82
+ return payload
83
+
84
+ if isinstance(view, list):
85
+ return {k: payload[k] for k in view if k in payload}
86
+
87
+ return payload.get(view)
@@ -0,0 +1,35 @@
1
+ import math
2
+
3
+ def evaluate(model, n_samples=None, n_features=None):
4
+ params = model.get_params()
5
+ model_type = type(model).__name__
6
+
7
+ report = {
8
+ "model_type": model_type,
9
+ "n_params": len(params),
10
+ "uses_random_state": "random_state" in params
11
+ }
12
+
13
+ # 🧠 Structural overfitting heuristics
14
+ warnings = []
15
+
16
+ if n_samples and hasattr(model, "max_depth"):
17
+ max_depth = params.get("max_depth")
18
+ if max_depth is not None:
19
+ recommended_depth = math.log2(n_samples)
20
+ if max_depth > recommended_depth:
21
+ warnings.append({
22
+ "issue": "structural_overfitting_risk",
23
+ "max_depth": max_depth,
24
+ "recommended_max_depth": int(recommended_depth),
25
+ "message": "Tree depth may be too high for dataset size."
26
+ })
27
+
28
+ if n_samples and n_features and n_features > n_samples:
29
+ warnings.append({
30
+ "issue": "high_feature_sample_ratio",
31
+ "message": "More features than samples can cause instability."
32
+ })
33
+
34
+ report["structural_warnings"] = warnings
35
+ return report
@@ -0,0 +1,57 @@
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ import seaborn as sns
4
+ import pandas as pd
5
+
6
+ def evaluate(X, y, plot=False):
7
+ report = {
8
+ "n_samples": int(X.shape[0]),
9
+ "n_features": int(X.shape[1]),
10
+ "has_nan": bool(np.isnan(X).any() or np.isnan(y).any())
11
+ }
12
+
13
+ # Class balance
14
+ if len(set(y)) < 20:
15
+ values, counts = np.unique(y, return_counts=True)
16
+ report["class_balance"] = {int(v): int(c) for v, c in zip(values, counts)}
17
+ else:
18
+ report["class_balance"] = "many_classes"
19
+
20
+ # Data leakage detection
21
+ suspicious_features = []
22
+ y_mean = np.mean(y)
23
+ y_centered = y - y_mean
24
+ for i in range(X.shape[1]):
25
+ feature = X[:, i]
26
+ if np.std(feature) == 0:
27
+ continue
28
+ corr = np.corrcoef(feature, y_centered)[0, 1]
29
+ if abs(corr) > 0.98:
30
+ suspicious_features.append({"feature_index": int(i), "correlation": float(corr)})
31
+
32
+ report["data_leakage"] = {
33
+ "suspected": bool(len(suspicious_features) > 0),
34
+ "details": suspicious_features,
35
+ "message": (
36
+ "Highly correlated features may reveal the target directly."
37
+ if suspicious_features else "No obvious data leakage detected."
38
+ )
39
+ }
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
+
57
+ return report