Optuna#

Examples using Surfaces with Optuna.


Basic Optuna Usage#

import optuna
from surfaces.test_functions.algebraic import RastriginFunction

optuna.logging.set_verbosity(optuna.logging.WARNING)

func = RastriginFunction(n_dim=5)
space = func.search_space

def objective(trial):
    params = {
        name: trial.suggest_float(name, values.min(), values.max())
        for name, values in space.items()
    }
    return func(params)

study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100)

print(f"Best value: {study.best_value:.6f}")
print(f"Best params: {study.best_params}")

With Categorical Parameters#

import optuna
from surfaces.test_functions.machine_learning import KNeighborsClassifierFunction

optuna.logging.set_verbosity(optuna.logging.WARNING)

func = KNeighborsClassifierFunction()
space = func.search_space

def objective(trial):
    params = {
        'n_neighbors': trial.suggest_int('n_neighbors', 3, 50),
        'algorithm': trial.suggest_categorical('algorithm', space['algorithm']),
    }
    return -func(params)  # Negate for minimization (maximize accuracy)

study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=30)

print(f"Best accuracy: {-study.best_value:.4f}")

Benchmarking Multiple Functions#

"""Benchmark Optuna on multiple Surfaces functions."""

import optuna
from surfaces.test_functions.algebraic import SphereFunction, RastriginFunction

optuna.logging.set_verbosity(optuna.logging.WARNING)

functions = [
    ('Sphere', SphereFunction(n_dim=10)),
    ('Rastrigin', RastriginFunction(n_dim=10)),
]

for name, func in functions:
    space = func.search_space

    def make_objective(f, s):
        def objective(trial):
            params = {k: trial.suggest_float(k, v.min(), v.max())
                      for k, v in s.items()}
            return f(params)
        return objective

    study = optuna.create_study()
    study.optimize(make_objective(func, space), n_trials=100)

    print(f"{name}: {study.best_value:.6f}")