[PYTHON] Multi-Label-Klassifizierung nach Random Forest mit Scikit-Learn

Vorwort

Dieser Artikel basiert auf ❷ von Sammlung und Klassifizierung von Informationen zum maschinellen Lernen (Konzept).

Angenommen, Sie haben Neuigkeiten, dass ein Unternehmen mithilfe eines Dienstes in der Cloud ein Q & A-System erstellt hat.

Dann, wie Sie aus Beispiel eines Ordners des lokalen Dateisystems in ❷ schließen können, Internet-Verknüpfungen für diese Nachrichten

・ Tools / Cloud / Bestimmte Dienste ・ Maschinelles Lernen / Anwendung / Bot ・ Dialogsystem ・ Soziale Trends / Unternehmen / bestimmte Unternehmen

Muss an mindestens drei Orten platziert werden. Diese Klassifikationen sind nicht exklusiv, daher handelt es sich um sogenannte Multi-Label-Klassifikationen.

Es gibt verschiedene Algorithmen, die sich mit solchen Problemen in Python / scikit-learn befassen, aber es scheint, dass die API-Schnittstelle so wie sie ist vereinheitlicht ist und Sie Code schreiben können, der nur durch Ersetzen des Algorithmus funktioniert.

In diesem Artikel wird daher die API-Schnittstelle überprüft.

Da das Skript, das das eigentliche Crawlergebnis verarbeitet, in Qiita nicht allgemein einzuführen ist, werde ich es auf GitHub veröffentlichen und in diesem Artikel die Benutzeroberfläche überprüfen Es werden nur Beispielskripte verarbeitet. Es ist auch einfach, einen zufälligen Wald auszuwählen [^ 1]. Die Daten verwenden auch künstliche Werte, um die Übereinstimmung zwischen den numerischen Werten zu bestätigen, und sind keine wirklich aussagekräftigen Daten. Bitte verstehe diesen Punkt.

Multi-Class- und Multi-Label-Algorithmen beim Scikit-Learn

Als Rahmen für den Umgang mit Mehrklassenalgorithmen und Mehrfachetikettenalgorithmen mit scikit-learn bietet [Translation] scikit-learn 0.18 Benutzerhandbuch 1.12. Mehrklassenalgorithmen und Mehrfachetikettenalgorithmen Es gibt eine sklearn.multiclass, die in / 9decf45d106accc6afe1) beschrieben ist. Dieses Modul ist jedoch ein Allzweckmodul, das das Problem in binäre Klassifizierungsprobleme aufteilt und nicht für einzelne Klassifizierungsalgorithmen optimiert ist.

