Skip to main content

Scikit-learn models hyperparameter tuning and feature selection using evolutionary algorithms

Project description

sklearn-genetic-opt logo

sklearn-genetic-opt

Hyperparameter tuning and feature selection for scikit-learn models using genetic algorithms.

Tests Codecov PythonVersion PyPI package version Conda Docs Stars GoodFirstIssues

sklearn-genetic-opt is a scikit-learn-compatible optimization toolkit for users who want a smarter alternative to GridSearchCV and RandomizedSearchCV. Its genetic algorithm evaluates complete parameter configurations — finding regions where learning_rate × n_estimators or C × gamma are jointly optimal, something one-parameter-at-a-time approaches miss. It also provides GAFeatureSelectionCV, a wrapper-based selector that searches the full space of feature subsets simultaneously instead of eliminating features one at a time.

If sklearn-genetic-opt saves you time, consider starring the GitHub repository. It helps more practitioners discover the project.

Why use sklearn-genetic-opt?

  • Drop-in scikit-learn APIGASearchCV has the same fit / predict / best_params_ interface as GridSearchCV; replace it in one line.

  • Handles interacting parameters — genetic algorithms evaluate complete configurations, naturally finding cross-parameter sweet spots that random or grid search miss.

  • Joint feature selection and tuning — run GAFeatureSelectionCV and GASearchCV in a two-stage workflow; no separate feature-selection library needed.

  • Mixed search spacesInteger, Continuous (uniform or log-uniform), and Categorical types in the same search.

  • Smart initialization — Latin hypercube seeding, estimator defaults, warm-start configs, and duplicate avoidance give the first generation a head start over random initialization.

  • Early stopping callbacksConsecutiveStopping, DeltaThreshold, and TimerStopping end the search automatically when it converges or runs out of time.

  • Adaptive schedules — crossover and mutation rates anneal over generations, shifting from exploration to exploitation.

  • Optimization history and plots — per-generation fitness, diversity, and telemetry stored in history; built-in plots visualize the full search.

  • MLflow integration — every evaluated candidate is automatically logged as a child run for experiment comparison.

  • Parallel executionn_jobs=-1 parallelizes candidate or fold evaluation.

When should you use it?

  • Your model is expensive to train and you can only afford 50–200 total evaluations.

  • Your search space has 5+ hyperparameters that interact (gradient boosting, SVM, regularized regression).

  • You want feature selection and hyperparameter tuning in a single reproducible workflow.

  • You want optimization history, convergence plots, callbacks, or MLflow tracking built in.

  • You have known-good configurations to warm-start from (prior runs, published defaults).

  • GridSearchCV is too slow and RandomizedSearchCV keeps returning similar bad results.

When should you NOT use it?

  • You need a fast baseline — start with a fixed configuration or RandomizedSearchCV(n_iter=20); it’s faster and good enough to validate your pipeline.

  • Your grid is tiny (fewer than 50 combinations) — GridSearchCV covers it exhaustively and is simpler to reason about.

  • Your model and dataset are fast (< 1 s per fit) — the overhead of managing a population adds up relative to just running all combinations.

  • You need distributed optimization across a cluster — use Optuna with its distributed backends.

  • You need strict Bayesian guarantees on the exploration-exploitation trade-off — use Optuna (TPE) or scikit-optimize.

How it compares

Tool

Best for

Key limitation

Where sklearn-genetic-opt helps

GridSearchCV

Small, fully discrete grids; guaranteed complete coverage

Combinatorial explosion on 4+ params; no continuous params natively

Large, mixed, or continuous spaces with interacting parameters

RandomizedSearchCV

Larger budgets; simple independent parameter spaces

No learning from past evaluations; treats each parameter independently

Exploits cross-parameter interactions; adaptive schedules; early stopping

Optuna

Sequential Bayesian (TPE) search; distributed optimization; neural architecture search

No native sklearn cross-validation; no built-in wrapper feature selection

Drop-in sklearn API; built-in GAFeatureSelectionCV

RFE

Greedy feature elimination for models with coef_ or feature_importances_

Greedy and sequential; can miss non-greedy optimal subsets

