Python-Machine-Learning-Fusionsmodell: Stapeln und Mischen (mit Code)

1 Stapelmethode Stapeln

Kann aus einem schwachen System ein starkes System werden?

Bild


Wenn Sie mit einem komplexen Klassifizierungsproblem konfrontiert sind, wie es auf den Finanzmärkten häufig der Fall ist, können sich bei der Suche nach einer Lösung unterschiedliche Ansätze ergeben. Obwohl diese Methoden Klassifikationen schätzen können, sind sie manchmal nicht besser als andere Klassifikationen. In diesem Fall besteht die logische Entscheidung darin, sie alle beizubehalten und dann durch die Integration der Teile das endgültige System zu schaffen. Dieser abwechslungsreiche Ansatz ist einer der bequemsten: Teilen Sie Ihre Entscheidungen auf mehrere Systeme auf, um nicht alle Eier in einen Korb zu legen.

Wie kann ich die Entscheidungen von N Subsystemen kombinieren, wenn ich eine große Anzahl von Schätzungen für diese Situation habe? Als schnelle Antwort kann ich eine durchschnittliche Entscheidung treffen und diese verwenden. Aber gibt es eine andere Möglichkeit, mein Subsystem vollständig zu nutzen? Natürlich!

Denken Sie kreativ!
Mehrere Klassifikatoren mit einem gemeinsamen Ziel werden Multiklassifikatoren genannt. Beim maschinellen Lernen handelt es sich bei einem Multiklassifikator um eine Reihe verschiedener Klassifikatoren, die geschätzt und zusammengeführt werden, um ein Ergebnis zu erhalten, das sie kombiniert. Für Multi-Klassifikatoren werden viele Begriffe verwendet: Multi-Modell, Multi-Klassifikatorsystem, Kombinationsklassifikator, Entscheidungsausschuss usw. Sie können in zwei große Kategorien unterteilt werden:

Integrierte Methode: bezieht sich auf die Verwendung derselben Lerntechnologie, um eine Reihe von Systemen zu kombinieren und so ein neues System zu erstellen. Das Einsacken und Heben ist am umfangreichsten.
Hybride Methoden: Nehmen Sie eine unterschiedliche Gruppe von Lernenden und kombinieren Sie sie mithilfe neuer Lerntechnologien. Stapeln (oder gestapelte Verallgemeinerung) ist einer der wichtigsten hybriden Mehrfachklassifikatoren.

So erstellen Sie einen Multi-Klassifikator mit Stacking-Unterstützung.

Bild

Bild

Stapel-Workflow

Bild

.

Metaklassifikatoren können auf vorhergesagte Klassenbezeichnungen oder auf vorhergesagte Klassenwahrscheinlichkeiten trainiert werden.

Bild

Bild

Geben Sie ein Beispiel für die Stapelung, um den Trend des EURUSD vorherzusagen

Stellen Sie sich vor, ich möchte den Trend von EURUSD (EUR/USD-Trend) abschätzen. Zuerst habe ich mein Problem in ein Klassifizierungsproblem umgewandelt, also habe ich die Preisdaten in zwei Typen (oder Klassen) unterteilt: Aufwärts- und Abwärtsbewegungen. Es ist nicht meine Absicht, jeden Schritt, den ich jeden Tag mache, zu hinterfragen. Ich möchte nur die Haupttrends erkennen: Long-Trades nach oben (Klasse = 1) und Short-Trades nach unten (Klasse = 0).

Bild

Ich habe eine nachträgliche Aufteilung durchgeführt; ich meine, alle historischen Daten werden zur Entscheidung über die Klassen verwendet, sodass einige zukünftige Informationen berücksichtigt werden. Daher kann ich derzeit keine Auf- oder Abbewegung gewährleisten. Daher ist eine Schätzung für den heutigen Verlauf erforderlich.

Bild

Für dieses Beispiel habe ich drei separate Systeme entworfen. Es handelt sich um drei verschiedene Lernende, die unterschiedliche Sätze von Attributen verwenden. Es spielt keine Rolle, ob Sie denselben Lernalgorithmus verwenden oder ob sie einige oder alle Eigenschaften gemeinsam haben. Der Punkt ist, dass sie unterschiedlich genug sein müssen, um Vielfalt zu gewährleisten.

Bild

Anschließend handeln sie auf der Grundlage dieser Wahrscheinlichkeiten: Wenn E über 50 % liegt, bedeutet dies, dass sie eine Long-Position einnehmen, je größer E ist. Liegt E unter 50 %, handelt es sich um einen Short-Einstieg, je kleiner E.

Bild

Nicht ideal, nur besser als zufällig

Bild

Auch systematische Fehler sind weniger korreliert

Bild

Kann eine Gruppe schwächerer Spieler ein Traumteam bilden?
Der Zweck der Erstellung mehrerer Klassifikatoren besteht darin, eine bessere Vorhersageleistung zu erzielen, als dies mit jedem einzelnen Klassifikator möglich ist. Mal sehen, ob das der Fall ist.

Die Methode, die ich in diesem Beispiel verwenden werde, basiert auf dem Stacking-Algorithmus. Die Idee des Stapelns besteht darin, dass die Ausgabe eines Hauptklassifikators, der als Level-0-Modell bezeichnet wird, als Attribute eines anderen Klassifikators, der als Metamodell bezeichnet wird, verwendet wird, um dasselbe Klassifizierungsproblem anzunähern. Es bleibt dem Metamodell überlassen, den Zusammenführungsmechanismus herauszufinden. Es ist für die Verbindung der Antwort und der tatsächlichen Klassifizierung des Level-0-Modells verantwortlich.

Das strenge Verfahren beinhaltet die Aufteilung des Trainingssatzes in disjunkte Sätze. Trainieren Sie dann jeden Lernenden der Stufe 0 anhand der gesamten Daten, schließen Sie eine Gruppe aus und wenden Sie sie auf die ausgeschlossene Gruppe an. Durch die Wiederholung für jede Gruppe wird eine Schätzung aller Daten für jeden Lernenden erhalten. Diese Schätzungen werden zu Attributen des trainierten Metamodells oder Level-1-Modells. Da es sich bei meinen Daten um eine Zeitreihe handelt, habe ich beschlossen, die Menge von Tag 1 bis Tag d-1 zu verwenden, um die Schätzung für Tag d zu erstellen.

Bild

Mit welchem ​​Modus funktioniert das?
Das Metamodell kann ein Klassifizierungsbaum, eine Zufallsstruktur, eine Support-Vektor-Maschine sein ... jeder Klassifizierungslerner ist effektiv. Für dieses Beispiel habe ich mich für die Verwendung des Algorithmus „Nächster Nachbar“ entschieden. Das bedeutet, dass das Metamodell die Kategorien neuer Daten schätzt, um ähnliche Konfigurationen von Klasse-0-Klassifizierungen in früheren Daten zu entdecken, und diesen ähnlichen Situationen dann Kategorien zuordnet.

Mal sehen, wie gut sich mein Traumteam entwickelt hat …

Der durchschnittliche Fehlerwert des Stapelmodells ist am niedrigsten

Bild

Schlussfolgerung
Dies ist nur ein Beispiel für die große Anzahl verfügbarer Multiklassifikatoren. Sie können Ihnen nicht nur dabei helfen, einen Teil Ihrer Lösung mithilfe moderner und origineller Techniken in eine einzigartige Antwort zu integrieren, sondern sie können auch ein echtes Traumteam bilden. Auch bei der Integration einzelner Komponenten in ein System gibt es erhebliches Verbesserungspotenzial.

Wenn Sie also das nächste Mal eine Kombination benötigen, sollten Sie etwas mehr Zeit damit verbringen, die Möglichkeiten zu recherchieren. Vermeiden Sie traditionelle Durchschnittswerte und erkunden Sie aus Gewohnheit anspruchsvollere Ansätze. Sie können Ihnen zusätzliche Leistung verschaffen

Modellfusionsanwendung im Kaggle-Wettbewerb

Die Modellfusion ist eine sehr leistungsstarke Technik, die die Genauigkeit verschiedener ML-Aufgaben verbessern kann. In diesem Artikel werde ich meinen Ansatz zur Integration in Kaggle-Wettbewerbe teilen.

Im ersten Teil betrachten wir die Erstellung einer Integration aus einer Commit-Datei. Der zweite Teil befasst sich mit der Bildung von Ensembles durch gestapelte Generalisierung/Hybridisierung.

