Gehören Sie noch zur Besetzung? Empfehlen Sie diese drei Hyperparameter-Optimierungsbibliotheken [einschließlich Beispielcode]

Führung

Im herkömmlichen Algorithmusmodellierungsprozess ist die Optimierung der Algorithmusparameter, also die Hyperparameteroptimierung (HPO), eine wichtige Verbindung, die sich auf die Leistung des Algorithmus auswirkt und möglicherweise die zeitaufwändigste und langweiligste Arbeit darstellt, so viele Algorithmusingenieure werden sich scherzhaft „Tiao Shen Xia“ nennen. Kürzlich habe ich einige Artikel und Implementierungen im Zusammenhang mit AutoML studiert, und eine der Kernkomponenten von AutoML ist HPO. Dieser Artikel nutzt diese Gelegenheit und fasst drei gängige Bibliotheken in Python zusammen, die HPO implementieren können, und bietet ein einfaches Beispiel.

HPO, der vollständige Name lautet Hyperparameter-Optimierung, also Hyperparameter-Optimierung. Der Grund für diese Arbeit liegt in zwei grundlegenden Wahrheiten im Bereich des maschinellen Lernens:

  • kein freies Mittagessen. Das heißt, es gibt kein kostenloses Mittagessen auf der Welt. Wenn es im Bereich des maschinellen Lernens verwendet wird, bedeutet dies, dass kein Algorithmus auf alle Probleme des maschinellen Lernens angewendet werden kann. Mit anderen Worten: Algorithmus A schneidet bei diesem Datensatz möglicherweise am besten ab, aber Es kann bei einem anderen Datensatz die beste Leistung erbringen. ist ein weiterer B-Algorithmus.

  • Für denselben Algorithmus können unterschiedliche Hyperparameter einen großen Einfluss auf die Leistung des Algorithmus haben. Zum Beispiel der Regularisierungskoeffizient im linearen Modell, die maximale Tiefe des Baums im Entscheidungsbaummodell usw. Dies sind andere Parameter als die Modellanpassung und müssen angegeben werden, daher werden sie Hyperparameter genannt.

Aus diesem Grund müssen Algorithmusingenieure bei der Verbesserung der Algorithmusleistung häufig mehrere Modelle vergleichen und gleichzeitig mehrere Sätze von Hyperparametern innerhalb jedes Modells anpassen, um optimale Ergebnisse zu erzielen. In diesem Hyperparameter-Optimierungsprozess sind die aktuellen Implementierungsmethoden hauptsächlich wie folgt:

  • Die einfachste und bekannteste ist die Rastersuche. Die Implementierung in sklearn ist GridSearch. Durch die Bereitstellung aller möglichen Kandidatenwerte für jeden Hyperparameter probiert der Algorithmus automatisch alle möglichen Hyperparameterkombinationen heftig aus und liefert das beste Ergebnis. Diese Implementierungsmethode ist intuitiv und leicht zu verstehen, aber auch die Nachteile liegen auf der Hand, das heißt, die Effizienz ist nicht hoch und es können nur diskrete Werte akzeptiert werden

  • Eine Methode, die der Rastersuche ähnelt, jedoch keine gewalttätigere Aufzählung erfordert, ist die Zufallssuche. Der Optimierungsprozess ist tatsächlich einfacher: Für jeden Hyperparameter wird zufällig ein Kandidatenwert ausgewählt, und dann wird ein zufällig ausgewählter Hyperparameter gebildet. Nehmen Sie an der Kombination teil. Schließlich wird die optimale Kombination nach allen Zufallsversuchen zurückgegeben. Diese Methode ist einfach zu implementieren und die Anzahl der Suchvorgänge kann groß oder klein sein, es können jedoch häufig gute Ergebnisse erzielt werden. Das beste erzielte Ergebnis ist jedoch möglicherweise nicht die optimale Lösung.

  • Bayesianische Optimierung. Neben der Rastersuche und der Zufallssuche ist die Bayes'sche Optimierung möglicherweise die idealste und effizienteste Hyperparameteroptimierung (aus dem Namen geht hervor, dass diese Art von Methode eine gewisse Beziehung zum Bayes'schen Gott hat, wahrscheinlich weil sie verwendet wird) Die Proxy-Funktion Der erhaltene Wert hängt mit der Bayes'schen Posterior-Wahrscheinlichkeit zusammen. Die allgemeine Form von HPO basierend auf dem Bayes'schen Optimierungsalgorithmus kann als folgender SMBO-Prozess abstrahiert werden:

《Bayesianische Optimierungsgrundierung》