Entscheidungsbaum, [Random Forest](https: //ja.wikipedia. org / wiki /% E3% 83% A9% E3% 83% B3% E3% 83% 80% E3% 83% A0% E3% 83% 95% E3% 82% A9% E3% 83% AC% E3% 82 % B9% E3% 83% 88) Bei der Methode des nächsten Nachbarn wird in jedem Algorithmus selbst eine Mehrfachetikettenklassifizierung implementiert, sodass Sie jeden Algorithmus direkt verwenden.

Beispielskript

Schreiben wir nun ein Beispielskript.

random-forest.py


#from sklearn.tree import DecisionTreeClassifier as classifier
from sklearn.ensemble import RandomForestClassifier as classifier
from gensim import matutils

corpus = [[(1,10),(2,20)],[(3,30),(4,40)],[(5,50),(6,60)]]
labels = [[100,500,900],[300,400,800],[200,600,700]]

dense = matutils.corpus2dense(corpus, 7)

print(dense)   #=> (*1)

print(dense.T) #=> (*2)

clf = classifier(random_state=777)
clf.fit(dense.T, labels)

for target in [[[0,10,20, 0, 0, 0, 0]], #=> (*3)
               [[0,10,20,30,40,50,60]], #=> (*4)
               [[0,10,10,0,0,0,0],      #=> (*5)
                [0,0,0,20,20,0,0],
                [0,0,0,0,0,30,30]]]:
    print(clf.predict(target))
    print(clf.predict_proba(target))

classifier

Wenn Sie die Importquelle des Klassifikatoralgorithmus wie im Beispiel für das Auskommentieren ändern, wird dieser nach dem angegebenen Algorithmus klassifiziert.

Korpus und Etiketten

Der Eingabekorpus ist eine spärliche Matrix, die die Vokabelfrequenzen der drei Dokumente beschreibt. Erste Dokument-ID: 1 Wort 10-mal, ID: 2 Wort 20-mal, andere Wörter Häufigkeit 0 Die folgende Dokument-ID: 3 Wörter 30-mal, ID: 4 Wörter 40-mal, andere Wörter Häufigkeit 0 ・ Letzte Dokument-ID: 5 Wörter 50-mal, ID: 6 Wörter 60-mal, andere Wörter Häufigkeit 0

Lehrerdatenetiketten beschreiben die Klassifizierung jedes Dokuments. Erstes Dokument - das erste Etikett hat einen Wert von 100, das zweite Etikett hat einen Wert von 500 und das letzte Etikett hat einen Wert von 900. Das folgende Dokument: Das erste Etikett hat einen Wert von 300, das nächste Etikett einen Wert von 400 und das letzte Etikett einen Wert von 800. · Letztes Dokument - das erste Etikett hat einen Wert von 200, das zweite Etikett einen Wert von 600 und das letzte Etikett einen Wert von 700. Mit anderen Worten · Erste Label-3-Klassen mit den Werten 100, 200 und 300 · Nächste Label-3-Klassen mit den Werten 400, 500 und 600 -Letzte Label-Drei-Klassen mit den Werten 700, 800 und 900

spärliche → dichte Umwandlung

Der von scikit-learn bereitgestellte Klassifizierungsalgorithmus erwartet eine dichte Matrix als Eingabe, daher müssen wir die dünn besetzte Matrix in eine dichte Matrix konvertieren.

Sie können corpus2dense im Modul gensim.matutils verwenden. Sehen wir uns das Ergebnis an (* 1).

dense.


[[  0.   0.   0.]
 [ 10.   0.   0.]
 [ 20.   0.   0.]
 [  0.  30.   0.]
 [  0.  40.   0.]
 [  0.   0.  50.]
 [  0.   0.  60.]]

Das?

Es ist wahr, dass es sich um eine dichte Matrix handelt, die 0 ausdrückt, ohne sie richtig wegzulassen. Da die Zeile jedoch die Wort-ID und die Spalte die Dokumentennummer ist, besteht keine Übereinstimmung mit den Bezeichnungen. Daher müssen die Zeilen und Spalten transponiert werden, um die Eingabe des Klassifizierungsalgorithmus zu sein (→ Ergebnis (* 2)).

dense.T


[[  0.  10.  20.   0.   0.   0.   0.]
 [  0.   0.   0.  30.  40.   0.   0.]
 [  0.   0.   0.   0.   0.  50.  60.]]

Ich denke, dass es überwiegend viele Anwendungsfälle gibt, in denen dicht.T für dicht und dicht verwendet wird.T, aber ich bin mir nicht sicher, warum corpus2dense eine solche Spezifikation hat.

Einstufung

・ Klassifikatorgenerierung

python


clf = RandomForestClassifier(random_state=777)

Der Random Forest-Algorithmus verwendet intern Zufallszahlen. Wenn Sie also random_state nicht korrigieren, erhalten Sie jedes Mal andere Ergebnisse.

・ Klassifizierung

print(clf.predict(target))
print(clf.predict_proba(target))

In diesem Beispielskript wird Predict verwendet, um das Klassifizierungsergebnis zu berechnen, und Predict_proba wird verwendet, um den geschätzten Wahrscheinlichkeitswert zu berechnen [^ 2].

Schauen wir uns die Ergebnisse der Reihe nach an.

(*3) [[0,10,20, 0, 0, 0, 0]]

[[ 100.  500.  900.]]
[array([[ 0.8,  0.1,  0.1]]), array([[ 0.1,  0.8,  0.1]]), array([[ 0.1,  0.1,  0.8]])]

Da dies eines der trainierten Muster ist, wird erwartet, dass die Klassifizierung gemäß den Lehrerdaten erfolgt.

・ Erster Label-Wert 100: Wahrscheinlichkeit 0,8, 200: Wahrscheinlichkeit 0,1, 300: Wahrscheinlichkeit 0,1 → Wert 100. ・ Nächster Label-Wert 400: Wahrscheinlichkeit 0,1, 500: Wahrscheinlichkeit 0,8, 600: Wahrscheinlichkeit 0,1 → Wert 500. -Letztes Etikett-Wert 700: Wahrscheinlichkeit 0,1, 800: Wahrscheinlichkeit 0,1, 900: Wahrscheinlichkeit 0,8 → Wert 900.

Natürlich können die Lehrerdaten reproduziert werden.

Beachten Sie, dass die Werte in numerischer Reihenfolge und nicht in der Reihenfolge ihres Erscheinungsbilds verwaltet werden.

(*4) [[0,10,20,30,40,50,60]]

[[ 200.  600.  700.]]
[array([[ 0.3,  0.5,  0.2]]), array([[ 0.2,  0.3,  0.5]]), array([[ 0.5,  0.2,  0.3]])]

・ Erster Label-Wert 100: Wahrscheinlichkeit 0,3, 200: Wahrscheinlichkeit 0,5, 300: Wahrscheinlichkeit 0,2 → Wert 200. ・ Nächster Label-Wert 400: Wahrscheinlichkeit 0,2, 500: Wahrscheinlichkeit 0,3, 600: Wahrscheinlichkeit 0,5 → Wert 600. -Letztes Etikett-Wert 700: Wahrscheinlichkeit 0,5, 800: Wahrscheinlichkeit 0,2, 900: Wahrscheinlichkeit 0,3 → Wert 700.

(*5) [[0,10,10,0,0,0,0],[0,0,0,20,20,0,0],[0,0,0,0,0,30,30]]]

[[ 100.  500.  900.]
 [ 100.  400.  800.]
 [ 200.  600.  700.]]