Ich antworte, warum Ensemble Generalisierungsfehler reduziert. Abschließend zeige ich verschiedene Integrationsmethoden sowie deren Ergebnisse und Code, damit Sie es selbst ausprobieren können. Kaggle Ensembling Guide Ich beantworte, warum Ensembles Generalisierungsfehler reduzieren. Abschließend zeige ich verschiedene Integrationsmethoden sowie deren Ergebnisse und Code, damit Sie es selbst ausprobieren können.

Die gestapelte Generierungsmethode ist eine völlig andere Methode zum Kombinieren mehrerer Modelle. Sie befasst sich mit dem Konzept kombinierter Lernender, wird jedoch weniger verwendet als Bagging und Boosting. Es ist nicht wie Bagging und Boosting, sondern so Kombinieren Sie verschiedene Modelle. Der spezifische Prozess ist wie folgt:
1. Teilen Sie den Trainingsdatensatz in zwei disjunkte Sätze.
2. Trainieren Sie mehrere Lernende im ersten Satz.
3. Testen Sie diese Lernenden im zweiten Satz
4. Verwenden Sie die im dritten Schritt erhaltenen Vorhersageergebnisse als Eingabe und verwenden Sie die richtige Antwort als Ausgabe, trainieren Sie ein Lernender auf hohem Niveau,
Was hier beachtet werden muss, ist der Effekt der Schritte 1 bis 3 und der Kreuzvalidierung. Wir verwenden nicht den Gewinner-Take-All, sondern eine nichtlineare Methode Kombinationslernmethode.

Bild

Alle trainierten Basismodelle werden verwendet, um den gesamten Trainingssatz vorherzusagen. Der vorhergesagte Wert des j-ten Basismodells für die i-te Trainingsstichprobe wird als j-ter Merkmalswert der i-ten Probe im neuen verwendet Trainingssatz. Schließlich basierend auf dem neuen Trainingssatz für das Training. Ebenso muss der Vorhersageprozess zunächst die Vorhersagen aller Basismodelle durchlaufen, um einen neuen Testsatz zu bilden, und schließlich den Testsatz vorhersagen:

Im Folgenden stellen wir ein leistungsstarkes Stapeltool vor, die mlxtend-Bibliothek, mit der das Sklearn-Modell schnell gestapelt werden kann.

StackingClassifier verwendet API und Parameteranalyse:

StackingClassifier(classifiers, meta_classifier, use_probas=False,  average_probas=False, verbose=0, use_features_in_secondary=False)

Parameter:

Klassifizierer: Basisklassifizierer, Array-Form, [cl1, cl2, cl3]. Die Attribute jedes Basisklassifikators werden im Klassenattribut self.clfs_ gespeichert.
meta_classifier: Zielklassifikator Dies ist ein Klassifikator, der die vorherigen Klassifikatoren kombiniert
use_probas: bool (Standard: False). Wenn auf True gesetzt, ist die Eingabe des Zielklassifikators der Kategoriewahrscheinlichkeitswert der vorherigen Klassifizierungsausgabe . Keine Kategoriebezeichnung
Average_Probas: bool (Standard: False), wird verwendet, um festzulegen, ob der vorherige Parameter den Durchschnitt verwendet, wenn die Wahrscheinlichkeitswertausgabe verwendet wird.
ausführlich: int, optional (Standard=0). Wird verwendet, um die Protokollausgabe während der Verwendung zu steuern. Bei verbose = 0 wird nichts ausgegeben. Bei verbose = 1 werden die Seriennummer und der Name des Regressors ausgegeben. verbose = 2, detaillierte Parameterinformationen ausgeben. verbose > 2, Verbose automatisch auf weniger als 2 setzen, verbose -2.
use_features_in_secondary: bool (Standard: False). Wenn auf True gesetzt, basiert der endgültige Zielklassifikator auf dem Klassifikator wird auf den Daten trainiert, die gleichzeitig mit dem Originaldatensatz generiert werden. Wenn es auf „Falsch“ gesetzt ist, wird der endgültige Klassifikator nur mit den vom Basisklassifikator erzeugten Daten trainiert.

Attribute:
clfs_: Attribute jedes Basisklassifikators, jeder Liste und jeder Form sind [n_classifiers].
meta_clf_: Attribute des endgültigen Zielklassifikators

Methode:

fit(X, y)
fit_transform(X, y=None, fit_params)
get_params(deep=True), wenn sklearn GridSearch verwendet wird Methode und geben Sie dann die Parameter des Klassifikators zurück.
Predict(X)
Predict_proba(X)
Score(X, y, sample_weight=None) für die angegebenen Daten Festlegen und gegebene Bezeichnung, Rückgabe der Bewertungsgenauigkeit
set_params(params), Festlegen der Parameter des Klassifikators, die Einstellungsmethode von params ist dieselbe wie das Format von sklearn 

Teil des eigentlichen Codes des Python-Fusionsmodells

#原创公众号python风控模型
from sklearn.datasets import load_iris 
from mlxtend.classifier import StackingClassifier 
from mlxtend.feature_selection import ColumnSelector 
from sklearn.pipeline import make_pipeline 
from sklearn.linear_model import LogisticRegression 
   
iris = load_iris() 
X = iris.data 
y = iris.target 
   
pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)), 
                      LogisticRegression()) 
pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)), 
                      LogisticRegression()) 
   
sclf = StackingClassifier(classifiers=[pipe1, pipe2],  
                          meta_classifier=LogisticRegression()) 
   
sclf.fit(X, y)  

1.1 Grundidee der Stapelmethode

Stacking-Methode Stacking ist in den letzten Jahren die beliebteste Methode im Bereich der Modellfusion. Es ist nicht nur eine der am häufigsten von Wettbewerbsmeisterteams verwendeten Fusionsmethoden, sondern auch eine der Lösungen, die in Betracht gezogen werden bei der tatsächlichen Implementierung künstlicher Intelligenz in der Industrie. Als Fusionsmethode für starke Lerner kombiniert Stacking die drei Hauptvorteileguter Modelleffekt, starke Interpretierbarkeit und Anpassungsfähigkeit an komplexe Daten und ist die beste fortgeschritten auf dem Gebiet der Fusion. Ein praktischer Pionieransatz. Unter den vielen Anwendungen des Stapelns ist das praktische GBDT + LR-Stacking in der CTR (Advertising Click-Through-Rate-Vorhersage) besonders bekannt. Daher werde ich im Hauptkurs „2022 Machine Learning Practice“ nach der Erläuterung der gängigen Stapelmethoden die Verwendung von GBDT+LR in CTR ausführlich erläutern und eine CTR-Übung absolvieren.

Was für ein Algorithmus ist Stacking? Die Kernidee ist eigentlich sehr einfach: Erstens gibt es, wie in der folgenden Abbildung dargestellt, zwei Ebenen von Algorithmen in der Stapelstruktur. Die erste Ebene heißt Ebene 0 und die zweite Ebene heißt Ebene 1. Ebene 0 kann eine enthalten oder stärkere Algorithmen. Lernender, während Stufe 1 nur einen Lernenden enthalten kann. Während des Trainings werden die Daten zunächst für das Training in Ebene 0 eingegeben. Nach dem Training gibt jeder Algorithmus in Ebene 0 entsprechende Vorhersageergebnisse aus. Wir fügen diese Vorhersageergebnisse zu einer neuen Merkmalsmatrix zusammen und geben sie dann zum Training in den Level-1-Algorithmus ein. Das vom Fusionsmodell ausgegebene endgültige Vorhersageergebnis ist das vom Lernenden der Stufe 1 ausgegebene Ergebnis.

Bild

In diesem Prozess sind die von Ebene 0 ausgegebenen Vorhersageergebnisse im Allgemeinen wie folgt angeordnet:

Lernender 1 Lernender 2 ... lernen
Probe 1 xxx xxx ... xxx
Probe 2 xxx xxx ... xxx
Probe 3 xxx xxx ... xxx
... ... ... ... ...
Probe m xxx xxx ... xxx

Die erste Spalte ist die Ergebnisausgabe von Lernendem 1 für alle Stichproben, die zweite Spalte ist die Ergebnisausgabe von Lernendem 2 für alle Stichproben und so weiter.
Gleichzeitig werden mehrere starke Lernende, die auf Stufe 0 trainiert wurden, als Basislerner (Basismodell) oder auch als Einzellerner bezeichnet. Der auf Stufe 1 trainierte Lernende wird Meta-Lernender (Meta-Modell) genannt. Laut Branchenpraxis ist der Lernende auf Stufe 0 ein Lernender mit hoher Komplexität und starken Lernfähigkeiten, wie z. B. Ensemble-Algorithmus und Support-Vektor-Maschine, und < /span>, wie Entscheidungsbäume, lineare Regression, logistische Regression usw. Es besteht eine solche Anforderung, da die Verantwortung der Algorithmen auf Ebene 0 darin besteht, die Beziehung zwischen den Originaldaten und dem Etikett zu finden, das heißt, die Hypothese zwischen den Originaldaten und dem Etikett aufzustellen, weshalb starke Lernfähigkeiten erforderlich sind. Die Verantwortung des Algorithmus der Stufe 1 besteht jedoch darin, die von den einzelnen Lernenden getroffenen Annahmen zusammenzuführen und schließlich die Ergebnisse des Fusionsmodells auszugeben. Dies entspricht dem Finden der „besten Fusionsregel“ und nicht der direkten Festlegung von Annahmen zwischen den Originaldaten und Etiketten. Lernende auf Stufe 1 sind gut interpretierbar und relativ einfach Lernende