Evaluates all subsets simultaneously; works with any estimator

SelectFromModel

Fast embedded selection via a threshold on feature importance

Tied to model-specific importances; no cross-estimator comparison

Estimator-agnostic wrapper; combinable with hyperparameter tuning in one workflow

sklearn-genetic-opt

Large or mixed spaces; joint feature + parameter search; history, plots, callbacks

Slower than Bayesian methods on small smooth spaces; population size needs tuning

Quick Start

Install

pip install sklearn-genetic-opt
# With optional plotting, MLflow, and TensorBoard extras:
# pip install sklearn-genetic-opt[all]

Hyperparameter search

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, train_test_split

from sklearn_genetic import GASearchCV, EvolutionConfig, RuntimeConfig
from sklearn_genetic.space import Categorical, Continuous, Integer

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

search = GASearchCV(
    estimator=RandomForestClassifier(random_state=42),
    param_grid={
        "n_estimators": Integer(50, 300),
        "max_depth":    Integer(3, 20),
        "max_features": Continuous(0.1, 1.0),
        "class_weight": Categorical([None, "balanced"]),
    },
    cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=42),
    scoring="roc_auc",
    evolution_config=EvolutionConfig(population_size=15, generations=12),
    runtime_config=RuntimeConfig(n_jobs=-1, verbose=True),
    random_state=42,
)
search.fit(X_train, y_train)

print(search.best_params_)          # best hyperparameter configuration
print(search.best_score_)           # best cross-validated ROC-AUC
print(search.score(X_test, y_test)) # test-set score

Use a starter preset

from sklearn_genetic import random_forest_classifier_space, xgboost_classifier_space

rf_param_grid = random_forest_classifier_space(profile="balanced")
xgb_param_grid = xgboost_classifier_space(profile="balanced")

Convert a RandomizedSearchCV-style space

from scipy import stats

from sklearn_genetic.space import from_sklearn_space

param_grid = from_sklearn_space({
    "n_estimators": stats.randint(50, 300),
    "max_depth": [3, 5, 10, None],
    "max_features": stats.uniform(0.1, 0.9),
})

Feature selection

import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, train_test_split

from sklearn_genetic import GAFeatureSelectionCV, EvolutionConfig, RuntimeConfig

X, y = load_iris(return_X_y=True)
# Add 8 noise features — the selector should drop them
X = np.hstack([X, np.random.default_rng(42).uniform(0, 1, (X.shape[0], 8))])
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

selector = GAFeatureSelectionCV(
    estimator=RandomForestClassifier(n_estimators=100, random_state=42),
    cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=42),
    scoring="accuracy",
    evolution_config=EvolutionConfig(population_size=20, generations=15),
    runtime_config=RuntimeConfig(n_jobs=-1, verbose=True),
    random_state=42,
)
selector.fit(X_train, y_train)

print(selector.support_)                    # boolean mask of selected features
print(selector.score(X_test, y_test))       # accuracy on selected features

Read the full Getting Started guide →

What you can do

Track optimization progress generation by generation. The fitness curve shows when the search converges so you know whether to add more generations or stop early.

Fitness evolution — best and mean CV score plotted over generations

See where the search explored and which parameter combinations scored highest. The scatter plot reveals the productive region of the learning_rate × n_estimators interaction — a band a one-at-a-time sweep cannot find.

Every evaluated candidate colored by CV score, learning_rate vs n_estimators

Inspect the full search in one view. The search overview panel combines scores, parameter distributions, diversity, and candidate decisions.

Search overview dashboard showing all evaluated candidates

See the full Plotting Gallery →

Common use cases

Hyperparameter tuning

Feature selection

Experiment tracking and tooling

Browse all Recipes → Browse all Tutorials →

Citation

If sklearn-genetic-opt supports your research or a published project, please cite the software version you used. GitHub can generate a citation from CITATION.cff through the “Cite this repository” button, and citation managers can read the same metadata directly from the repository.

Recommended citation:

Arenas, R. (2026). sklearn-genetic-opt: Hyperparameter tuning and feature
selection using genetic algorithms, built on top of scikit-learn (Version
0.13.3) [Computer software].
https://github.com/rodrigo-arenas/Sklearn-genetic-opt

