Dieser Artikel ist der Artikel zum 17. Tag des Adventskalenders für maschinelles Lernen 2016.
Dieses Mal möchte ich eine Bibliothek namens scicit-optimize vorstellen, die die Parameter schätzen kann, die die Black-Box-Funktion minimieren.
Installation
Die diesmal getestete Umgebung ist wie folgt.
Die Installation ist einfach von pip.
pip install scikit-optimize
Example
Erste Schritte in README.md auf Github ist eine Funktion, bei der Rauschen hinzugefügt wird. Es wäre schön, die Funktion zu kennen, aber in Wirklichkeit kann die Funktion unbekannt sein. Wenn die Funktion die Funktion nicht kennt, aber in einem solchen Fall den Datenpunkt x auswerten kann, kann das zu minimierende x unter Verwendung einer als Bayes'sche Optimierung bezeichneten Methode erhalten werden.
import numpy as np
from skopt import gp_minimize
def f(x):
return (np.sin(5 * x[0]) * (1 - np.tanh(x[0] ** 2)) * np.random.randn() * 0.1)
res = gp_minimize(f, [(-2.0, 2.0)])
Dieses Res hat die folgenden Variablen.
fun = min(func_vals)
For Machine Learning
In Bezug auf maschinelles Lernen (insbesondere überwachtes Lernen) besteht der Zweck darin, ein Modell aus einem Datensatz zu erstellen und die Vorhersageleistung für unbekannte Daten zu verbessern. Zu diesem Zeitpunkt bewertet maschinelles Lernen das Modell anhand des Kreuztests und verschiedener Bewertungsindizes. Wenn Sie ein Modell mit höherer Leistung erstellen möchten, ist die Optimierung von Hyperparametern unabdingbar. Dieses Mal werde ich versuchen, diesen Hyperparameter mit skopt abzustimmen.
Bestimmen Sie das Modell für Daten und maschinelles Lernen. Diese Seite hat auch ein Beispiel, aber da es eine große Sache ist, werde ich ein etwas anderes Modell ausprobieren.
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
data = load_breast_cancer()
X, y = data.data, data.target
n_features = len(X)
model = GradientBoostingClassifier
def objective(params):
max_depth, lr, max_features, min_samples_split, min_samples_leaf = params
model.set_params(max_depth=max_depth,
max_features=max_features,
learning_rate=lr,
min_samples_split=min_samples_split,
min_samples_leaf=min_samples_leaf)
# gp_Da Minimieren nur minimieren kann, muss für einen Index ein negativer Wert verwendet werden, der angibt, dass die Leistung umso höher ist, je höher die Leistung ist.
return -np.mean(cross_val_score(model, X, y, cv=5, scoring='roc_auc'))
space = [(1, 5), (10**-5, 10**-1, "log-uniform"), (1, n_features), (2, 30), (1, 30)]
x0 = [3, 0.01, 6, 2, 1]
res = gp_minimize(objective, space, x0=x0, n_calls=50)
print(res.fun) # -0.993707074488
print(res.x) # [5, 0.096319962593215167, 1, 30, 22]
Auf diese Weise konnten wir die optimalen Hyperparameter finden. Bei diesem Datensatz betrug die für gp_minimize erforderliche Zeit übrigens 17 [s].
Others
Die offizielle Website enthält einige andere als die oben beschriebenen Beispiele.
Recommended Posts