Apropos, ich frage mich, ob Ihnen aufgefallen ist, dass das Wesentliche beim Stapeln darin besteht, den Algorithmus die Fusionsregeln finden zu lassen. Obwohl die meisten Menschen möglicherweise noch nie mit einer Reihenstruktur ähnlich dem Stacking-Algorithmus in Berührung gekommen sind, stimmt der Stacking-Prozess tatsächlich vollständig mit der Abstimmungsmethode und der Mittelungsmethode überein:

Bild

Bei der Abstimmungsmethode verwenden wir Abstimmungen, um die Ergebnisse starker Lernender zusammenzuführen. Bei der Mittelungsmethode verwenden wir Mittelung, um die Ergebnisse starker Lernender zusammenzuführen. Bei der Stapelmethode verwenden wir Algorithmen, um die Ergebnisse starker Lernender zusammenzuführen. Wenn der Algorithmus auf Ebene 1 eine lineare Regression ist, lösen wir tatsächlich die gewichtete Summe aller starken Lernergebnisse, und der Prozess des Trainings der linearen Regression ist der Prozess, das Gewicht der gewichteten Summe zu ermitteln. Wenn es sich bei dem Algorithmus auf Ebene 1 um eine logistische Regression handelt, lösen wir in ähnlicher Weise tatsächlich die gewichtete Summe aller Ergebnisse starker Lerner und wenden dann die Sigmoidfunktion basierend auf der Summe an. Beim Training der logistischen Regression werden die Gewichte der gewichteten Summe ermittelt. Das Gleiche gilt für jeden anderen einfachen Algorithmus.

Obwohl es für die meisten Algorithmen schwierig ist, einen klaren Namen wie „gewichtete Summe“ zu finden, um die vom Algorithmus gefundenen Fusionsregeln zusammenzufassen, lernt der Level-1-Algorithmus im Wesentlichen nur, wie man Level-Ergebnisse kombiniert Ausgaben auf 0 werden besser kombiniert, daher Stacking ist eine Methode zum Zusammenführen der Ergebnisse des Lernenden durch Training des Lernenden. Die Mittelungsmethode besteht darin, die Ausgabeergebnisse zu mitteln, und die Abstimmungsmethode besteht darin, die Ausgabeergebnisse abzustimmen. Die ersten beiden sind künstlich definierte Fusionsmethoden, aber diese Stapelung dient dazu, dass die Maschine uns bei der Suche hilft die beste Fusionsmethode.  Der grundlegende Vorteil dieser Methode besteht darin, dass wir den Meta-Lernenden auf Ebene 1 in Richtung der Minimierung der Verlustfunktion trainieren können, während andere Fusionsmethoden nur sicherstellen können, dass das Fusionsergebnis eine bestimmte hat fördern. Daher ist Stacking eine effektivere Methode als Voting und Averaging. In praktischen Anwendungen übertrifft Stacking häufig Abstimmungs- oder Mittelungsmethoden.
Nachdem wir die Essenz von Stacking verstanden haben, werden viele detaillierte Probleme im Implementierungsprozess leicht gelöst, wie zum Beispiel:

  • Müssen Sie präzise Parameteranpassungen am Fusionsalgorithmus vornehmen?

Der einzelne Lerner wird grob abgestimmt und der Meta-Lernende wird fein abgestimmt. Wenn die Passung nicht ausreicht, können beide Lerntypen fein abgestimmt werden. Theoretisch ist es umso besser, je näher die Algorithmusausgabe an der tatsächlichen Bezeichnung liegt. Allerdings kann es bei einzelnen Lernenden nach der Feinabstimmung und anschließenden Fusion leicht zu einer Überanpassung kommen.

  • Wie wählt man den individuellen Lernalgorithmus aus, um den Effekt des Stapelns zu maximieren?

Kontrollieren Sie im Einklang mit Abstimmung und Mittelung die Überanpassung, erhöhen Sie die Diversität und achten Sie auf die Gesamtrechenzeit des Algorithmus.

  • Kann der einzelne Lernende ein weniger komplexer Algorithmus wie logistische Regression oder Entscheidungsbaum sein? Kann der Meta-Lerner ein sehr komplexer Algorithmus wie xgboost sein?

Alles ist in Ordnung, alles unterliegt dem Modelleffekt. Für Stufe 0 können diese Algorithmen beibehalten werden, wenn schwache Lernende hinzugefügt werden, um die Modellvielfalt zu erhöhen und die Auswirkungen schwacher Lernender besser sind. Für Level 1 kann jeder Algorithmus verwendet werden, solange er nicht überpasst. Persönliche Empfehlung ist, dass Sie komplexere Algorithmen zur Klassifizierung verwenden können, für die Regression ist es jedoch am besten, einfache Algorithmen zu verwenden.

  • Können Level-0- und Level-1-Algorithmen unterschiedliche Verlustfunktionen verwenden?

Ja, denn verschiedene Verlustfunktionen messen tatsächlich ähnliche Unterschiede: den Unterschied zwischen dem wahren Wert und dem vorhergesagten Wert. Unterschiedliche Verluste reagieren jedoch unterschiedlich empfindlich, und es wird empfohlen, nach Möglichkeit ähnliche Verlustfunktionen zu verwenden.

  • Können Level-0- und Level-1-Algorithmen unterschiedliche Bewertungsmetriken verwenden?

Persönlicher VorschlagDie Algorithmen auf Ebene 0 und Ebene 1 müssen denselben Modellbewertungsindex verwenden. Obwohl beim Stacking zwei Gruppen von Algorithmen in Reihe geschaltet sind, ist das Training dieser beiden Gruppen von Algorithmen vollständig getrennt. Beim Deep Learning haben wir auch eine ähnliche Struktur leistungsstarker Algorithmen, die mit schwachen Algorithmen in Reihe geschaltet sind. Beispielsweise besteht ein Faltungs-Neuronales Netzwerk aus einer leistungsstarken Faltungsschicht und einer schwachen linearen Schicht, die in Reihe geschaltet sind. Die Hauptverantwortung der Faltungsschicht liegt darin Um die Beziehung zwischen Merkmalen und Beschriftungen herauszufinden, besteht die Hauptaufgabe der linearen Schicht darin, Annahmen und Ausgaben zu integrieren. Beim Deep Learning wird jedoch das Training aller Schichten in einem Netzwerk gleichzeitig durchgeführt, und die Gewichte im gesamten Netzwerk müssen jedes Mal aktualisiert werden, wenn die Verlustfunktion reduziert wird. Beim Stapeln hat der Algorithmus auf Ebene 1 jedoch keinerlei Einfluss auf die Ergebnisse von Ebene 0, wenn das Gewicht angepasst wird. Um sicherzustellen, dass die beiden Gruppen von Algorithmen nach der endgültigen Fusion die gewünschten Ergebnisse erzielen können, ist dies der einzige Der Bewertungsindex muss während des Trainings verwendet werden. Grundlinie für das Training.

2 Implementieren Sie das Stapeln in sklearn

Klasse sklearn.ensemble.StackingClassifier(
Schätzer,
final_estimator=None, *,
cv=None,
stack_method="auto",
n_jobs=None,
passthrough=False,
verbose=0)

Klasse sklearn.ensemble.StackingRegressor(
Schätzer,
final_estimator=None,*,
cv=None,
n_jobs=None,
passthrough=False,
verbose=0)

