Ensemble-Methoden: Elegante Techniken zur Erzielung verbesserter maschineller Lernergebnisse

Veröffentlicht: 2022-03-11

Ensemble Methoden sind Techniken, die mehrere Modelle erstellen und dann kombinieren sie bessere Ergebnisse zu erzielen. Ensemble Methoden produzieren in der Regel genauere Lösungen als ein einziges Modell würde. Dies ist der Fall in einer Reihe von Maschinenlern Wettbewerben, in denen die ausgezeichneten Lösungen ensemble Methoden verwendet. In dem beliebten Netflix Wettbewerb, verwendete der Gewinner eine Ensemble-Methode einen leistungsstarken kollaborative Filteralgorithmus zu implementieren. Ein weiteres Beispiel ist KDD 2009, wo der Gewinner auch Ensemble-Methoden verwendet. Sie können auch Gewinner finden, die diese Methoden in Kaggle Wettbewerben eingesetzt, zum Beispiel hier ist das Interview mit dem Gewinner des Wettbewerbs CrowdFlower.

Es ist wichtig, dass wir ein paar Terminologien verstehen, bevor wir mit diesem Artikel fort. Die ganze Artikel verwenden ich den Begriff „Modell“, um die Ausgabe des Algorithmus zu beschreiben, dass mit Daten trainiert. Dieses Modell ist für die Erstellung von Prognosen dann verwendet. Dieser Algorithmus kann eine beliebigen Maschinenlernalgorithmus sein, wie etwa logistische Regression, Entscheidungsbaum usw. Diese Modelle, wenn sie als Eingänge ensemble Verfahren verwendet wird, werden als „Basismodell“ genannt.

In diesem Blog-Post werde ich Ensemble Methoden für die Klassifizierung abdecken und einige weithin bekannte Verfahren des Ensembles beschreiben: Abstimmung, Stapeln, Verpacken und zu steigern.

Voting und Averaging Based Ensemble Methoden

Voting und Mittelungs sind zwei der einfachsten Methoden Ensemble. Sie sind beide leicht zu verstehen und umzusetzen. Die Abstimmung wird für die Einstufung verwendet und Mittel für die Regression verwendet werden.

Voting und Averaging Based Ensemble Methoden

Bei beiden Verfahren ist der erste Schritt, um mehrere Klassifikation / Regressionsmodelle mit einigen Trainingsdaten zu erstellen. Jedes Basismodell kann mit verschiedenen Aufteilungen des gleichen Trainingsdatenmenge und denselben Algorithmus erstellt werden, oder die gleiche Datenmenge mit verschiedenen Algorithmen, oder jeder anderen Methode. Die folgende Python-artige Pseudo-Code zeigt die Verwendung von gleichem Trainingsdatensatz mit verschiedenen Algorithmen.

 train = load_csv("train.csv") target = train["target"] train = train.drop("target") test = load_csv("test.csv") algorithms = [logistic_regression, decision_tree_classification, ...] #for classification algorithms = [linear_regression, decision_tree_regressor, ...] #for regression predictions = matrix(row_length=len(target), column_length=len(algorithms)) for i,algorithm in enumerate(algorithms): predictions[,i] = algorithm.fit(train, target).predict(test)

Gemäß dem obigen Pseudo-Code haben wir die Prognosen für jedes Modell und bewahrte sie in einer Matrix genannt Vorhersagen, wobei jede Spalte der Prognosen von einem Modell enthält.

Mehrheit

Jedes Modell macht eine Vorhersage (Stimmen) für jede Test-Instanz und die endgültige Ausgabe Vorhersage ist derjenige, der mehr als die Hälfte der abgegebenen Stimmen erhält. Falls keine der Prognosen mehr als die Hälfte der abgegebenen Stimmen erhalten, so können wir sagen, dass das Ensemble Verfahren keine stabile Vorhersage für diese Instanz machen könnte. Obwohl dies eine weit verbreitete Technik ist, können Sie versuchen, die Vorhersage gestimmt (auch wenn dies weniger als die Hälfte der Stimmen) als die endgültige Vorhersage. In einigen Artikeln kann sehen Sie diese Methode „Pluralität voting“ genannt zu werden.

Die gewichteten Voting

Anders als Mehrheit, wobei jedes Modell die gleichen Rechte hat, können wir die Bedeutung eines oder mehrere Modelle erhöhen. In der Stimmengewichtung zählen Sie die Vorhersage der besseren Modelle mehrfach. eine angemessene Menge von Gewichten zu finden, ist Ihnen überlassen.

einfacher Averaging

In einfachen Mittelungsverfahren, für jede Instanz von Testdatensatz werden die durchschnittlichen Prognosen berechnet. Dieses Verfahren reduziert oft Überanpassung und erzeugt eine glattere Regressionsmodell. Die folgenden Pseudo-Code Code zeigt diese einfache Mittelungsverfahren:

 final_predictions = [] for row_number in len(predictions): final_predictions.append( mean(prediction[row_number, ]) )

Weighted Averaging