Darunter sind die Bedeutungen der Symbole und Variablen wie folgt:

  • f: Zielfunktion. Im Szenario des maschinellen Lernens handelt es sich um den Prozess des Erhaltens des Bewertungsindex yi gemäß der Hyperparameterkombination xi

  • X: Hyperparameter-Suchraum, wobei jedes xi eine Menge von Werten in X ist;

  • yi: Die Punktzahl der Zielfunktion, die das Ergebnis des Bewertungsindex im Szenario des maschinellen Lernens ist, z. B. precision_score

  • D: Datensatz bestehend aus allen (xi, yi)

  • M: Proxy-Funktion, also die Zuordnungsmethode, um yi von xi zu erhalten. Aus Sicht des maschinellen Lernens kann ein kontinuierliches Bewertungsergebnis (Regressionsziel) durch ein Regressionsmodell realisiert werden, da es durch eine Reihe von Hyperparametern (die als Merkmale verstanden werden können) angepasst wird. Der Grund, warum sie hier als Proxy-Funktion bezeichnet wird, liegt darin, dass unter normalen Umständen das entsprechende Algorithmusmodell + Hyperparameter für das tatsächliche Training und die Bewertung verwendet werden sollten, um echte Bewertungsergebnisse zu erhalten. Um zu diesem Zeitpunkt so große Berechnungen zu vermeiden, ist ein quantitativer Prozess erforderlich ( teuer), daher habe ich mich stattdessen für eine einfache und schnelle Funktion zum Anpassen entschieden

  • S: Erfassungsfunktion, das heißt, wie man den nächsten Satz von Hyperparameterkombinationen erhält, die die Leistung entsprechend der aktuell erhaltenen Proxy-Funktion M und dem Hyperparameter-Suchraum X verbessern können.

Basierend auf den obigen Symboldefinitionen sieht der SMBO-Prozess wie folgt aus:

  • Geben Sie die Eingabeparameter f,

  • Gemäß der Erfassungsfunktion S und der Proxyfunktion M wird die Hyperparameterkombination xi+1 erhalten, die unter der aktuellen Situation die optimale Punktzahl erzielen kann

  • Bringen Sie einen neuen Satz von Hyperparametern in das maschinelle Lernen ein, um es zu optimieren und den tatsächlichen yi+1 zu erhalten

  • Fügen Sie die neuesten Daten (xi+1, yi+1) zum Datensatz D hinzu und passen Sie die Proxy-Funktion M neu an

  • Führen Sie dies iterativ T-mal aus oder beenden Sie es, wenn der Zieleffekt erreicht ist

Bei diesem Optimierungsprozess werden potenziell optimale Hyperparameter einzeln ausgewählt und die Ergebnisse zum Datensatz hinzugefügt, um den Optimierungsprozess der Proxy-Funktion fortzusetzen. Aus diesem Grund wird er als sequentiell bezeichnet und die Proxy-Funktion M entspricht modellbasiert . Zweifellos gibt es zwei wichtige Implementierungsdetails: Das eine ist die Auswahl und Modellierung der Proxy-Funktion M und das andere das Design der Erfassungsfunktion S. Der Unterschied zwischen diesen beiden Prozessen bestimmt auch den Unterschied in der Implementierung spezifischer Bayes'scher Optimierung.

Hier ist eine kurze Einführung in die Auswahl mehrerer gängiger Proxy-Funktionen M:

  • Der Gaußsche Prozess abstrahiert die Zuordnungsbeziehung zwischen K Hyperparametern und Bewertungen in eine K-dimensionale gemeinsame Gaußsche Verteilung, sodass der Mittelwert und die Varianz der gemeinsamen Gaußschen Verteilung jedes Mal gemäß dem Datensatz D berechnet werden können. Ein wesentlicher Nachteil dieser Methode besteht jedoch darin, dass sie nur auf kontinuierliche Hyperparameter und im Allgemeinen nur in niedrigeren Dimensionen anwendbar ist.

  • TPE, baumstrukturierter Parzen-Schätzer. Die Hauptidee besteht darin, die Kernel-Dichtefunktionsschätzung (KDE, Kernel-Dichte-Schätzer) zu verwenden, die den Datensatz entsprechend dem Wert von yi in zwei Bereiche aufteilt, sodass die KDE-Methode verwendet wird Die beiden Regionen passen jeweils zu ihrer Verteilung. Das Endziel besteht darin, die Wahrscheinlichkeit einer hohen Punktzahl g(x) zu maximieren und gleichzeitig die Wahrscheinlichkeit einer niedrigen Punktzahl l(x) zu minimieren (der tatsächliche Zweck besteht darin, das Verhältnis zu minimieren: l(x)/g(x));

  • Random Forest, das heißt, die Proxy-Funktion M wird mit einem Random-Forest-Regressionsmodell angepasst, bei dem jeder Teilbaum an eine zufällige Teilmenge des Datensatzes D angepasst wird, um Zufälligkeit sicherzustellen. Wenn ein neuer Satz von Hyperparametern erhalten wird, kann der Mittelwert der Bewertungsergebnisse jedes Teilbaums im Random-Forest-Modell als Maß für das Potenzial der Hyperparameter verwendet werden.

Auch bei der Auswahl der Erfassungsfunktionen gibt es unterschiedliche Ausführungen wie PI (Probability of Improvement) und EI (Expected Improvement) etc., auf die hier nicht näher eingegangen wird.