Parameter veranschaulichen
Schätzer Liste der einzelnen Bewerter. Wenn in sklearn nur ein einzelner Evaluator als einzelner Evaluator verwendet wird, kann das
-Modell ausgeführt werden, der Effekt ist jedoch häufig nicht sehr gut.
final_estimator Meta-Lerner, es kann nur einen Bewerter geben. Wenn das Fusionsmodell eine Klassifizierungsaufgabe ausführt, muss der Meta-Lernende ein Klassifizierungsalgorithmus sein.
Wenn das Fusionsmodell eine Regressionsaufgabe ausführt, muss der Meta-Lernende ein Regressionsalgorithmus sein.
Lebenslauf wird verwendet, um den spezifischen Typ, die Faltungsnummer und andere Details der Kreuzvalidierung anzugeben.
Sie können eine einfache K-fache Kreuzvalidierung durchführen oder die Kreuzvalidierungsklasse in sklearn eingeben.
stack_method Für Klassifikatoren einzigartige Parameter stellen die spezifischen Testergebnisse dar, die von einzelnen Lernenden ausgegeben werden.
Passthrough Legen Sie beim Training des Meta-Lernenden fest, ob die Originaldaten als Merkmalsmatrix hinzugefügt werden sollen.
n_jobs, ausführlich Anzahl der Threads und Überwachungsparameter.

Geben Sie in sklearn einfach estimators und final_estimator ein, um das Stapeln durchzuführen. Wir können weiterhin die Kombination einzelner Lernender verwenden, die in der Abstimmungsmethode verwendet wurde, und zufällige Wälder als Meta-Lernende verwenden, um das Stapeln abzuschließen:

  • Werkzeugbibliothek und Daten
#常用工具库
import re
import numpy as np
import pandas as pd
import matplotlib as mlp
import matplotlib.pyplot as plt
import time

#算法辅助 & 数据
import sklearn
from sklearn.model_selection import KFold, cross_validate
from sklearn.datasets import load_digits #分类 - 手写数字数据集
from sklearn.datasets import load_iris
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

#算法(单一学习器)
from sklearn.neighbors import KNeighborsClassifier as KNNC
from sklearn.neighbors import KNeighborsRegressor as KNNR
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.linear_model import LinearRegression as LR
from sklearn.linear_model import LogisticRegression as LogiR
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.ensemble import GradientBoostingRegressor as GBR
from sklearn.ensemble import GradientBoostingClassifier as GBC
from sklearn.naive_bayes import GaussianNB
import xgboost as xgb

#融合模型
from sklearn.ensemble import StackingClassifier
data = load_digits()
X = data.data
y = data.target

X.shape

np.unique(y) #10分类

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.2,random_state=1412)

Bild

  • Definieren Sie die Kreuzvalidierungsfunktion
def fusion_estimators(clf):
    """
    对融合模型做交叉验证,对融合模型的表现进行评估
    """
    cv = KFold(n_splits=5,shuffle=True,random_state=1412)
    results = cross_validate(clf,Xtrain,Ytrain
                             ,cv = cv
                             ,scoring = "accuracy"
                             ,n_jobs = -1
                             ,return_train_score = True
                             ,verbose=False)
    test = clf.fit(Xtrain,Ytrain).score(Xtest,Ytest)
    print("train_score:{}".format(results["train_score"].mean())
          ,"
 cv_mean:{}".format(results["test_score"].mean())
          ,"
 test_score:{}".format(test)
         )
