Bayesianische Optimierung, die mit Python sehr einfach ist

2020.09.22 Ich habe einen Artikel geschrieben, der diesem Artikel folgt. Optimierung mit Early Stopper von scikit-optimize abbrechen

Vorwort

Da ich manchmal Parameter bei der Arbeit optimiere und häufig Konsultationen zu Optimierungsproblemen bei der Arbeit erhalte, fasse ich "gp_minimize" von "scikit-optimize" zusammen, mit denen die Bayes'sche Optimierung sehr einfach durchgeführt werden kann. Ich glaube schon.

scikit-optimize.gp_minimize

Installation

Einfache Installation mit Pip

pip install scikit-optimize

Vollständiger Quellcode

Der vollständige Text dieses Quellcodes. Hier gibt es nur die wichtigsten Punkte, es gibt tatsächlich Zeichnungscodes.

import numpy as np
from skopt import gp_minimize

def func(param=None):
    ret = np.cos(param[0] + 2.34) + np.cos(param[1] - 0.78)
    return -ret

if __name__ == '__main__':
    x1 = (-np.pi, np.pi)
    x2 = (-np.pi, np.pi)
    x = (x1, x2)
    result = gp_minimize(func, x, 
                          n_calls=30,
                          noise=0.0,
                          model_queue_size=1,
                          verbose=True)

Rund um den Import

import numpy as np
from skopt import gp_minimize

Nur numpy und gp_minimize. Wenn es umgeleitet wird, ändern Sie es nach Bedarf.

Optimierungsfunktion

def func(param=None):
    ret = np.cos(param[0] + 0.34) + np.cos(param[1] - 0.78)
    return -ret

Dieses Mal bestand das Problem darin, zwei Eingaben zu empfangen und den Eingabewert zu finden, der die Summe jedes Kosinusfunktionswerts maximiert. Weil es leicht zu verstehen ist. Da es jedoch zu ungeschickt war, habe ich dem Eingabewert einen Offset (0,34, -0,78) hinzugefügt. Wenn dieser Versatz endgültig versetzt ist (-0,34, 0,78), kann gesagt werden, dass die Optimierung erfolgreich ist.

Wie der Name "gp_minimize" andeutet, kann er nur minimiert werden **, sodass der Rückgabewert durch Hinzufügen auf einen negativen Wert gesetzt wird, um die Minimierung zu maximieren.

Suchraumeinstellungen

    x1 = (-np.pi, np.pi)
    x2 = (-np.pi, np.pi)
    x = (x1, x2)

Da ich diese Zeit als Kosinusfunktion kenne, ist der Raum der beiden Eingangsvariablen der gleiche und der Bereich, den (-π bis π) einnehmen kann. Da es notwendig ist, das Minimum und Maximum anzugeben, das für jede Variable mit List oder Tuple verwendet werden kann, und sie schließlich an eine List oder ein Tupel zu übergeben, werden sie am Ende zu einer zusammengefasst.

Optimierung

    result = gp_minimize(func, x, 
                          n_calls=30,
                          noise=0.0,
                          model_queue_size=1,
                          verbose=True)

Allein damit beginnt die Probenahme. Derzeit werden nur die Parameter angegeben, die voraussichtlich verwendet werden.

Die ersten "func" und "x" geben die Optimierungsfunktion und den Suchraum an. n_calls ist die Anzahl der Abtastungen. Wenn "Rauschen" nicht angegeben ist, wird das Rauschen der Gaußschen Verteilung durchsucht. Ändern Sie es daher gegebenenfalls. Dieses Mal wird es ohne Rauschen mit 0,0 bewertet. model_queue_size is gp_minimize verwendet GaussianProcessRegressor von scikit-learn, um den Auswertungswert des Raums vorherzusagen und nach dem nächsten Abtastpunkt zu suchen, also die Nummer, die jedes Mal eine Instanz von GaussianProcessRegressor enthält. .. Wenn Sie es nicht angeben, bleibt alles übrig, sodass der Speicher immer mehr aufgebraucht wird. Dieses Mal habe ich 1 angegeben, um immer nur die neueste Version zu behalten. verbose hat nur während der Abtastung eine Standardausgabe. Wenn False angegeben ist, wird nichts ausgegeben.

Das Ergebnis dieser Optimierung wird in "Ergebnis" zurückgegeben.

Über den Inhalt des Ergebnisses

Wenn Sie mit der Funktion dir auf den Inhalt verweisen, sind die folgenden Mitglieder vorhanden.

In [1]:dir(result)
Out[1]: 
['fun',
 'func_vals',
 'models',
 'random_state',
 'space',
 'specs',
 'x',
 'x_iters']

Im Allgemeinen scheint die folgende Interpretation ausreichend zu sein.

