MELITE — Multi-Model Classifier Evaluator
Description
MELITE is a Python package and command-line tool for evaluating and comparing classifiers on numeric tabular datasets. It separates hyperparameter tuning from classifier evaluation, preserves the evidence used for selection, and exports the selected model as a reusable artifact for downstream inference.
MELITE operates at the tabular modeling level. Its learning algorithms consume
numeric feature matrices (X) and target labels (y), regardless of how those
features were produced. Inputs may therefore originate from fingerprints,
descriptors, dimensionality-reduction methods, clinical variables, experimental
measurements, industrial features, or other numeric representations.
Purpose
MELITE is designed to make classifier comparison and selection explicit, reproducible, and auditable. Its workflow separates stages that are often mixed together in small classification workflows:
- hyperparameter tuning;
- classifier evaluation;
- comparison and selection;
- final fitting on all available data;
- model export and inference.
This separation ensures that, within each outer cross-validation split, the data used to evaluate a tuned classifier are held out from the hyperparameter search that produced it, while preserving the evidence needed to understand how the competing classifiers performed.
Why Use MELITE?
- Controlled evaluation. Hyperparameter tuning is kept separate from the evidence used to compare classifiers.
- Evidence preservation. Aggregate and fold-level evaluation results are retained for every evaluated classifier, not only for the selected one.
- Explicit selection. Classifier selection follows a predefined criterion based on cross-validation evidence rather than an informal choice after training.
- Domain-agnostic inputs. MELITE works with numeric tabular data without assuming how the features were generated.
- Reusable artifacts. After selection, the chosen classifier can be fitted on all available data and saved as a model artifact for prediction.
- CLI and Python interfaces. MELITE can be used through its command-line workflow and through a focused public Python API.
What MELITE Does
| MELITE does | MELITE does not |
|---|---|
Evaluate multiple classifiers on prepared numeric X and y. |
Generate domain-specific features or descriptors. |
| Tune supported classifiers within the evaluation design. | Act as a general AutoML framework. |
| Preserve aggregate and fold-level evaluation evidence. | Generate PCA, UMAP, fingerprints, or other feature representations. |
| Select the best active classifier by mean outer-CV F1-macro. | Process raw domain-specific inputs. |
Fit and export the selected model as a .pkl artifact. |
Perform automatic feature engineering or feature selection. |
| Run inference from exported model artifacts. | Guarantee a stable 1.0 API yet. |
Evaluation Contract
For a registered dataset, MELITE follows the contract below:
Xis a two-dimensional numeric feature matrix andyprovides the target labels for the same samples.- Each active classifier is evaluated under the configured outer cross-validation design.
- For tunable classifiers, hyperparameter search occurs only within the training portion of each outer split.
- Evaluation evidence is obtained from the held-out folds of repeated stratified outer cross-validation.
- Mean outer-CV F1-macro is used to select the best active classifier for each dataset.
- Aggregate and per-fold evidence are preserved for every evaluated classifier.
- After selection, MELITE performs the final full-data fitting stage. For a
tunable classifier,
melite runfirst performs a final full-data hyperparameter search and records the resulting parameters inresults.csv; Stacking is fitted directly. melite exportreconstructs the selected classifier from the persisted result, fits it on all available data, and serializes the final model artifact. It performs no additional hyperparameter search, cross-validation, or classifier selection.- Smoke mode is intended for fast execution checks, not final classifier selection.
Installation
Package Users
Install MELITE in a supported Python environment:
python -m pip install melite
Verify the installation:
melite --version
Contributors and Developers
Clone the repository and install in editable mode with development dependencies:
git clone https://github.com/NanoBiostructuresRG/melite.git
cd melite
conda create -n melite_env python=3.11
conda activate melite_env
python -m pip install -e ".[dev]"
To build the documentation locally, install the docs extra as well:
python -m pip install -e ".[dev,docs]"
mkdocs serve
Quick Start
The bundled example creates a ready-to-run synthetic numeric CSV dataset and example configuration for a short evaluation workflow, so you can verify that MELITE is installed and working. Cloning the repository is not required.
melite example
melite run --smoke --config melite_example/config.toml
melite example creates ./melite_example/ in the current directory.
Next steps
- Prepare and use your own datasets.
- Configure MELITE.
- Run a full evaluation.
- Export a model and use the Python prediction API.
Workflow
CLI Workflow
The command-line interface provides the canonical end-to-end MELITE workflow:
- Register one or more numeric datasets in a TOML configuration file.
- Choose the active classifiers.
- Run
melite runto generate evaluation evidence and selected results. - Inspect
results.csv,evaluations.csv,evaluation_folds.csv,optimization_searches.csv,optimization_provenance.json, and the dataset-level F1-macro evidence figures. - Run
melite exportfor the selected result you want to preserve as a model artifact. - Use the exported
.pklartifact throughmelite.predict()for inference.
Python Workflow
The Python API is intentionally component-oriented. It exposes configuration, dataset loading, evaluation-evidence plotting, artifact-based prediction, and version metadata as public symbols.
MELITE does not expose the full evaluation orchestration as a stable high-level Python workflow API. For reproducible end-to-end execution, use the CLI and a version-controlled TOML configuration.
Supported Classifiers
MELITE currently supports four classifier keys:
| Key | Classifier | Active by default |
|---|---|---|
svc |
Support Vector Classifier | Yes |
rf |
Random Forest | Yes |
xgb |
XGBoost | Yes |
stack |
Stacking classifier | No |
MELITE v0.3.0 supports this fixed set of four classifier keys and does not expose public registration of custom classifiers.
The default configuration is:
[classifiers]
active = ["svc", "rf", "xgb"]
Add "stack" to evaluate Stacking alongside the default classifiers.
Standalone SVC is evaluated as a StandardScaler -> SVC pipeline, with
probability fitting disabled during standalone evaluation. Exported SVC
artifacts retain probability support for inference. Random Forest and XGBoost
remain unscaled. The opt-in Stacking classifier combines a scaled probabilistic SVC
with Random Forest and XGBoost base estimators and uses logistic regression as
the final estimator.
Tunable classifiers use Optuna with its TPE sampler for hyperparameter
optimization. The public n_trials setting explicitly declares the budget per
search, with a normal default of 100 trials. Searches are sequential and seeded
from the canonical RANDOM_STATE, supporting reproducible optimization under
the same configuration and software environment.
Input Format
Dataset Registry
Datasets are registered under user-defined [datasets.<dataset_id>] entries.
For example:
[datasets.morgan_r2_2048]
path = "data/morgan_r2_2048.npz"
label_path = "raw/labels.npy"
family = "fingerprints"
method = "Morgan"
variant = "r2_2048"
description = "Morgan fingerprints, radius 2, 2048 bits"
Here, family is optional dataset metadata used to describe the feature
representation. It is unrelated to the classifier selected or evaluated by
MELITE.
Each dataset must define path and label_path. Optional metadata fields such
as family, method, variant, level, and description are preserved for
traceability and do not trigger dataset-specific execution logic.
The legacy [benchmark] configuration section remains supported for backward
compatibility. New configurations should use the dataset registry.
Array Requirements
A registered .npz dataset must contain an X array. MELITE validates that:
Xis two-dimensional;Xis numeric;- the number of rows in
Xmatches the number of labels iny; - an embedded
yarray, when present, matches the configured label vector.
A typical input layout is:
raw/
└── labels.npy
data/
├── morgan_r2_2048.npz
├── rdkit_descriptors.npz
├── PCA85.npz
└── UMAP90.npz
The filenames and feature families are examples only. MELITE does not require PCA, UMAP, fingerprints, descriptors, or any other specific feature-generation method.
Main Outputs
A standard MELITE workflow produces evaluation artifacts and, when requested, a final exported model:
output/
├── results.txt
├── results.csv
├── evaluations.csv
├── evaluation_folds.csv
├── optimization_searches.csv
├── optimization_provenance.json
├── figures/
│ └── evaluation_f1_macro_<dataset>.png
└── Model_<classifier>_<dataset>.pkl
The artifacts have distinct roles:
results.txt— human-readable summary of the selected results.results.csv— selected classifier result for each dataset and the persisted parameter source used bymelite export.evaluations.csv— aggregate evaluation evidence for every active classifier.evaluation_folds.csv— outer-CV evidence for every dataset, classifier, and outer split.optimization_searches.csv— one row per completed outer or final optimization search.optimization_provenance.json— the effective optimization and evaluation contract for the run.figures/evaluation_f1_macro_<dataset>.png— visualization of the outer-CV F1-macro evidence used for classifier selection.Model_<classifier>_<dataset>.pkl— final full-data fitted model created bymelite export.
See the Output Data Contract for the column-level schemas and semantics.
The evaluation figure is generated from already-computed outer-CV evidence. It does not trigger additional fitting, tuning, cross-validation, or selection.
Configuration
MELITE uses TOML configuration files to keep execution choices explicit and reproducible. Configuration controls, among other settings:
- registered datasets and their metadata;
- active classifiers;
- random state;
- inner and outer cross-validation settings;
- optimization trial budget (
n_trials); - input and output paths.
Use --config to supply a project-specific configuration:
melite run --config my_config.toml
melite export --config my_config.toml --row 0
Smoke mode can be requested independently from the configuration:
melite run --smoke --config my_config.toml
See the full configuration reference in the project documentation.
Development
Running Tests
Run the test suite:
python -m pytest tests -q
Build the documentation in strict mode:
mkdocs build --strict
Build and check the distributions:
python -m build --no-isolation
python -m twine check dist/*
Run the installed-wheel smoke test:
python scripts/smoke_install_wheel.py
Contributing
Contributions are welcome. Please open an issue before submitting a pull request. Follow the existing code style: NumPy-style docstrings, type hints, and SPDX license headers in all source files.
See CONTRIBUTING.md for full guidelines, including the development setup and the pull request target branch. Please also read our Code of Conduct.
Documentation
The full documentation is published at:
https://nanobiostructuresrg.github.io/melite/
Citation
If you use MELITE in your research, please cite it using the metadata in CITATION.cff or the format below:
Contreras-Torres, F. F., & Murrieta, A. C. (2026). MELITE — Multi-Model Classifier Evaluator. Zenodo. https://doi.org/10.5281/zenodo.20382752
Authors
- Flavio F. Contreras-Torres — Tecnológico de Monterrey
- Ana C. Murrieta — Tecnológico de Monterrey
License
This project is licensed under the terms of the
GNU Lesser General Public License v3.0 or later.
SPDX identifier: LGPL-3.0-or-later.
Release files for melite 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| melite-0.3.0.tar.gz | 131.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| melite-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 203.5 kB
Release files / melite-0.3.0.tar.gz
| Download URL | melite-0.3.0.tar.gz |
|---|---|
| Size | 131.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
54b4a94357b066a01f5ec42ce36ab0a2950abd88eade0d707134542ebbe19c9a
|
|
BLAKE2b-256 checksum How to use checksums |
69ae715c92f81668e4c39c3dd47a7b630ac2bf8173d3be622326ec581c856a7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency logRelease files / melite-0.3.0-py3-none-any.whl
| Download URL | melite-0.3.0-py3-none-any.whl |
|---|---|
| Size | 71.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
150ba213e6d99cc99d7b0cf71199add4279398ba94e91337dbb7274d85b9c42a
|
|
BLAKE2b-256 checksum How to use checksums |
5f84071ed1493c521d837b802f5dab5ef91e0977d971f8cda4ca81787b8c9a70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency log