FTIR-OPTUNA
Framework de AutoML para espectros FTIR: um único estudo Optuna otimiza,
a cada trial, tanto o pipeline de pré-processamento (via ftir_prep) quanto a
escolha do classificador e seus hiperparâmetros — simultaneamente, não em etapas separadas.
Para o histórico de decisões de design, bugs encontrados/corrigidos e a investigação de
integração com o amlb_ainet, ver CLAUDE.md.
Requisitos
- Python 3.9
- O pacote
ftir_prep(no PyPI, instalado automaticamente como dependência — ver abaixo)
Instalação
ftir-optuna-automl está no PyPI e depende do
ftir-prep (também no PyPI) diretamente — a partir do
ftir-prep>=0.3.5, o pip resolve as duas instalações sozinho, sem passo manual:
# 1. Crie e ative um venv
python3.9 -m venv venv
source venv/bin/activate
# 2. Instale o ftir-optuna-automl (traz o ftir-prep junto)
pip install ftir-optuna-automl
Para desenvolver este repositório em vez de só usar a biblioteca, clone o repositório e instale
em modo editável (pip install -e .) no lugar do passo 2 acima, depois instale as dependências
de dev:
git clone https://github.com/lucas-mendonca-andrade/ftir-optuna-automl.git
cd ftir-optuna-automl
pip install -e .
pip install -r requirements.txt # suite de testes, notebook, empacotamento
Configuração
Os caminhos de dataset não ficam hardcoded no código — vêm de variáveis de ambiente, carregadas
de um arquivo .env na raiz do projeto (não versionado; cada máquina tem o seu).
cp .env.example .env
# edite .env com os caminhos reais da sua maquina
| Variável | Obrigatória? | Usada por | Descrição |
|---|---|---|---|
TEA_DATA_PATH |
sim | notebook, testes | .dat com espectros + rótulos do dataset TEA |
TEA_WAVENUMBERS_PATH |
sim | notebook, testes | .dat com os números de onda (cm⁻¹) |
AMLB_TEA_DATA_DIR |
não (tem default) | script de simulação | diretório com os CSVs de fold do benchmark real |
AMLB_TEA_WAVENUMBERS_PATH |
não (tem default) | script de simulação | números de onda do benchmark real |
Se TEA_DATA_PATH/TEA_WAVENUMBERS_PATH estiverem faltando, a importação de config falha
imediatamente com uma mensagem clara (não um FileNotFoundError genérico no meio de uma busca).
Uso rápido
from config import settings
from ftir_prep import FTIRDataLoader
from ftir_optuna_automl import AutoMLOptunaOptimizer
# 1. Carregar os dados
loader = FTIRDataLoader(
data_path=str(settings.tea_data_path),
wavenumbers_path=str(settings.tea_wavenumbers_path),
)
X, y, wavenumbers = loader.load_data()
# 2. Rodar a busca conjunta (pre-processamento + classificador)
optimizer = AutoMLOptunaOptimizer(X, y, wavenumbers)
optimizer.optimize(
time_budget_s=600, # orcamento de tempo (segundos)
memory_limit_mb=4096, # teto de memoria (RSS), em MB
)
# 3. Ver o resultado
summary = optimizer.get_optimization_summary()
print(summary["best_classifier"], summary["best_value"])
# 4. Treinar o melhor pipeline no dado completo e salvar (p/ SHAP pos-hoc, ex.)
optimizer.fit_best()
optimizer.save_fitted_pipeline("models/tea")
Notebook interativo
optuna_automl.ipynb cobre o mesmo fluxo com todos os parâmetros expostos (célula por célula,
com explicação de cada um). Abra com o kernel "Python (ftir-optuna)":
python -m ipykernel install --user --name=ftir-optuna --display-name="Python (ftir-optuna)"
Parâmetros principais
AutoMLOptunaOptimizer(X, y, wavenumbers, ...):
| Parâmetro | Padrão | Descrição |
|---|---|---|
cv_method |
"StratifiedKFold" |
ou "StratifiedGroupKFold"/"GroupKFold" (exigem groups) |
cv_n_splits |
3 |
número de folds usados para pontuar cada trial |
groups |
None |
obrigatório para os dois métodos de CV acima |
metric |
"balanced_accuracy" |
qualquer métrica de sklearn.metrics.get_scorer_names(), ou um scorer customizado |
seed |
42 |
usada no TPESampler do Optuna e em todo classificador estocástico do espaço de busca |
optimizer.optimize(...):
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
time_budget_s |
sim | orçamento de tempo total, em segundos |
memory_limit_mb |
sim | teto de memória (RSS) — total, dividido entre os workers se n_jobs>1 |
storage_path |
não | persiste o estudo em SQLite; permite retomar uma busca interrompida |
n_jobs |
não (padrão 1) |
processos rodando trials em paralelo, compartilhando storage_path |
preset |
não (padrão None) |
None (busca conjunta normal) ou "structure_then_refine" — ver abaixo |
Preset structure_then_refine
Analogamente aos presets de frameworks como AutoGluon/MLJAR, optimize(..., preset="structure_then_refine")
divide time_budget_s em duas fases sequenciais, cada uma com metade do orçamento:
- Estrutura (50%): busca só quais técnicas de pré-processamento e qual classificador usar, avaliando cada combinação com os hiperparâmetros default de cada técnica/modelo — sem tunar.
- Refino (50%): fixa a estrutura vencedora da fase 1 e tuna só os hiperparâmetros dela, no mesmo espaço de busca condicional completo usado no modo sem preset.
optimizer.optimize(
time_budget_s=600,
memory_limit_mb=4096,
preset="structure_then_refine",
)
Depois de rodar, optimizer.structure_study_/optimizer.refine_study_ dão acesso aos dois estudos Optuna
internos separadamente; optimizer.best_pipeline_/optimizer.best_classifier_ (e get_optimization_summary())
sempre refletem o resultado final da fase de refino.
Rodando os testes
pytest
37 testes, cobrindo desde o comportamento default até cenários de concorrência real
(n_jobs>1), persistência/retomada, validação de orçamento de recursos e o preset
structure_then_refine.
Estrutura do projeto
FTIR-OPTUNA/
├── src/ftir_optuna_automl/ # o pacote em si (instalavel via pip)
├── tests/ # suite pytest
├── config.py # carrega .env (caminhos de dataset deste repositorio)
├── optuna_automl.ipynb # notebook interativo
├── simulate_amlb_ftir_tea_10min_acc.py # simula o benchmark real do amlb_ainet
├── dist/ # wheel buildado
└── pyproject.toml
Licença
MIT
Metadata
Release files for ftir-optuna-automl 0.2.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ftir_optuna_automl-0.2.5.tar.gz | 33.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ftir_optuna_automl-0.2.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 59.2 kB
Release files / ftir_optuna_automl-0.2.5.tar.gz
| Download URL | ftir_optuna_automl-0.2.5.tar.gz |
|---|---|
| Size | 33.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b265b6a48504aba7fa52804759fa02aebfcb8b5769afc814c8790adc04ed63d8
|
|
BLAKE2b-256 checksum How to use checksums |
86b1dc3712dd4ff68f4576c835330be80f47449da7f93979447935e1671d8787
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.21
|
Release files / ftir_optuna_automl-0.2.5-py3-none-any.whl
| Download URL | ftir_optuna_automl-0.2.5-py3-none-any.whl |
|---|---|
| Size | 25.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cb9d18fb45579e75cb517714e3a48b57c8dc2e7e5c489a8a7529a506457d8a9f
|
|
BLAKE2b-256 checksum How to use checksums |
a11c18bb7d1d5d6e9fe754f5dfaf9d935436d52b6acbf70b06997443e45dce4e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.21
|