Gewichtete Mittelung ist eine leicht modifizierte Version von einfachen Mitteln, wobei die Vorhersage eines jeden Modells durch das Gewicht multipliziert und dann wird ihr Mittelwert berechnet. Der folgende Pseudocode Code zeigt die gewichtete Mittelung:

 weights = [..., ..., ...] #length is equal to len(algorithms) final_predictions = [] for row_number in len(predictions): final_predictions.append( mean(prediction[row_number, ]*weights) )

Stapeln mehrerer Modelle für maschinelles Lernen

Stapeln, auch als gestapelte Verallgemeinerung bekannt, ist ein Ensemble, wo die Modelle kombiniert werden, eine weitere Maschinenlernalgorithmus. Die Grundidee ist es, Algorithmen für maschinelles Lernen mit Trainingsdaten zu trainieren und dann einen neuen Datensatz mit diesen Modellen generieren. Dann ist diese neue Datensatz wird als Eingabe für die Kombinierer Maschine Lernalgorithmus verwendet.

Der Pseudo-Code eines Stapelverfahren wird wie nachstehend zusammengefasst:

 base_algorithms = [logistic_regression, decision_tree_classification, ...] #for classification stacking_train_dataset = matrix(row_length=len(target), column_length=len(algorithms)) stacking_test_dataset = matrix(row_length=len(test), column_length=len(algorithms)) for i,base_algorithm in enumerate(base_algorithms): stacking_train_dataset[,i] = base_algorithm.fit(train, target).predict(train) stacking_test_dataset[,i] = base_algorithm.predict(test) final_predictions = combiner_algorithm.fit(stacking_train_dataset, target).predict(stacking_test_dataset)

Wie Sie in dem obigen Pseudo-Code, die Trainingsdaten für Kombinierer Algorithmus sehen können, sind die Ausgänge der Basisalgorithmen erzeugt. In dem Pseudo-Code wird die Basisalgorithmus Trainingsdatenmenge erzeugt, und dann wird die gleiche Datensatz verwendet werden wieder Vorhersagen zu machen. Aber wie wir wissen, in der realen Welt verwenden wir nicht die gleichen Trainingsdaten für die Vorhersage, so dieses Problem zu überwinden einige Implementierungen von Stapeln sehen kann, wo Trainingsdatenmenge aufgeteilt wird. Im Folgenden finden Sie einen Pseudo-Code sehen, wo die Trainingsdaten vor dem Training der Basisalgorithmen aufgeteilt:

 base_algorithms = [logistic_regression, decision_tree_classification, ...] #for classification stacking_train_dataset = matrix(row_length=len(target), column_length=len(algorithms)) stacking_test_dataset = matrix(row_length=len(test), column_length=len(algorithms)) for i,base_algorithm in enumerate(base_algorithms): for trainix, testix in split(train, k=10): #you may use sklearn.cross_validation.KFold of sklearn library stacking_train_dataset[testcv,i] = base_algorithm.fit(train[trainix], target[trainix]).predict(train[testix]) stacking_test_dataset[,i] = base_algorithm.fit(train).predict(test) final_predictions = combiner_algorithm.fit(stacking_train_dataset, target).predict(stacking_test_dataset)

Bagging

Der Name Bagging, auch als „Bagging“ bekannt ist, fasst die wichtigsten Elemente dieser Strategie. In dem Absacken Algorithmus beinhaltet der erste Schritt die Erstellung mehrerer Modelle. Diese Modelle werden erzeugt, um den gleichen Algorithmus mit zufälligen Teilstichproben des Datensatzes verwendet, die aus dem ursprünglichen Datensatzes gezogen werden zufällig mit Bootstrap-Abtastverfahren. In Bootstrap-Sampling werden einige Originale Beispiele mehr als einmal und einige Original-Beispiele sind in der Probe nicht vorhanden ist. Wenn Sie ein Unter Datensatz mit m Elementen erstellen möchten, sollten Sie ein zufälliges Element aus den ursprünglichen Daten-Set m mal wählen. Und wenn das Ziel n-Datensatz erzeugt, folgen Sie diesem Schritt n-mal.

Bagging

Am Ende gebe ich n Datensätze in denen die Anzahl von Elementen in jedem Datensatz m ist. Die folgende Python-artige Pseudocode Show Bootstrap Probenahme:

 def bootstrap_sample(original_dataset, m): sub_dataset = [] for i in range(m): sub_dataset.append( random_one_element(original_dataset) ) return sub_dataset

Der zweite Schritt in Absackung aggregiert die erzeugten Modelle. Gut bekannte Methoden, wie Stimm- und Mittelung werden für diesen Zweck verwendet.