[array([[ 0.7,  0.2,  0.1],
        [ 0.4,  0.2,  0.4],
        [ 0.3,  0.5,  0.2]]),
 array([[ 0.1,  0.7,  0.2],
        [ 0.4,  0.4,  0.2],
        [ 0.2,  0.3,  0.5]]),
 array([[ 0.2,  0.1,  0.7],
        [ 0.2,  0.4,  0.4],
        [ 0.5,  0.2,  0.3]])]

・ Erster Label-Wert 100: Wahrscheinlichkeit 0,7, 200: Wahrscheinlichkeit 0,2, 300: Wahrscheinlichkeit 0,1 → Wert 100. ・ Nächster Label-Wert 400: Wahrscheinlichkeit 0,1, 500: Wahrscheinlichkeit 0,7, 600: Wahrscheinlichkeit 0,2 → Wert 500. -Letztes Etikett-Wert 700: Wahrscheinlichkeit 0,2, 800: Wahrscheinlichkeit 0,1, 900: Wahrscheinlichkeit 0,7 → Wert 900.

・ Erster Label-Wert 100: Wahrscheinlichkeit 0,4, 200: Wahrscheinlichkeit 0,2, 300: Wahrscheinlichkeit 0,4 → Wert 100. ・ Nächster Label-Wert 400: Wahrscheinlichkeit 0,4, 500: Wahrscheinlichkeit 0,4, 600: Wahrscheinlichkeit 0,2 → Wert 400. -Letztes Etikett-Wert 700: Wahrscheinlichkeit 0,2, 800: Wahrscheinlichkeit 0,4, 900: Wahrscheinlichkeit 0,4 → Wert 800.

・ Erster Label-Wert 100: Wahrscheinlichkeit 0,3, 200: Wahrscheinlichkeit 0,5, 300: Wahrscheinlichkeit 0,2 → Wert 200. ・ Nächster Label-Wert 400: Wahrscheinlichkeit 0,2, 500: Wahrscheinlichkeit 0,3, 600: Wahrscheinlichkeit 0,5 → Wert 600. -Letztes Etikett-Wert 700: Wahrscheinlichkeit 0,5, 800: Wahrscheinlichkeit 0,2, 900: Wahrscheinlichkeit 0,3 → Wert 700.

Beachten Sie, dass die äußerste Dimension von Predict_Proba die Beschriftungsnummer ist.

Wenn sklearn.multiclass ein Problem in ein binäres Klassifizierungsproblem zerlegt und es behandelt, ist die äußerste Wiederholung unweigerlich die Bezeichnung Nr. [^ 3], daher denke ich, dass es sich um eine natürliche Spezifikation handelt.

Nachwort

Auf diese Weise ist es kompliziert und schwer zu verstehen, was jede Dimension der Schnittstellenmatrix entspricht, insbesondere bei mehreren Beschriftungen, und ich denke, es war sinnvoll, ein solches Memo zu hinterlassen.

Ich würde mich freuen, wenn Sie auf Missverständnisse hinweisen könnten.

[^ 1]: In Bezug auf zufällige Wälder gibt es einen Artikel Klassifizieren von Nachrichtenartikeln nach scikit-learn und gensim. [^ 2]: Abhängig vom Klassifizierungsalgorithmus wird dies möglicherweise nicht immer als Wahrscheinlichkeit angesehen. Im Fall von DecisionTree scheint dieser Wert entweder 0 oder 1 zu sein, da er "entschieden" ist. [^ 3]: Ich habe es nicht wirklich bestätigt.

Recommended Posts

Multi-Label-Klassifizierung nach Random Forest mit Scikit-Learn
Klassifikation / Regression durch Stapeln (Scikit-Learn)
Random Forest (Klassifizierung) und Hyperparameter-Tuning
Zufälliger Wald (2)
Zufälliger Wald
Multi-Class Multi-Label-Klassifizierung von Bildern mit Pytorch
Krankheitsklassifizierung durch Random Forest mit Python
Isomap mit Scikit-lernen
Fordern Sie die Textklassifizierung von Naive Bayes mit sklearn heraus
DBSCAN mit Scikit-Learn
Clustering mit Scikit-Learn (1)
Clustering mit Scikit-Learn (2)
PCA mit Scikit-Learn
kmeans ++ mit scikit-learn
Kreuzvalidierung mit Scikit-Learn
Mehrklassen-SVM mit Scikit-Learn
Scikit-Lernen mit Chemoinfomatik
DBSCAN (Clustering) mit Scikit-Learn
Installieren Sie scikit.learn mit pip
Berechnen Sie tf-idf mit scikit-learn
Lerne japanische Textkategorien mit tf-idf und Random Forest ~ [Tuning]
Messen Sie die Wichtigkeit von Features mit einem zufälligen Gesamtstrukturwerkzeug
Bildklassifizierung mit selbst erstelltem neuronalen Netzwerk von Keras und PyTorch
"Müll nach Bild klassifizieren!" App-Erstellungstagebuch Tag2 ~ Feinabstimmung mit VGG16 ~
Scikit-Lernentscheidung Generieren Sie Python-Code aus Baum- / Waldstrukturregeln