Mitglied Wert Interpretation
fun -1.9999999997437237 Bester Bewertungswert während der Optimierung
func_vals array([ 0.72436992, -0.2934671 ,・ ・ ・ ・ ・ ・ ・-1.99988708, -1.99654543]) Rückgabewert (Auswertungswert) der Funktion jedes Mal während der Optimierung
models list(GaussianProcessRegressor) Wie oben erläutert beibehaltenGaussianProcessRegressorListe der Instanzen von
random_state RandomState(MT19937) at 0x22023222268 Zufälliger Samen
space Space([
Real(low=-3.141592653589793, high=3.141592653589793, prior='uniform', transform='normalize'),
Real(low=-3.141592653589793, high=3.141592653589793, prior='uniform', transform='normalize')])
Erkundungsraumobjekte
specs (Weggelassen, weil es viele gibt)
Enthält Wörterbuch
Es scheint, dass die Optimierungsspezifikationen zusammen enthalten sind
x [-2.3399919472084387, 0.7798573940377893] Optimierter Wert der Eingangsvariablen
x_iters (Ausgelassen, weil es viele gibt)
List
Enthält, welcher Wert jedes Mal abgetastet wurde

Zusammenfassung der Ergebnisse

Fügen Sie zum Schluss den gezeichneten mit dem in "Ergebnis" enthaltenen Wert ein. Es ist etwas schwer zu erkennen, aber die Abbildung links ist die tatsächliche Wärmekarte. Die vertikale Achse ist "x1" und die horizontale Achse ist "x2". Die vertikale Achse befindet sich also unten und die horizontale Achse befindet sich leicht rechts (Mindestwert). Da das Positive und das Negative umgekehrt sind, gibt es tatsächlich den Maximalwert.

Die Abbildung rechts ist das Ergebnis der Optimierung, aber die Farbe der Wärmekarte selbst wird auch mit dem vorhergesagten Wert von "GaussianProcessRegressor" erstellt. Durch 30-maliges Abtasten konnte etwas erzeugt werden, das fast dem realen Raum entspricht, und es konnte auch der optimale Wert erhalten werden. Der ○-Marker ist jedes Mal ein Abtastpunkt, was schwer zu verstehen ist, aber es scheint, dass die Kanten abgetastet werden und der Bereich nahe dem Minimalwert fokussiert wird, nachdem der Raum bis zu einem gewissen Grad vorhergesagt werden kann. Der optimale Wert, für den der ☆-Marker endgültig gefunden wurde. Figure_1.png

So verwenden Sie Callback

Obwohl es nur wenige Artikel zur Verwendung von Scikit-Optimize gibt, habe ich diesmal geschrieben, weil ich keine japanischen Artikel finden konnte, die die Verwendung von Callback erklären. Daher werde ich einen separaten Artikel über die Verwendung von Callback schreiben und hier einen Link einfügen.

2020.09.22 Ich habe es geschrieben. Optimierung mit Early Stopper von scikit-optimize abbrechen

Recommended Posts

Bayesianische Optimierung, die mit Python sehr einfach ist
[Analyse des gemeinsamen Auftretens] Einfache Analyse des gemeinsamen Auftretens mit Python! [Python]
Einfache Python-Kompilierung mit NUITKA-Utilities
Einfacher HTTP-Server mit Python
[Python] Bayesianische Schätzung mit Pyro
Passen Sie die Hyperparameter mit der Bayes'schen Optimierung an
[Python] Einfache Parallelverarbeitung mit Joblib
GPyOpt, ein Paket zur Bayes'schen Optimierung in Python
Einfache Python + OpenCV-Programmierung mit Canopy
Einfache Mailübertragung mit Eile Python3
Visualisieren Sie Ihre Daten ganz einfach mit Python Seaborn.
Einfache parallele Ausführung mit Python-Unterprozess
Einfache Schlüsselwortextraktion mit TermExtract für Python
[Python] Super einfacher Test mit Assert-Anweisung
[Python] Einfache Überprüfung des Argumenttyps mit Datenklasse
Einfache Einführung der Spracherkennung mit Python
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
[Easy Python] Lesen von Excel-Dateien mit openpyxl
Einfache Web-App mit Python + Flask + Heroku
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
[Easy Python] Lesen von Excel-Dateien mit Pandas
Einfaches Web-Scraping mit Python und Ruby
[Python] Probieren Sie mit Keras-RL ganz einfach erweitertes Lernen (DQN) aus
FizzBuzz in Python3
Scraping mit Python
Python ist einfach
Statistik mit Python
Scraping mit Python
Python mit Go
In Python integrieren
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
CSV-Ausgabe der Google-Suche mit [Python]! 【Einfach】
Portfoliooptimierung mit Python (Markovitz-Durchschnittsverteilungsmodell)
Einfache LASSO-Regressionsanalyse mit Python (keine Theorie)
✨ Einfach mit Python ☆ Geschätzte verstrichene Zeit nach dem Tod ✨
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Easy Grad-CAM mit Pytorch-Gradcam
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python