Die Gesamt-Pseudo-Code sieht wie folgt aus:

 def bagging(n, m, base_algorithm, train_dataset, target, test_dataset): predictions = matrix(row_length=len(target), column_length=n) for i in range(n): sub_dataset = bootstrap_sample(train_dataset, m) predictions[,i] = base_algorithm.fit(original_dataset, target).predict(test_dataset) final_predictions = voting(predictions) # for classification final_predictions = averaging(predictions) # for regression return final_predictions die def bagging(n, m, base_algorithm, train_dataset, target, test_dataset): predictions = matrix(row_length=len(target), column_length=n) for i in range(n): sub_dataset = bootstrap_sample(train_dataset, m) predictions[,i] = base_algorithm.fit(original_dataset, target).predict(test_dataset) final_predictions = voting(predictions) # for classification final_predictions = averaging(predictions) # for regression return final_predictions die def bagging(n, m, base_algorithm, train_dataset, target, test_dataset): predictions = matrix(row_length=len(target), column_length=n) for i in range(n): sub_dataset = bootstrap_sample(train_dataset, m) predictions[,i] = base_algorithm.fit(original_dataset, target).predict(test_dataset) final_predictions = voting(predictions) # for classification final_predictions = averaging(predictions) # for regression return final_predictions

In Absacken kann jede Unterproben unabhängig voneinander erzeugt werden. So Generation und Ausbildung kann parallel durchgeführt werden.

Sie können auch die Umsetzung der Verpackungsstrategie in einigen Algorithmen finden. Zum Beispiel verwendet Random Forest Algorithmus die Absackung Technik mit einigen Unterschieden. Zufällige Wald verwendet Zufallsmerkmalsauswahl und die Basis-Algorithmus ist ein Entscheidungsbaum-Algorithmus.

Siehe auch: Ein Deep-Learning-Tutorial: Von Perceptrons zu Deep Networks

Steigerung: Konvertieren Schwache Modelle zu Starken

Der Begriff „Verstärkung“ wird verwendet, um eine Familie von Algorithmen zu beschreiben, die in der Lage schwache Modelle zu starken Modellen zu konvertieren. Das Modell ist schwach, wenn es eine erhebliche Fehlerrate hat, aber die Leistung ist nicht zufällig (was zu einer Fehlerrate von 0,5 für binäre Klassifizierung). Boosting baut inkrementell ein Ensemble, indem jedes Modell mit dem gleichen Datensatz trainiert, aber wobei die Gewichte von Instanzen angepasst sind nach dem Fehler von der letzten Vorhersage. Die Hauptidee zwingt die Modelle auf den Instanzen zu konzentrieren, die hart sind. Im Gegensatz zu Absacken, ist die Förderung ein sequentielles Verfahren, und damit Sie nicht parallele Operationen hier verwenden können.

Das allgemeine Verfahren des Boosting-Algorithmus ist wie folgt definiert:

 def adjust_dataset(_train, errors): #create a new dataset by using the hardest instances ix = get_highest_errors_index(train) return concat(_train[ix], random_select(train)) models = [] _train = random_select(train) for i in range(n): #n rounds model = base_algorithm.fit(_train) predictions = model.predict(_train) models.append(model) errors = calculate_error(predictions) _train = adjust_dataset(_train, errors) final_predictions = combine(models, test)

Die adjust_dataset Funktion gibt einen neuen Datensatz die härtesten Fälle enthalten, die dann verwendet werden kann, die Basis-Algorithmus zu zwingen, um daraus zu lernen.

AdaBoost ist ein weithin bekannter Algorithmus, der eine Steigerung der Methode. Die Gründer von AdaBoost gewann den Gödel-Preis für ihre Arbeit. Zumeist Entscheidungsbaumalgorithmus AdaBoost als Basis-Algorithmus bevorzugt und in sklearn Bibliothek der Standard-Basis-Algorithmus für AdaBoost ist Entscheidungsbaum (AdaBoostRegressor und AdaBoostClassifier). Wie wir im vorhergehenden Absatz diskutiert, gilt die gleiche inkrementale Methode für AdaBoost. Informationen zu jedem Schritt des AdaBoost Algorithmus über die ‚Härte‘ eines jeden Trainingsprobe gesammelt werden in das Modell eingespeist. Die ‚Einstellen-Datensatz‘ Schritt unterscheidet sich von dem oben beschriebenen und die ‚Kombination von Modellen‘ Schritt wird unter Verwendung von gewichteten Abstimmung berechnet.

Fazit

Obwohl Ensemble Methoden können Sie mit der Ausarbeitung komplexe Algorithmen für maschinelles Lernen Wettbewerbe helfen zu gewinnen und die Ergebnisse mit hohen Genauigkeit produziert, ist es oft nicht in den Branchen bevorzugt, bei denen der Interpretierbarkeit wichtiger ist. Dennoch ist die Wirksamkeit dieser Methoden nicht zu leugnen, und ihre Vorteile in entsprechenden Anwendungen können enorm sein. In Bereichen wie Gesundheitswesen, sogar die kleinste Menge an Verbesserungen in der Genauigkeit der Algorithmen des maschinellen Lernens kann etwas wirklich wertvoll sein.

Verwandt:
  • Eine Einführung in die Theorie des maschinellen Lernens und ihre Anwendungen: Ein visuelles Tutorial mit Beispielen
  • Maschinen und Vertrauen: Wie Mitigate AI Bias