[PYTHON] [Optimierungsproblem] Optuna vs Hyperopt

Einführung

x^2+y^2+z^2

Die beiden Frameworks werden in einem separaten Artikel vorgestellt. Bitte beziehen Sie sich darauf. Funktionsoptimierung mit Optuna versuchen [Funktionsoptimierung mit Hyperopt versuchen](https://qiita.com/ pontyo4 / items / 31aa1d4527c7bf99759e) Vergleichsexperiment Dieses Mal werden wir das Minimierungsproblem optimieren. Die Ergebnisse sind für jeden Versuch unterschiedlich, daher werde ich es dreimal versuchen.

Code

Der für dieses Experiment verwendete Code lautet wie folgt.

# -*- coding: utf-8 -*-
import optuna
import hyperopt
from hyperopt import hp
from hyperopt import fmin
from hyperopt import tpe
from hyperopt import Trials
import matplotlib.pyplot as plt

#Zielfunktion für Optuna einstellen(Diesmal x^2+y^2+z^2)
def objective_optuna(trial):
    #Stellen Sie die zu optimierenden Parameter ein
    param = {
        'x': trial.suggest_uniform('x', -100, 100),
        'y': trial.suggest_uniform('y', -100, 100),
        'z': trial.suggest_uniform('z', -100, 100)
    }
    #Gibt den Auswertungswert zurück(Es ist standardmäßig so konzipiert, dass es minimiert wird)
    return param['x'] ** 2 + param['y'] ** 2 + param['z'] ** 2

#Optimiert mit optuna
def optuna_exe():
    #Objekterstellung studieren
    study = optuna.create_study()
    #Optimierungsausführung
    study.optimize(objective_optuna, n_trials=500)
    #Beste Parameteranzeige
    print(study.best_params)
    #Besten Zielfunktionswert anzeigen
    print(study.best_value)

    epoches = []    #Zum Speichern der Anzahl der Versuche
    values = []    #Zum Speichern des besten Wertes
    best = 100000
    #bestes Update
    for i in study.trials:
        if best > i.value:
            best = i.value
        epoches.append(i.number + 1)
        values.append(best)
    return epoches, values

#Stellen Sie die Zielfunktion für Hyperopt ein
def objective_hyperopt(args):
    x, y, z = args
    return x ** 2 + y ** 2 + z ** 2

#Optimiert mit Hyperopt
def hyperopt_exe():
    #Suchraumeinstellungen
    space = [
        hp.uniform('x', -100, 100),
        hp.uniform('y', -100, 100),
        hp.uniform('z', -100, 100)
    ]
    #Ein Objekt zum Aufzeichnen des Suchstatus
    trials = Trials()
    #Beginnen Sie mit der Erkundung
    best = fmin(objective_hyperopt, space, algo=tpe.suggest, max_evals=500, trials=trials)
    #Das Ergebnis ausgeben
    print(best)
    epoches = [] #Zum Speichern der Anzahl der Versuche
    values = [] #Zum Speichern des besten Wertes
    best = 100000
    #bestes Update
    for i, n in zip(trials.trials, range(500)):
        if best > i['result']['loss']:
            best = i['result']['loss']
        epoches.append(n+1)
        values.append(best)

    return epoches, values

def plot_graph():
    result_optuna = optuna_exe()
    result_hyperopt = hyperopt_exe()
    epoch_optuna = result_optuna[0]
    value_optuna = result_optuna[1]
    epoch_hyperopt = result_hyperopt[0]
    value_hyperopt = result_hyperopt[1]

    #Zeichnen eines Diagramms
    fig, ax = plt.subplots()
    ax.set_xlabel("trial")
    ax.set_ylabel("value")
    ax.set_title("Optuna vs Hyperopt")
    ax.grid() #Gitterlinien einfügen
    ax.plot(epoch_optuna, value_optuna, color="red", label="Optuna")
    ax.plot(epoch_hyperopt, value_hyperopt, color="blue", label="Hyperopt")
    ax.legend(loc=0) #Gebrauchsanweisung
    plt.show() #Grafikanzeige

if __name__ == '__main__':
    plot_graph()

Erstes experimentelles Ergebnis

Optuna: 'x': 0.2690396239515218, 'y': -1.75236444646743, 'z': 0.3724308175904496, best_value:3.2818681863901693

Hyperopt: 'x': -2.9497423868903834, 'y': 0.13662455602710644, 'z': -3.844496541052724, best_value:23.499800072493738 Figure_1.png

Optuna ist im endgültigen best_value ausgezeichnet. Es scheint, dass Optuna dem Diagramm in Bezug auf die Konvergenzgeschwindigkeit überlegen ist.

Zweites experimentelles Ergebnis

Optuna: 'x': 0.7811129871251672, 'y': 0.4130867942356189, 'z': 0.6953642534092288, best_value:1.2643096431468364

Hyperopt: 'x': -3.7838067947126675, 'y': -2.595648793357423, 'z': -2.683504623035553, best_value:28.255783580024783 Figure_2.png

Ist Optuna sowohl beim zweiten als auch beim ersten Mal hinsichtlich des endgültigen Bestwerts und der Konvergenzgeschwindigkeit überlegen?

Versuchsergebnis 3 ..

Optuna: 'x': -0.19339325990518663, 'y': -0.0030977352573082623, 'z': 0.4961595538587318, best_value:0.2835848518257752

Hyperopt: 'x': 2.810074634010315, 'y': -1.2603362587820195, 'z': -0.7356174272489406, best_value:10.026099933181214 Figure_3.png

Optuna war auch zum dritten Mal im endgültigen best_value-Wert überlegen. Ich habe das Gefühl, dass sich die Konvergenzgeschwindigkeit nicht wesentlich ändert.

Fazit

Wir sind zu dem Schluss gekommen, dass Optuna hinsichtlich des endgültigen besten Zielfunktionswerts und der Konvergenzgeschwindigkeit überlegen ist. Wenn das Optimierungsproblem etwas schwieriger wird, wird es einen großen Unterschied machen ...

Recommended Posts

[Optimierungsproblem] Optuna vs Hyperopt
Versuchen Sie die Funktionsoptimierung mit Hyperopt
Optimierungsproblem ändern - realistischeres Problem -