def individual_estimators(estimators):
    """
    对模型融合中每个评估器做交叉验证,对单一评估器的表现进行评估
    """
    for estimator in estimators:
        cv = KFold(n_splits=5,shuffle=True,random_state=1412)
        results = cross_validate(estimator[1],Xtrain,Ytrain
                             ,cv = cv
                             ,scoring = "accuracy"
                             ,n_jobs = -1
                             ,return_train_score = True
                             ,verbose=False)
        test = estimator[1].fit(Xtrain,Ytrain).score(Xtest,Ytest)
        print(estimator[0]
          ,"
 train_score:{}".format(results["train_score"].mean())
          ,"
 cv_mean:{}".format(results["test_score"].mean())
          ,"
 test_score:{}".format(test)
          ,"
")
  • Definition einzelner Lernender und Meta-Lernender

Als wir zuvor die Abstimmungsmethode erklärt haben, haben wir ausführlich erläutert, wie einzelne Lernende definiert werden, und haben uns auch große Mühe gegeben, die folgenden 7 Modelle zu finden. Hier verwenden wir die 7 aus der Abstimmung ausgewählten Modelle:

#逻辑回归没有增加多样性的选项
clf1 = LogiR(max_iter = 3000, C=0.1, random_state=1412,n_jobs=8)
#增加特征多样性与样本多样性
clf2 = RFC(n_estimators= 100,max_features="sqrt",max_samples=0.9, random_state=1412,n_jobs=8)
#特征多样性,稍微上调特征数量
clf3 = GBC(n_estimators= 100,max_features=16,random_state=1412) 

#增加算法多样性,新增决策树与KNN
clf4 = DTC(max_depth=8,random_state=1412)
clf5 = KNNC(n_neighbors=10,n_jobs=8)
clf6 = GaussianNB()

#新增随机多样性,相同的算法更换随机数种子
clf7 = RFC(n_estimators= 100,max_features="sqrt",max_samples=0.9, random_state=4869,n_jobs=8)
clf8 = GBC(n_estimators= 100,max_features=16,random_state=4869)

estimators = [("Logistic Regression",clf1), ("RandomForest", clf2)
              , ("GBDT",clf3), ("Decision Tree", clf4), ("KNN",clf5) 
              #, ("Bayes",clf6)
              , ("RandomForest2", clf7), ("GBDT2", clf8)
             ]
  • Sklearn zur Modellierung importieren
#选择单个评估器中分数最高的随机森林作为元学习器
#也可以尝试其他更简单的学习器
final_estimator = RFC(n_estimators=100
                      , min_impurity_decrease=0.0025
                      , random_state= 420, n_jobs=8)
clf = StackingClassifier(estimators=estimators #level0的7个体学习器
                         ,final_estimator=final_estimator #level 1的元学习器
                         ,n_jobs=8)

Vor dem Anpassen der Anpassung: das heißt, ohne min_impurity_decrease=0,0025 hinzuzufügen

fusion_estimators(clf) #没有过拟合限制
""
train_score:1.0 
 cv_mean:0.9812112853271389 
 test_score:0.9861111111111112
""

Nach dem Hinzufügen von Überanpassung

fusion_estimators(clf) #精调过拟合
""
train_score:1.0 
 cv_mean:0.9812185443283005 
 test_score:0.9888888888888889
""
Benchmark Wahlgesetze Stapelmethode
5-fache Kreuzvalidierung 0,9666 0,9833 0,9812(↓)
Ergebnisse des Testsatzes 0,9527 0,9889 0,9889(-)

Es ist ersichtlich, dass die Stapelbewertung im Testsatz mit der Bewertungsmethode identisch ist, die 5-fache Kreuzvalidierungsbewertung jedoch nicht so hoch ist wie die Bewertungsmethode. Das mag daran liegen, dass die Daten, die wir jetzt trainieren, relativ einfach sind, aber wenn das Datenlernen schwieriger wird, werden die Vorteile des Stapelns langsam zum Vorschein kommen. Natürlich verfügt der Meta-Lerner, den wir jetzt verwenden, fast über Standardparameter. Wir können die Bayes'sche Optimierung verwenden, um die Parameter des Meta-Lerners zu optimieren und sie dann zu vergleichen. Der Effekt der Stapelmethode kann den der Abstimmungsmethode übertreffen.

Merkmalsmatrix des 3-Elemente-Lernenden

3.1 Zwei Probleme mit Meta-Lerner-Feature-Matrizen

Im Stapelprozess trainieren und prognostizieren einzelne Lernende anhand der Originaldaten, ordnen die Vorhersageergebnisse dann in einer neuen Merkmalsmatrix an und geben sie zum Lernen in den Meta-Lernenden ein. Darunter sind die Vorhersageergebnisse einzelner Lernender, dh die Matrix, die vom Meta-Lernenden trainiert werden muss, im Allgemeinen wie folgt angeordnet:

Lernender 1 Lernender 2 ... lernen
Probe 1 xxx xxx ... xxx
Probe 2 xxx xxx ... xxx
Probe 3 xxx xxx ... xxx
... ... ... ... ...
Probe m xxx xxx ... xxx

Basierend auf unserem Verständnis von maschinellem Lernen und Modellfusion ist es nicht schwierig, die folgenden zwei Probleme zu finden:

  • Erstens muss die Merkmalsmatrix des Meta-Lernenden nur sehr wenige Merkmale enthalten

Ein einzelner Lernender kann nur einen Satz von Vorhersageergebnissen ausgeben. Wir ordnen diese Vorhersageergebnisse an, und die Anzahl der Features in der neuen Feature-Matrix entspricht der Anzahl der einzelnen Lernenden. Im Allgemeinen gibt es im Fusionsmodell höchstens 20–30 einzelne Lernende, was bedeutet, dass die Merkmalsmatrix des Meta-Lernenden höchstens 20–30 Merkmale enthält. Für Machine-Learning-Algorithmen in der Industrie und im Wettbewerb reicht diese Feature-Menge bei weitem nicht aus.

  • Zweitens enthält die Merkmalsmatrix des Meta-Lernenden nicht zu viele Beispiele.

Die Verantwortung des einzelnen Lernenden besteht darin, die Hypothese zwischen den Originaldaten und dem Etikett zu finden. Um zu überprüfen, ob diese Hypothese korrekt ist, müssen wir uns die Generalisierungsfähigkeit des einzelnen Lernenden ansehen. Nur wenn die Generalisierungsfähigkeit des einzelnen Lernenden stark ist, können wir die vom einzelnen Lernenden ausgegebenen Vorhersageergebnisse sicher zur Fusion in den Meta-Lernenden übertragen.


Allerdings. Wenn wir das Stapelmodell trainieren, müssen wir den ursprünglichen Datensatz in drei Teile unterteilen: Trainingssatz, Verifizierungssatz und Testsatz –


Darunter Testsatz < /span> Es ist kein Wunder, dass der Meta-Lerner laut Branchenpraxis ein weniger komplexer Algorithmus sein muss, da die Merkmalsmatrix des Meta-Lerners weitaus kleiner ist als die des industriellen maschinellen Lernens hinsichtlich Merkmalsvolumen und Stichprobengröße. Erforderliche Standards. Um diese beiden Probleme zu lösen, gibt es in der Stacking-Methode mehrere Lösungen, die über die Stacking-Klasse in sklearn implementiert werden können. . Im Allgemeinen macht der Verifizierungssatz höchstens 30–40 % des gesamten Datensatzes aus, was bedeutet, dass die Stichprobengröße in der vom Meta-Lernenden verwendeten Merkmalsmatrix höchstens 40 % der Originaldaten beträgt. Verifizierungssatz Daher gibt es am Ende nur einen sehr kleinen wird zur Schulung des einzelnen Lernenden verwendet und besteht aus Inhalten, die dem einzelnen Lernenden vollständig offengelegt wurden Wenn eine Vorhersage für den Trainingssatz getroffen wird, ist das Vorhersageergebnis „hoch“ und kann nicht die Generalisierungsfähigkeit des einzelnen Lernenden widerspiegeln. Trainingsset


Und das wird zum Testen der Wirkung des gesamten Fusionsmodells verwendet und kann daher nicht während des Trainingsprozesses verwendet werden.



class sklearn.ensemble.StackingClassifier(estimators, final_estimator=None, *, cv=None, stack_method="auto", n_jobs=None, passthrough=False, verbose=0)

Klasse sklearn.ensemble.StackingRegressor(Schätzer, final_estimator=None, *, cv=None, n_jobs=None, passthrough=False, verbose=0)

Parameter veranschaulichen
Schätzer Liste der einzelnen Bewerter. Wenn in sklearn nur ein einzelner Evaluator als einzelner Evaluator verwendet wird, kann das
-Modell ausgeführt werden, der Effekt ist jedoch häufig nicht sehr gut.
final_estimator Meta-Lerner, es kann nur einen Bewerter geben. Wenn das Fusionsmodell eine Klassifizierungsaufgabe ausführt, muss der Meta-Lernende ein Klassifizierungsalgorithmus sein.
Wenn das Fusionsmodell eine Regressionsaufgabe ausführt, muss der Meta-Lernende ein Regressionsalgorithmus sein.
Lebenslauf wird verwendet, um den spezifischen Typ, die Faltungsnummer und andere Details der Kreuzvalidierung anzugeben.
Sie können eine einfache K-fache Kreuzvalidierung durchführen oder die Kreuzvalidierungsklasse in sklearn eingeben.
stack_method Für Klassifikatoren einzigartige Parameter stellen die spezifischen Testergebnisse dar, die von einzelnen Lernenden ausgegeben werden.
Passthrough Legen Sie beim Training des Meta-Lernenden fest, ob die Originaldaten als Merkmalsmatrix hinzugefügt werden sollen.
n_jobs, ausführlich Anzahl der Threads und Überwachungsparameter.

3.2 Lösung bei zu kleiner Stichprobengröße: Kreuzvalidierung

  • Parametercv, Kreuzvalidierung beim Stapeln durchführen
    In der Originalarbeit, in der die Stapelmethode vorgeschlagen wurde, war sich der ursprüngliche Autor dessen natürlich bewusst Meta-Lerner Es besteht das Problem, dass die Stichprobengröße der Merkmalsmatrix zu klein ist. Daher wird die Idee vorgeschlagen, die Merkmalsmatrix des Meta-Lernenden mithilfe der Kreuzvalidierung innerhalb des Stapelprozesses zu erweitern Die Kreuzvalidierung wird intern für jeden einzelnen Lernenden durchgeführt, die Ergebnisse dieser Kreuzvalidierung werden jedoch nicht zur Überprüfung der Generalisierungsfähigkeit verwendet. Stattdessen wird die Kreuzvalidierung direkt als Werkzeug zur Datenerstellung verwendet.

Konkret führen wir während des Stapelvorgangs eine Kreuzvalidierung wie folgt durch:

Für jeden einzelnen Lernenden unter der Annahme, dass wir eine 5-fache Kreuzvalidierung durchführen, teilen wir die Trainingsdaten in 5 Teile auf und erstellen insgesamt 5 Modelle entsprechend 4 Teilen für das Training und 1 Teil für die Überprüfung und trainieren 5 Mal:
 

Bild


Während des Kreuzvalidierungsprozesses werden die Daten in jedem Validierungssatz nicht zum Training in das Modell eingegeben, sodass die Vorhersageergebnisse dieser Validierungssätze die Generalisierungsfähigkeit des Modells messen können.

Im Allgemeinen sind die endgültigen Ergebnisse der Kreuzvalidierung die Ergebnisse für die 5 Validierungssätze. Bevor wir die Ergebnisse berechnen, müssen wir jedoch Vorhersagen für die 5 Validierungssätze treffen und die Ergebnisse ausgeben. Wir können also 5 Modelle in der Kreuzvalidierung erstellen und abwechselnd die von den 5 Modellen ausgegebenen Vorhersageergebnisse erhalten, und diese 5 Vorhersageergebnisse entsprechen lediglich den 5 Teilmengen, die in die vollständigen Daten unterteilt sind gesetzt, kann ein Vorhersageergebnis erhalten werden, das der Stichprobe in den Originaldaten entspricht. Dieses vertikale Stapeln ähnelt dem Stapeln von Steinen am Strand, daher der Name „Stapelmethode“. . Das heißt, wenn wir die Kreuzvalidierung abschließen, vervollständigen wir auch die Vorhersage für alle Daten in den Originaldaten. Solange nun die Vorhersageergebnisse der 5 Teilmengen vertikal gestapelt sind
 

Bild


Mit dieser Vorhersagemethode können SieAnzahl der prognostizierten Werte, die von jedem einzelnen Lernenden ausgegeben werden = Stichprobengröße Übrigens, Meta-Learning Die Anzahl der Zeilen der Merkmalsmatrix des Filters entspricht der Stichprobengröße der Originaldaten:

Lernender 1 Lernender 2 ... lernen
Probe 1 xxx xxx ... xxx
Probe 2 xxx xxx ... xxx
Probe 3 xxx xxx ... xxx
... ... ... ... ...
Probe m xxx xxx ... xxx

Während des Stapelvorgangs wird dieser Kreuzvalidierungsprozess definitiv stattfinden und liegt nicht im Rahmen unseres menschlichen Eingreifens. Wir können jedoch Parameter cv verwenden, um zu entscheiden, welche Art von Kreuzvalidierung verwendet werden soll, einschließlich der Anzahl der zu verwendenden Falten, ob die Verteilung von Klassifizierungsbezeichnungen berücksichtigt werden soll usw. Konkret können Sie im Parameter cv Folgendes eingeben:

EingabeKeine, standardmäßig wird die 5-fache Kreuzvalidierung verwendet


Geben Sie sklearn ein Jedes Kreuzvalidierungsobjekt


EingabeJede Ganzzahl, die die Faltzahl in der geschichteten K-Faltung darstellt Validierung. Die geschichtete K-Falten-Kreuzvalidierung ist eine Kreuzvalidierung, die den Anteil jeder Kategorie im Etikett berücksichtigt. Wenn Sie die geschichtete K-Falt-Kreuzvalidierung wählen, stellt die Kreuzvalidierung den Anteil der Kategorien im Originaletikett während jedes Trainings sicher. = Kategorieanteil der Trainingslabels = Kategorieanteil der Validierungslabels.

 

Bild


Jetzt wissen Sie, wie Stacking mit dem Problem umgeht, dass zu wenige Feature-Matrix-Beispiele für den Meta-Lernenden vorhanden sind. Es muss noch einmal betont werden, dass es sich bei der internen Kreuzvalidierung nicht um die Überprüfung der Generalisierungsfähigkeit handelt, sondern um ein Werkzeug zur Datenerstellung, sodass bei der Kreuzvalidierung selbst nicht viel angepasst werden kann. Das Einzige, was erwähnenswert ist, ist, dass bei einer großen Kreuzvalidierungsfalte die Antikörperüberanpassungsfähigkeit des Modells zunimmt und die Lernfähigkeit leicht abnimmt. Wenn die Kreuzvalidierungsfalte klein ist, ist die Wahrscheinlichkeit einer Überanpassung des Modells größer. Wenn die Datenmenge jedoch groß genug ist, bringt die Verwendung zu vieler Kreuzvalidierungsfalten keine Vorteile, sondern erhöht nur die Trainingszeit:

estimators = [("Logistic Regression",clf1), ("RandomForest", clf2)
              , ("GBDT",clf3), ("Decision Tree", clf4), ("KNN",clf5) 
              #, ("Bayes",clf6)
              , ("RandomForest2", clf7), ("GBDT2", clf8)
             ]
final_estimator = RFC(n_estimators=100
                      , min_impurity_decrease=0.0025
                      , random_state= 420, n_jobs=8)
def cvtest(cv):
    clf = StackingClassifier(estimators=estimators
                         ,final_estimator=final_estimator
                         , cv = cv
                         , n_jobs=8)
    start = time.time()
    clf.fit(Xtrain,Ytrain)
    print((time.time() - start)) #消耗时间
    print(clf.score(Xtrain,Ytrain)) #训练集上的结果
    print(clf.score(Xtest,Ytest)) #测试集上的结果
cvtest(2) #非常少的验证次数
""
3.8339908123016357
1.0
0.9861111111111112
""

cvtest(10) #普通的验证次数
""
13.57864761352539
1.0
0.9833333333333333
""

cvtest(30) #很大的验证次数
""
39.74843621253967
1.0
0.9833333333333333
""

Es ist ersichtlich, dass mit zunehmender Faltungszahl im Lebenslauf die Trainingszeit definitiv zunimmt, die Leistung des Modells jedoch nicht unbedingt sicher ist. Wählen Sie daher einfach eine 5- bis 10-fache Kreuzvalidierung. Da das Stapeln gleichzeitig mit Kreuzvalidierungs- und Meta-Lernalgorithmen ausgestattet ist, läuft die Stapelmethode viel langsamer als die Abstimmungsmethode und die Mittelwertmethode., hier befindet sich die Stapelmethode nicht sehr benutzerfreundlich.

3.3 Lösungen mit zu wenigen Funktionen

  • Parameterstack_method, ändern Sie den vom einzelnen Lernenden ausgegebenen Ergebnistyp

对于分类stacking来说,如果特征量太少,我们可以更换个体学习器输出的结果类型。具体来说,如果个体学习器输出的是具体类别(如[0,1,2]),那1个个体学习器的确只能输出一列预测结果。但如果把输出的结果类型更换成概率值、置信度等内容,输出结果的结构一下就可以从一列拓展到多列。

如果这个行为由参数stack_method控制,这是只有StackingClassifier才拥有的参数,它控制个体分类器具体的输出。stack_method里面可以输入四种字符串:"auto", "predict_proba", "decision_function", "predict",除了"auto"之外其他三个都是sklearn常见的接口。

clf = LogiR(max_iter=3000, random_state=1412)

clf = clf.fit(Xtrain,Ytrain)
#predict_proba:输出概率值
clf.predict_proba(Xtrain)

Bild

#decision_function:每个样本点到分类超平面的距离,可以衡量置信度
#对于无法输出概率的算法,如SVM,我们通常使用decision_function来输出置信度
clf.decision_function(Xtrain)

Bild

#predict:输出具体的预测标签
clf.predict(Xtrain)

Bild


对参数stack_method有:

输入"auto",sklearn会在每个个体学习器上按照"predict_proba", "decision_function", "predict"的顺序,分别尝试学习器可以使用哪个接口进行输出。即,如果一个算法可以使用predict_proba接口,那就不再尝试后面两个接口,如果无法使用predict_proba,就尝试能否使用decision_function。


输入三大接口中的任意一个接口名,则默认全部个体学习器都按照这一接口进行输出。然而,如果遇见某个算法无法按照选定的接口进行输出,stacking就会报错。

因此,我们一般都默认让stack_method保持为"auto"。从上面的我们在逻辑回归上尝试的三个接口结果来看,很明显,当我们把输出的结果类型更换成概率值、置信度等内容,输出结果的结构一下就可以从一列拓展到多列。

  • predict_proba

对二分类,输出样本的真实标签1的概率,一列

对n分类,输出样本的真实标签为[0,1,2,3...n]的概率,一共n列

  • decision_function

对二分类,输出样本的真实标签为1的置信度,一列

对n分类,输出样本的真实标签为[0,1,2,3...n]的置信度,一共n列

  • predict

对任意分类形式,输出算法在样本上的预测标签,一列

在实践当中,我们会发现输出概率/置信度的效果比直接输出预测标签的效果好很多,既可以向元学习器提供更多的特征、还可以向元学习器提供个体学习器的置信度。我们在投票法中发现使用概率的“软投票”比使用标签类被的“硬投票”更有效,也是因为考虑了置信度。

  • 参数passthrough,将原始特征矩阵加入新特征矩阵

对于分类算法,我们可以使用stack_method,但是对于回归类算法,我们没有这么多可以选择的接口。回归类算法的输出永远就只有一列连续值,因而我们可以考虑将原始特征矩阵加入个体学习器的预测值,构成新特征矩阵。这样的话,元学习器所使用的特征也不会过于少了。当然,这个操作有较高的过拟合风险,因此当特征过于少、且stacking算法的效果的确不太好的时候,我们才会考虑这个方案。

控制是否将原始数据加入特征矩阵的参数是passthrough,我们可以在该参数中输入布尔值。当设置为False时,表示不将原始特征矩阵加入个体学习器的预测值,设置为True时,则将原始特征矩阵加入个体学习器的预测值、构成大特征矩阵。

  • 接口transform与属性stack_method_
estimators = [("Logistic Regression",clf1), ("RandomForest", clf2)
              , ("GBDT",clf3), ("Decision Tree", clf4), ("KNN",clf5) 
              #, ("Bayes",clf6)
              , ("RandomForest2", clf7), ("GBDT2", clf8)
             ]
final_estimator = RFC(n_estimators=100
                      , min_impurity_decrease=0.0025
                      , random_state= 420, n_jobs=8)
clf = StackingClassifier(estimators=estimators
                         ,final_estimator=final_estimator
                         ,stack_method = "auto"
                         ,n_jobs=8)
clf = clf.fit(Xtrain,Ytrain)

当我们训练完毕stacking算法后,可以使用接口transform来查看当前元学习器所使用的训练特征矩阵的结构

clf.transform(Xtrain).shape
# (1437, 70)

Bild


这个70 代表这个一共有7个个体学习器,每个个体学习器都有10个概率输出
如之前所说,这个特征矩阵的行数就等于训练的样本量:

Xtrain.shape[0]
# 1437

不过你能判断为什么这里有70列吗?因为我们有7个个体学习器,而现在数据是10分类的数据,因此每个个体学习器都输出了类别[0,1,2,3,4,5,6,7,8,9]所对应的概率,因此总共产出了70列数据:

pd.DataFrame(clf.transform(Xtrain)).head()

Bild


如果加入参数passthrough,特征矩阵的特征量会变得更大:

clf = StackingClassifier(estimators=estimators
                         ,final_estimator=final_estimator
                         ,stack_method = "auto"
                         ,passthrough = True
                         ,n_jobs=8)
clf = clf.fit(Xtrain,Ytrain)
clf.transform(Xtrain).shape #这里就等于70 + 原始特征矩阵的特征数量64
# (1437, 134)

Bild


使用属性stack_method_,我们可以查看现在每个个体学习器都使用了什么接口做为预测输出:

clf.stack_method_

["predict_proba",
"predict_proba",
"predict_proba",
"predict_proba",
"predict_proba",
"predict_proba",
"predict_proba"]

不难发现,7个个体学习器都使用了predict_proba的概率接口进行输出,这与我们选择的算法都是可以输出概率的算法有很大的关系

4 Stacking融合的训练/测试流程

现在我们已经知道了stacking算法中所有关于训练的信息,我们可以梳理出如下训练流程:

  • stacking的训练
  1. 将数据分割为训练集、测试集,其中训练集上的样本为(M_{train}),测试集上的样本量为(M_{test})
     
  2. 将训练集输入level 0的个体学习器,分别在每个个体学习器上进行交叉验证。在每个个体学习器上,将所有交叉验证的验证结果纵向堆叠形成预测结果。假设预测结果为概率值,当融合模型执行回归或二分类任务时,该预测结果的结构为((M_{train},1)),当融合模型执行K分类任务时(K>2),该预测结果的结构为((M_{train},K))
     
  3. 将所有个体学习器的预测结果横向拼接,形成新特征矩阵。假设共有N个个体学习器,则新特征矩阵的结构为((M_{train}, N))。如果是输出多分类的概率,那最终得出的新特征矩阵的结构为((M_{train}, N*K))
     
  4. 将新特征矩阵放入元学习器进行训练。

Bild

不难发现,虽然训练的流程看起来比较流畅,但是测试却不知道从何做起,因为:

  • 最终输出预测结果的是元学习器,因此直觉上来说测试数据集或许应该被输入到元学习器当中。然而,元学习器是使用新特征矩阵进行预测的,新特征矩阵的结构与规律都与原始数据不同,所以元学习器根本不可能接受从原始数据中分割出来的测试数据。因此正确的做法应该是让测试集输入level 0的个体学习器。

  • Es gibt jedoch ein Problem: Einzelne Lernende der Stufe 0 führen während des Trainingsprozesses eine Kreuzvalidierung durch, und Bei der Kreuzvalidierung werden nur die Überprüfungsergebnisse ausgegeben, nicht das trainierte Modell verlassen . Daher gibt es kein trainiertes Modell, das für die Vorhersage in Level 0 verwendet werden kann.

Um diesen Widerspruch in unserem Trainingsprozess aufzulösen, gibt es versteckte Schritte:

  • Stapeltraining
  1. Teilen Sie die Daten in einen Trainingssatz und einen Testsatz auf, wobei die Stichproben im Trainingssatz (M_{train}) und die Stichprobengröße im Testsatz (M_{test}) sind.
     
  2. Geben Sie den Trainingssatz auf Stufe 0 in die einzelnen Lernenden ein und führen Sie eine Kreuzvalidierung für jeden einzelnen Lernenden durch. Bei jedem einzelnen Lernenden werden die Validierungsergebnisse aller Kreuzvalidierungen vertikal gestapelt, um die Vorhersageergebnisse zu bilden. Nehmen Sie an, dass das Vorhersageergebnis ein Wahrscheinlichkeitswert ist. Wenn das Fusionsmodell eine Regressions- oder binäre Klassifizierungsaufgabe ausführt, ist die Struktur des Vorhersageergebnisses ((M_{train},1)). Wenn das Fusionsmodell eine K-Klassifizierungsaufgabe ausführt ( K>2), die Struktur des Vorhersageergebnisses ist ((M_{train},1)). Die Struktur des Vorhersageergebnisses ist ((M_{train},K))
     
  3. Versteckter Schritt: Trainieren Sie alle einzelnen Lernenden unter Verwendung aller Trainingsdaten zur Vorbereitung auf den Test.
     
  4. Die Vorhersageergebnisse aller einzelnen Lernenden werden horizontal zusammengefügt, um eine neue Merkmalsmatrix zu bilden. Unter der Annahme, dass es insgesamt N einzelne Lernende gibt, ist die Struktur der neuen Merkmalsmatrix ((M_{train}, N)).
     
  5. Fügen Sie die neue Funktionsmatrix zum Training in den Meta-Lerner ein.
  • Stapeltest
  1. Geben Sie den Testsatz in die einzelnen Lernenden der Stufe 0 ein und prognostizieren Sie die entsprechenden Ergebnisse für jeden einzelnen Lernenden. Gehen Sie davon aus, dass es sich bei den Testergebnissen um Wahrscheinlichkeitswerte handelt. Wenn das Fusionsmodell Regressions- oder binäre Klassifizierungsaufgaben ausführt, ist die Struktur der Testergebnisse ((M_{test},1)). Wenn das Fusionsmodell K Klassifizierungsaufgaben ausführt (K>2). ), die Struktur der Testergebnisse ist ((M_{test},1)). Die Struktur der Testergebnisse ist ((M_{test},K))
     
  2. Die Vorhersageergebnisse aller einzelnen Lernenden werden horizontal in eine neue Merkmalsmatrix gespleißt. Unter der Annahme, dass es insgesamt N einzelne Lernende gibt, ist die Struktur der neuen Merkmalsmatrix ((M_{test}, N)).
     
  3. Fügen Sie die neue Feature-Matrix zur Vorhersage in den Meta-Learner ein.