Für die abstrakte Implementierung dieser drei Proxy-Funktionen gibt es in Python entsprechende Bibliotheken, die direkt aufgerufen werden können. In diesem Artikel werden drei Bibliotheken ausgewählt, die einer Bayes'schen Optimierungsmethode für Proxy-Funktionen entsprechen:

  • GP, entsprechend der Python-Bibliothek bayes_opt

  • TPE, entsprechend der Python-Bibliothek hyperopt

  • RandomForest, entsprechend der Python-Bibliothek Scikit-Optimizer, wird als Skopt bezeichnet

Hier werden am Beispiel des in sklearn bereitgestellten klassischen Zwei-Kategorien-Datensatzes breast_cancer die grundlegenden Implementierungsmethoden von drei Optimierungsbibliotheken angegeben:

  • Laden des Datensatzes und Basislinie einer zufälligen Gesamtstruktur mit Standardparametern

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, train_test_split


X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)


rf = RandomForestClassifier()
rf.fit(X_train, y_train)
rf.score(X_test, y_test)
# 默认参数RF得分:0.958041958041958
  • bayes_opt-Implementierung

from bayes_opt import BayesianOptimization


# bayes_opt中的目标函数
def fun_bo(n_estimators, max_depth, min_samples_split, min_samples_leaf):
    rf = RandomForestClassifier(n_estimators=int(n_estimators),
            max_depth=int(max_depth),
            min_samples_split=int(min_samples_split), 
            min_samples_leaf=int(min_samples_leaf))
    score = cross_val_score(rf, X_train, y_train)
    return score.mean()


# 贝叶斯优化中的搜索空间
space_bo =  {
    'n_estimators': (10, 300),
    'max_depth': (1, 21),
    'min_samples_split': (2, 20),
    'min_samples_leaf': (2, 20)
}
bo = BayesianOptimization(
    fun_bo,
    space_bo
)
bo.maximize()  # 一键完成优化


# 得到最优超参结果
param = {k:int(v) for k, v in bo.max['params'].items()}
rf_hp = RandomForestClassifier(**param)
rf_hp.fit(X_train, y_train)
rf_hp.score(X_test, y_test)
# bayes_opt优化得分:0.965034965034965
  • Hyperopt-Implementierung

from hyperopt import fmin, hp, tpe, Trials


# hyperopt中的目标函数
def fun_hp(param):
    rf = RandomForestClassifier(**param, random_state=3)
    score = cross_val_score(rf, X_train, y_train)
    return 1-score.mean()


# hyperopt中的搜索空间
space_hp = {
    "n_estimators":hp.uniformint("n_estimators", 10, 300),
    "max_depth":hp.uniformint("max_depth", 1, 21),
    "min_samples_split":hp.uniformint("min_samples_split", 2, 20),
    "min_samples_leaf":hp.uniformint("min_samples_leaf", 2, 20)
}


# 记录优化过程,fmin实现一键优化,采用优化算法是tpe
trials = Trials()
param = fmin(fun_hp, space_hp, tpe.suggest, max_evals=100, trials=trials)


param = {k:int(v) for k, v in param.items()}  # 最优超参数
rf_hp = RandomForestClassifier(**res)
rf_hp.fit(X_train, y_train)
rf_hp.score(X_test, y_test)
# hyperopt优化得分:0.965034965034965
  • Skopt-Implementierung

from skopt import forest_minimize, space


# skopt中的目标函数
def fun_sk(param):
    param = dict(zip(['n_estimators', 'max_depth', 'min_samples_split', 'min_samples_leaf'], param))
    rf = RandomForestClassifier(**param)
    score = cross_val_score(rf, X_train, y_train)
    return 1 - score.mean()


# skopt中的搜索空间
space_sk = [
    space.Integer(10, 300, name='n_estimators'),
    space.Integer(1, 21, name='max_depth'),
    space.Integer(2, 20, name='min_samples_split'),
    space.Integer(2, 20, name='min_samples_leaf')
]


# 采用RF进行优化,得到最优超参结果
res = forest_minimize(fun_sk, space_sk)
param = dict(zip(['n_estimators', 'max_depth', 'min_samples_split', 'min_samples_leaf'], res.x))
rf_hp = RandomForestClassifier(**param)
rf_hp.fit(X_train, y_train)
rf_hp.score(X_test, y_test)
# skopt优化得分:0.965034965034965

Im obigen Hyperparameter-Optimierungsprozess wird aufgrund des kleinen verwendeten Datensatzes bei der Formulierung der entsprechenden Zielfunktion die Methode der Kreuzvalidierung angewendet, um die allgemeine Leistung zu verbessern. Gleichzeitig sind die optimalen Optimierungsergebnisse der drei Hyperparameter-Optimierungsmethoden gleich, was einerseits auf den kleinen Datensatz zurückzuführen ist und andererseits auch einen gewissen Grad an Zufälligkeit aufweist. In jedem Fall ähneln sich die drei Optimierungsbibliotheken jedoch hinsichtlich der spezifischen Verwendung und sind hinsichtlich der Optimierungseffekte vergleichbar.

Verwandte Lektüre:

Supongo que te gusta

Origin blog.csdn.net/weixin_43841688/article/details/119307314
Recomendado
Clasificación