2020.09.22 Ich habe einen Artikel geschrieben, der diesem Artikel folgt. Optimierung mit Early Stopper von scikit-optimize abbrechen
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.
Einfache Installation mit Pip
pip install scikit-optimize
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)
import numpy as np
from skopt import gp_minimize
Nur numpy und gp_minimize. Wenn es umgeleitet wird, ändern Sie es nach Bedarf.
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.
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.
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.
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 beibehaltenGaussianProcessRegressor Liste 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 |
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.
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