Daher müssen beim Stapeln nicht nur alle Kreuzvalidierungen für einzelne Lernende abgeschlossen werden, sondern auch die Trainingsdaten müssen nach Abschluss der Kreuzvalidierung wiederverwendet werden, um alle Modelle zu trainieren. Kein Wunder, dass Stacking Fusion komplexer ist und langsamer läuft.

Bisher haben wir die Abstimmungsmethode und die Stapelmethode erklärt. In sklearn erklären wir die folgenden 4 Kategorien:

Fusionsmethode Art
Wahlgesetze ensemble.VotingClassifier
Mittelungsmethode ensemble.VotingRegressor
Klassifizierung der Stapelmethode ensemble.StackingClassifier
gestapelte Regression ensemble.StackingRegressor

Obwohl es sich bei diesen Klassen um Modellfusionsmethoden handelt, können wir diese Methoden wie jede einzelne Algorithmusklasse verwenden – wir können problemlos manuelle Parameteroptimierung, Kreuzvalidierung, Rastersuche, Bayes'sche Optimierung, Pipeline-Paketierung und andere Vorgänge ohne durchführen Ich mache mir Sorgen über Probleme mit der Codekompatibilität. Es ist jedoch zu beachten, dass das Fusionstool in sklearn nur den Evaluator in sklearn unterstützt und nicht den nativen Code von xgb und lgbm. Wenn wir Modelle unter nativem Code fusionieren möchten, müssen wir den Fusionsprozess daher selbst schreiben.

