Im Rahmen der Implementierung der großen Aufgabe der Stimmungsanalyse (Analyse von Bewertungen) habe ich beschlossen, einige Zeit der zusätzlichen Untersuchung des separaten Elements zu widmen - indem ich den VotingClassifier aus dem Modul sklearn.ensemble als Werkzeug zum Aufbau eines Ensembles von Klassifizierungsmodellen und zur Verbesserung der endgültigen Qualität von Vorhersagen verwendete. Warum ist das wichtig und was sind die Nuancen?

Es kommt häufig vor, dass bei der Lösung des angewandten Problems der Datenanalyse nicht sofort (oder überhaupt nicht offensichtlich) klar ist, welches Trainingsmodell am besten geeignet ist. Eine Lösung kann darin bestehen, das beliebteste und / oder intuitiv am besten geeignete Modell basierend auf der Art der verfügbaren Daten auszuwählen. In diesem Fall werden die Parameter des ausgewählten Modells optimiert (z. B. über GridSearchCV) und in der Arbeit verwendet. Ein anderer Ansatz kann darin bestehen, ein Ensemble von Modellen zu verwenden, wenn die Ergebnisse mehrerer von ihnen gleichzeitig an der Bildung des Endergebnisses beteiligt sind. Ich möchte gleich sagen, dass der Zweck des Artikels nicht darin besteht, die Vorteile der Verwendung eines Ensembles von Modellen oder die Prinzipien seiner Konstruktion zu beschreiben (dies finden Sie
hier ), sondern in einem separat angewandten Ansatz zur Lösung des Problems anhand eines bestimmten Beispiels und zur Analyse der Nuancen, die bei einer solchen Lösung auftreten.
Die Aussage des globalen Problems lautet wie folgt : Nur
100 Bewertungen wurden auf Mobiltelefonen als Teststichprobe abgegeben, und wir benötigen ein vorab geschultes Modell, das das beste Ergebnis bei diesen 100 Bewertungen zeigt - nämlich festzustellen, ob die Bewertung positiv oder negativ ist. Eine zusätzliche Schwierigkeit, die sich aus den Bedingungen des Problems ergibt, ist das Fehlen einer Trainingsprobe. Um diese Schwierigkeit mithilfe der Beautiful Soup-Bibliothek zu überwinden, wurden 10.000 Bewertungen zu Mobiltelefonen und Bewertungen von einer der russischen Websites erfolgreich analysiert.
Wir
überspringen die Schritte des Parsens, der Datenvorverarbeitung und des Studierens ihrer ursprünglichen Struktur und gehen zu dem Moment über, in dem es Folgendes gibt:
- Trainingsmuster, bestehend aus 10.000 telefonischen Bewertungen, jede Bewertung ist als binär (positiv oder negativ) gekennzeichnet. Markup für die Definition von Bewertungen mit Bewertungen 1-3 als negativ und Bewertungen 4-5 als positiv.
- Mit Count Vectorizer werden die Daten in einer Form dargestellt, die für das Training von Klassifikatormodellen geeignet ist
Wie entscheiden Sie, welches Modell für Sie am besten geeignet ist? Wir haben nicht die Möglichkeit, Modelle manuell zu durchlaufen, weil Ein Testmuster mit nur 100 Bewertungen birgt das große Risiko, dass ein Modell einfach besser für dieses Testmuster geeignet ist. Wenn Sie es jedoch für ein zusätzliches Muster verwenden, das vor uns verborgen ist, oder in einem „Kampf“, ist das Ergebnis unterdurchschnittlich.
Um dieses Problem zu lösen
, verfügt die Scikit-Lernbibliothek über ein VotingClassifier-Modul , mit dem mehrere voneinander verschiedene Modelle des maschinellen Lernens verwendet und zu einem Klassifikator kombiniert werden können. Dies verringert das Risiko einer Umschulung sowie eine falsche Interpretation der Ergebnisse eines bestimmten Modells.
Das VotingClassifier-Modul wird mit dem folgenden Befehl importiert :
from sklearn.ensemble import VotingClassifier
Praktische Details bei der Arbeit mit diesem Modul:
1) Das erste und wichtigste ist, wie man eine einzelne genommene Vorhersage des kombinierten Klassifikators erhält, nachdem man Vorhersagen von jedem der darin enthaltenen Modelle erhalten hat. Unter den VotingClassifier-Parametern gibt es einen
Abstimmungsparameter mit zwei möglichen Werten: 'hart' und 'weich'.
1.1) Im ersten Fall entspricht die endgültige Antwort des gemeinsamen Klassifikators der „Meinung“ der Mehrheit seiner Mitglieder. Ihr kombinierter Klassifikator verwendet beispielsweise Daten aus drei verschiedenen Modellen. Zwei von ihnen sagen bei einer bestimmten Beobachtung die Antwort "positives Feedback" voraus, das dritte - "negatives Feedback". Für diese Beobachtung ist die endgültige Vorhersage daher "positives Feedback", da wir 2 - "für" und 1 "gegen" haben.
1.2) Im zweiten Fall, d.h. Bei Verwendung des "weichen" Werts des
Abstimmungsparameters erfolgt für
jede Klasse eine vollständige "Abstimmung" und Gewichtung der Modellvorhersagen. Die endgültige Antwort des kombinierten Klassifikators ist also der Argmax der Summe der vorhergesagten Wahrscheinlichkeiten.
WICHTIG! Um eine solche "Abstimmungs" -Methode verwenden zu können, muss
jeder Klassifikator aus den in Ihrem Ensemble enthaltenen Klassifizierern die
Predict_proba () -Methode unterstützen, um eine quantitative Schätzung der Wahrscheinlichkeit des Eintritts in jede der Klassen zu erhalten. Bitte beachten Sie, dass nicht alle Klassifikatormodelle diese Methode unterstützen und dementsprechend im Rahmen von VotingClassifier verwendet werden können, wenn die Methode der gewichteten Wahrscheinlichkeiten (Soft Voting) verwendet wird.
Schauen wir uns ein Beispiel an : Es gibt drei Klassifikatoren und zwei Klassen von Bewertungen: positiv und negativ. Jeder Klassifikator gibt durch die Methode "dict_proba" einen bestimmten Wahrscheinlichkeitswert (p) an, mit dem eine bestimmte Beobachtung von ihm der Klasse 1 und dementsprechend mit der Wahrscheinlichkeit (1-p) der Klasse 2 zugeordnet wird. Der kombinierte Klassifikator führt nach Erhalt einer Antwort von jedem der Modelle die Gewichtung der erhaltenen Schätzungen durch und gibt das erhaltene Endergebnis als
$$ Anzeige $$ max (w1 * p1 + w2 * p1 + w3 * p1, w1 * p2 + w2 * p2 + w3 * p3) $$ Anzeige $$
Dabei sind w1, w2, w3 die Gewichte Ihrer im Ensemble enthaltenen Klassifikatoren, die standardmäßig gleiche Gewichte haben, und p1, p2 ist die Bewertung der Zugehörigkeit zu Klasse 1 oder Klasse 2 von jedem von ihnen. Bitte beachten Sie auch, dass die Gewichte von Klassifizierern bei Verwendung von Soft Vote mithilfe des Gewichtungsparameters geändert werden können, sodass der Modulaufruf folgendermaßen aussehen sollte:
... = VotingClassifier(estimators=[('..', clf1), ('..', clf2), ('...', clf3)], voting='soft', weights=[*,*,*])
, wobei die Sternchen die erforderlichen Gewichte für jedes Modell angeben können.
2) Die Möglichkeit, das Modul VotingClassifier und GridSearch
gleichzeitig zu verwenden, um die Hyperparameter aller im Ensemble enthaltenen Klassifikatoren zu optimieren.
Wenn Sie ein Ensemble verwenden möchten und möchten, dass die darin enthaltenen Modelle optimiert werden, können Sie GridSearch bereits für den einheitlichen Klassifikator verwenden. Der folgende Code zeigt, wie Sie mit den darin enthaltenen Modellen (logistische Regression, naive Bayes, stochastischer Gradientenabstieg) arbeiten können, während Sie im Rahmen des einheitlichen Klassifikators (VotingClassifier) bleiben:
clf1 = LogisticRegression() clf2 = MultinomialNB() clf3 = SGDClassifier(max_iter=1000, loss='log') eclf = VotingClassifier(estimators=[ ('lr', clf1), ('nb', clf2),('sgd', clf3)], voting='hard') # (hard voting), . . 1.1 <b>params = {'lr__C' : [0.5,1,1.5], 'lr__class_weight': [None,'balanced'], 'nb__alpha' : [0.1,1,2], 'sgd__penalty' : ['l2', 'l1'], 'sgd__alpha': [0.0001,0.001,0.01]} </b> # , , grid = GridSearchCV(estimator=eclf, param_grid=params, cv=5, scoring='accuracy', n_jobs=-1) grid = grid.fit(data_messages_vectorized, df_texts['Binary_Rate']) # , 5
Daher muss das Parameterwörterbuch so eingestellt sein, dass Sie beim Zugriff über GridSearch bestimmen können, welcher Parameter im Modellensemble auf einen Parameter verweist, dessen Wert Sie optimieren möchten.
Das ist alles, was Sie wissen müssen, um das VotingClassifier-Tool vollständig nutzen zu können, um ein Ensemble von Modellen zu erstellen und zu optimieren. Schauen wir uns die Ergebnisse an:
print grid.best_params_ {'lr__class_weight': 'balanced', 'sgd__penalty': 'l1', 'nb__alpha': 1, 'lr__C': 1, 'sgd__alpha': 0.001}
Wenn die optimalen Werte der Parameter gefunden wurden, müssen die Ergebnisse der Arbeit für das Ensemble von Klassifikatoren (VotingClassifier) mit den optimalen Parametern verglichen werden. Wir werden eine Kreuzvalidierung der Trainingsprobe durchführen und die Modelle mit den optimalen Parametern und dem daraus bestehenden Ensemble vergleichen:
for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Naive Bayes', 'SGD', 'Ensemble_HardVoting']): scores = cross_val_score(clf, data_messages_vectorized, df_texts['Binary_Rate'], cv=3, scoring='accuracy') print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))
Das Endergebnis:
Genauigkeit: 0,75 (± 0,02) [Logistische Regression]
Genauigkeit: 0,79 (± 0,02) [Naive Bayes]
Genauigkeit: 0,79 (± 0,02) [SGD]
Genauigkeit: 0,79 (± 0,02) [Ensemble_HardVoting]
Wie Sie sehen können, zeigten sich die Modelle im Trainingsbeispiel etwas anders (bei Standardparametern war dieser Unterschied deutlicher). Darüber hinaus muss der Gesamtwert (gemäß der Genauigkeitsmetrik) des Ensembles den besten Wert der darin enthaltenen Modelle nicht überschreiten, weil Das Ensemble ist eher ein stabileres Modell, das in der Lage ist, im Test-Set und im „Kampf“ ein ähnliches Ergebnis zu erzielen, was bedeutet, dass das Risiko einer Umschulung, Anpassung an das Trainingsset und anderer mit dem Training verbundener Problemklassifizierer verringert wird. Viel Glück bei der Lösung der angewandten Probleme und vielen Dank für Ihre Aufmerksamkeit!
PS Angesichts der Besonderheiten und Veröffentlichungsregeln in der Sandbox kann ich keinen Link zu Github und dem Quellcode für die in diesem Artikel angegebene Analyse sowie Links zu Kaggle im Rahmen des InClass-Wettbewerbs bereitstellen, der ein Test-Set und Tools zum Überprüfen von Modellen darauf bereitstellte. Ich kann nur sagen, dass dieses Ensemble die Basislinie deutlich übertroffen hat und seinen rechtmäßigen Platz in der Rangliste eingenommen hat, nachdem es nach einem Test-Set gesucht hat. Ich hoffe in den folgenden Publikationen kann ich teilen.