BibTeX:

@software{arenas_2026_sklearn_genetic_opt,
  author = {Arenas, Rodrigo},
  title = {{sklearn-genetic-opt}: Hyperparameter tuning and feature selection
    using genetic algorithms, built on top of scikit-learn},
  year = {2026},
  version = {0.13.3},
  url = {https://github.com/rodrigo-arenas/Sklearn-genetic-opt}
}

Learning paths

New user

InstallGetting Started with GASearchCVHow Hyperparameter Optimization WorksPick a Recipe

ML practitioner

When to Use Genetic Algorithm SearchChoosing the Right Search SpaceModel-specific TutorialsOptuna vs sklearn-genetic-opt

Contributor

Contributing guideOpen issuesBenchmarks documentation

Benchmarks

The repository includes benchmark scripts that compare GASearchCV against RandomizedSearchCV, GridSearchCV, and Optuna (TPE) using the Bayesmark experimental design — same datasets, same search spaces, equal evaluation budget:

pip install sklearn-genetic-opt[benchmark]
python benchmarks/benchmark_bayesmark.py --quick

See the Benchmarks documentation for methodology and full results.

Installation

# Core package
pip install sklearn-genetic-opt

# With plotting, MLflow, and TensorBoard:
pip install sklearn-genetic-opt[all]

# conda
conda install -c conda-forge sklearn-genetic-opt

Requires Python ≥ 3.12 and scikit-learn ≥ 1.5.0. See Installation for the full requirements table and optional extras.

Contributing

Contributions of all sizes are welcome — from fixing a typo to adding a new tutorial or benchmark.

Good ways to start:

  • Add a Recipe for an estimator or workflow not yet covered — see existing Recipes.

  • Write or improve a tutorial (new models, edge cases, regression examples).

  • Test with a new estimator from another framework and report the results.

  • Add a benchmark comparing search methods on a real dataset.

  • Fix typing, CI, or formattingblack . keeps the style consistent.

  • Answer questions in open issues.

  • Share your work — add a blog post, article, or video to the Community Articles page.

git clone https://github.com/rodrigo-arenas/Sklearn-genetic-opt.git
cd Sklearn-genetic-opt
pip install -r dev-requirements.txt
pytest sklearn_genetic

Read the contribution guide before opening a pull request. If you are not sure where to start, open an issue and ask — small contributions are very welcome.

Contributors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sklearn_genetic_opt-0.13.3.tar.gz (76.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sklearn_genetic_opt-0.13.3-py3-none-any.whl (79.2 kB view details)

Uploaded Python 3

File details

Details for the file sklearn_genetic_opt-0.13.3.tar.gz.

File metadata

  • Download URL: sklearn_genetic_opt-0.13.3.tar.gz
  • Upload date:
  • Size: 76.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sklearn_genetic_opt-0.13.3.tar.gz
Algorithm Hash digest
SHA256 2d2a8e5a401cf6e7507b6f42316510ba842f2e551a52f55ceda6f29b810625fb
MD5 294b5af301265c662a54e48dd08fa2de
BLAKE2b-256 405a27f74d6696f161abdf22665f8bfbfef4d4e61399f81480a569f8356ca6de

See more details on using hashes here.

Provenance

The following attestation bundles were made for sklearn_genetic_opt-0.13.3.tar.gz:

Publisher: ci-tests.yml on rodrigo-arenas/Sklearn-genetic-opt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sklearn_genetic_opt-0.13.3-py3-none-any.whl.

File metadata

File hashes

Hashes for sklearn_genetic_opt-0.13.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d77866102c0158bcf10287ad9aa2941c7e95eb11f82d811e6033ac799a0454b0
MD5 ea5a497176ea3307bee9bd6961171340
BLAKE2b-256 931af8e4c7a0fcb06778889be0e8c31f762706fd83c848aa31cd4837116d10dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for sklearn_genetic_opt-0.13.3-py3-none-any.whl:

Publisher: ci-tests.yml on rodrigo-arenas/Sklearn-genetic-opt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page