2. Verbesserte Stapelmethode: Blending

1 Die Grundidee und der Prozess des Blending

Blending Fusion ist ein verbesserter Algorithmus, der auf Stacking Fusion basiert. Im vorherigen Kurs haben wir erwähnt, dass die Stapelmethode einen Algorithmus auf Ebene 1 verwendet, der die Fusion selbst in Richtung einer Minimierung der Verlustfunktion bewegen kann. Gleichzeitig verwendet die Stapelmethode eine eigene interne Kreuzvalidierung, um Daten zu generieren , und die Trainingsdaten können eingehend genutzt werden, sodass der Gesamteffekt des Modells besser ist. Doch hinter diesen Operationen stecken zwei große Probleme:

  • Stacking Fusion erfordert eine große Menge an Berechnungen, erfordert hohe Zeit- und Rechenleistungskosten und

  • Stacking Fusion ist sowohl hinsichtlich der Daten als auch des Algorithmus zu komplex, daher ist die Möglichkeit einer Überanpassung des Fusionsmodells zu hoch.

Als Reaktion auf diese beiden Probleme beim Stapeln erforschten und entwickelten die Gewinnerteams des Wettbewerbs während des Trainings weiterhin verschiedene verbesserte Stapelmethoden. Heutzutage ist die berühmte Blending-Methode eine der effektivsten Methoden unter den verschiedenen Stapelmethoden. Blending wird wörtlich als „Mischen“ übersetzt, aber seine Kernidee ist eigentlich genau die gleiche wie Stacking: Bei der Verwendung von zweischichtigen Algorithmen in Reihe gibt es auf Ebene 0 mehrere starke Lernende, auf Ebene 1 nur einen Meta-Lernenden, und das gibt es auch Ein starker Lerner auf Ebene 0. Verantwortlich für die Anpassung der Beziehung zwischen Daten und realen Beschriftungen, die Ausgabe von Vorhersageergebnissen, die Bildung einer neuen Merkmalsmatrix und die anschließende Ermöglichung des Lernens und Vorhersagens für den Meta-Lernenden auf Ebene 1 anhand der neuen Merkmalsmatrix.

Bild

Um jedoch im Gegensatz zum Stapeln den Rechenaufwand zu reduzieren und das Risiko einer Überanpassung des Fusionsmodells zu verringern, bricht Blending die K-fache Kreuzvalidierung ab und reduziert die Datenmenge, die zum Trainieren des Meta-Lernenden erforderlich ist, erheblich. Der spezifische Prozess ist wie folgt:

  • Blending-Training
  1. Teilen Sie die Daten in einen Trainingssatz, einen Validierungssatz und einen Testsatz auf, wobei die Stichproben im Trainingssatz (M_{train}), die Stichproben im Validierungssatz (M_v) und die Stichprobengröße im Testsatz sind ist (M_{test})
     
  2. Geben Sie den Trainingssatz für die einzelnen Lernenden auf Stufe 0 ein und trainieren Sie jeden einzelnen Lernenden separat. Nach Abschluss des Trainings wird es anhand des Verifizierungssatzes verifiziert und die Vorhersageergebnisse des Verifizierungssatzes werden ausgegeben. Nehmen Sie an, dass das Vorhersageergebnis ein Wahrscheinlichkeitswert ist. Wenn das Fusionsmodell eine Regressions- oder binäre Klassifizierungsaufgabe ausführt, ist die Struktur des Vorhersageergebnisses ((M_v,1)). Wenn das Fusionsmodell eine K-Klassifizierungsaufgabe ausführt (K>2). ), die Struktur des Vorhersageergebnisses ist Die Struktur ist ((M_v,K)). Zu diesem Zeitpunkt sind alle einzelnen Lernenden geschult.
     
  3. Die Verifizierungsergebnisse aller einzelnen Lernenden werden horizontal zusammengefügt, um eine neue Merkmalsmatrix zu bilden. Unter der Annahme, dass es insgesamt N einzelne Lernende gibt, ist die Struktur der neuen Merkmalsmatrix ((M_v, N)).
     
  4. Fügen Sie die neue Funktionsmatrix zum Training in den Meta-Lerner ein.
  • Mischungstest
  1. Geben Sie den Testsatz in die einzelnen Lernenden der Stufe 0 ein und prognostizieren Sie die entsprechenden Ergebnisse für jeden einzelnen Lernenden. Gehen Sie davon aus, dass es sich bei den Testergebnissen um Wahrscheinlichkeitswerte handelt. Wenn das Fusionsmodell Regressions- oder binäre Klassifizierungsaufgaben ausführt, ist die Struktur der Testergebnisse ((M_{test},1)). Wenn das Fusionsmodell K Klassifizierungsaufgaben ausführt (K>2). ), die Struktur der Testergebnisse ist ((M_{test},1)). Die Struktur der Testergebnisse ist ((M_{test},K))
     
  2. Die Vorhersageergebnisse aller einzelnen Lernenden werden horizontal in eine neue Merkmalsmatrix gespleißt. Unter der Annahme, dass es insgesamt N einzelne Lernende gibt, ist die Struktur der neuen Merkmalsmatrix ((M_{test}, N)).
     
  3. Fügen Sie die neue Funktionsmatrix zum Vortesten in den Meta-Learner ein
    .

2 Implementieren Sie den Blending-Algorithmus manuell

def BlendingClassifier(X,y,estimators,final_estimator,test_size=0.2,vali_size=0.4):
    """
    该函数用于实现Blending分类融合
    X,y:整体数据集,会被分割为训练集、测试集、验证集三部分
    estimators: level0的个体学习器,输入格式形如sklearn中要求的[(名字,算法),(名字,算法)...]    
    final_estimator:元学习器
    test_size:测试集占全数据集的比例
    vali_size:验证集站全数据集的比例
    
    """
    
    #第一步,分割数据集
    #1.分测试集
    #2.分训练和验证集,验证集占完整数据集的比例为0.4,因此占排除测试集之后的比例为0.4/(1-0.2)
    X_,Xtest,y_,Ytest = train_test_split(X,y,test_size=test_size,random_state=1412)
    Xtrain,Xvali,Ytrain,Yvali = train_test_split(X_,y_,test_size=vali_size/(1-test_size),random_state=1412)
    
    #训练
    #建立空dataframe用于保存个体学习器上的验证结果,即用于生成新特征矩阵
    #新建空列表用于保存训练完毕的个体学习器,以便在测试中使用
    NewX_vali = pd.DataFrame()
    trained_estimators = []
    #循环、训练每个个体学习器、并收集个体学习器在验证集上输出的概率
    for clf_id, clf in estimators:
        clf = clf.fit(Xtrain,Ytrain)
        val_predictions = pd.DataFrame(clf.predict_proba(Xvali))
        #保存结果,在循环中逐渐构筑新特征矩阵
        NewX_vali = pd.concat([NewX_vali,val_predictions],axis=1)
        trained_estimators.append((clf_id,clf))
    #元学习器在新特征矩阵上训练、并输出训练分数
    final_estimator = final_estimator.fit(NewX_vali,Yvali)
    train_score = final_estimator.score(NewX_vali,Yvali)
    
    #测试
    #建立空dataframe用于保存个体学习器上的预测结果,即用于生成新特征矩阵
    NewX_test = pd.DataFrame()
    #循环,在每个训练完毕的个体学习器上进行预测,并收集每个个体学习器上输出的概率
    for clf_id,clf in trained_estimators:
        test_prediction = pd.DataFrame(clf.predict_proba(Xtest))
        #保存结果,在循环中逐渐构筑特征矩阵
        NewX_test = pd.concat([NewX_test,test_prediction],axis=1)
    #元学习器在新特征矩阵上测试、并输出测试分数
    test_score = final_estimator.score(NewX_test,Ytest)
    
    #打印训练分数与测试分数
    print(train_score,test_score)
#逻辑回归没有增加多样性的选项
clf1 = LogiR(max_iter = 3000, C=0.1, random_state=1412,n_jobs=8)
#增加特征多样性与样本多样性
clf2 = RFC(n_estimators= 100,max_features="sqrt",max_samples=0.9, random_state=1412,n_jobs=8)
#特征多样性,稍微上调特征数量
clf3 = GBC(n_estimators= 100,max_features=16,random_state=1412) 

#增加算法多样性,新增决策树与KNN
clf4 = DTC(max_depth=8,random_state=1412)
clf5 = KNNC(n_neighbors=10,n_jobs=8)
clf6 = GaussianNB()

#新增随机多样性,相同的算法更换随机数种子
clf7 = RFC(n_estimators= 100,max_features="sqrt",max_samples=0.9, random_state=4869,n_jobs=8)
clf8 = GBC(n_estimators= 100,max_features=16,random_state=4869)

estimators = [("Logistic Regression",clf1), ("RandomForest", clf2)
              , ("GBDT",clf3), ("Decision Tree", clf4), ("KNN",clf5) 
              #, ("Bayes",clf6)
              #, ("RandomForest2", clf7), ("GBDT2", clf8)
             ]
final_estimator = RFC(n_estimators= 100
                      #, max_depth = 8
                      , min_impurity_decrease=0.0025
                      , random_state= 420, n_jobs=8)
#很明显,过拟合程度比Stacking要轻,但是测试集的表现没有stacking强
BlendingClassifier(X,y,estimators,final_estimator)

Bild

#验证比例越大,模型学习能力越弱 - 注意验证集比例上限0.8,因为有0.2是测试数据
BlendingClassifier(X,y,estimators,final_estimator,vali_size=0.7)

Bild

#blending的运行速度比stacking快了不止一个档次……
BlendingClassifier(X,y,estimators,final_estimator,vali_size=0.1)
""
1.0 0.9833333333333333
""

Bild

Benchmark Wahlgesetze Stapeln Mischen
5-fache Kreuzvalidierung 0,9666 0,9833 0,9812(↓) -
Ergebnisse des Testsatzes 0,9527 0,9889 0,9889(-) 0,9833(↓)

Den Ergebnissen nach zu urteilen, weist die Abstimmungsmethode die stabilste und beste Leistung auf. Dies hängt mit der Tatsache zusammen, dass es sich bei dem von uns ausgewählten Datensatz um einen relativ einfachen Datensatz handelt. Gleichzeitig ist die Abstimmungsmethode auch der Algorithmus, den wir angepasst haben am meisten und ist am meisten vorhanden. Stapeln und Mischen bieten bei der Ausführung großer Datenmengen weitere Vorteile. An dieser Stelle haben wir die Erläuterung des Blending abgeschlossen. Im offiziellen Kurs „2022 Machine Learning Practical Combat“ werden wir die Anwendung des Blending auf komplexe Algorithmen wie xgboost ausführlicher erläutern.

Ursprüngliche Adresse: https://www.cnblogs.com/lipu123/p/17563377.html

Für weitere Informationen zum maschinellen Lernen von Python folgen Sie bitte dem offiziellen Konto (Python-Risikokontrollmodell).

Ich denke du magst

Origin blog.csdn.net/toby001111/article/details/133305657
Empfohlen
Rangfolge