Multi-Label-Klassifizierung mit Deep Learning

Tweet Teilen Teilen

Zuletzt aktualisiert am 31. August 2020

Bei der Multi-Label-Klassifizierung werden null oder mehr Klassenbezeichnungen vorhergesagt.

Im Gegensatz zu normalen Klassifizierungsaufgaben, bei denen sich Klassenbezeichnungen gegenseitig ausschließen, erfordert die Multi-Label-Klassifizierung spezielle Algorithmen für maschinelles Lernen, die die Vorhersage mehrerer sich gegenseitig nicht ausschließender Klassen oder Klassenbezeichnungen unterstützen.“

Deep Learning Neuronale Netze sind ein Beispiel für einen Algorithmus, der nativ Multi-Label-Klassifizierungsprobleme unterstützt. Neuronale Netzwerkmodelle für Multi-Label-Klassifizierungsaufgaben können mit der Keras Deep Learning Library einfach definiert und ausgewertet werden.

In diesem Tutorial erfahren Sie, wie Sie Deep-Learning-Modelle für die Multi-Label-Klassifizierung entwickeln.

Nach Abschluss dieses Tutorials wissen Sie:

  • Die Multi-Label-Klassifizierung ist eine prädiktive Modellierungsaufgabe, bei der null oder mehr sich gegenseitig nicht ausschließende Klassenbezeichnungen vorhergesagt werden.
  • Neuronale Netzwerkmodelle können für Multi-Label-Klassifizierungsaufgaben konfiguriert werden.
  • Wie man ein neuronales Netzwerk für die Multi-Label-Klassifizierung auswertet und eine Vorhersage für neue Daten macht.

Lass uns anfangen.

Multi-Label-Klassifizierung mit Deep Learning

Multi-Label-Klassifizierung mit Deep Learning
Foto von Trevor Marron, einige Rechte vorbehalten.

Tutorial Übersicht

Dieses Tutorial ist in drei Teile gegliedert; sie sind:

  • Multi-Label-Klassifikation
  • Neuronale Netze für mehrere Labels
  • Neuronales Netzwerk für Multi-Label-Klassifikation

Multi-Label-Klassifikation

Die Klassifizierung ist ein prädiktives Modellierungsproblem, bei dem eine Klassenbezeichnung bei einigen Eingaben ausgegeben wird

Es unterscheidet sich von Regressionsaufgaben, bei denen eine Klassenbezeichnung vorhersage eines numerischen Werts.

In der Regel umfasst eine Klassifizierungsaufgabe die Vorhersage einer einzelnen Bezeichnung. Alternativ kann die Wahrscheinlichkeit für zwei oder mehr Klassenbezeichnungen vorhergesagt werden. In diesen Fällen schließen sich die Klassen gegenseitig aus, was bedeutet, dass die Klassifizierungsaufgabe davon ausgeht, dass die Eingabe nur zu einer Klasse gehört.

Einige Klassifizierungsaufgaben erfordern die Vorhersage von mehr als einer Klassenbezeichnung. Dies bedeutet, dass sich Klassenbezeichnungen oder Klassenmitgliedschaften nicht gegenseitig ausschließen. Diese Aufgaben werden als Multiple Label Classification oder kurz Multi-Label Classification bezeichnet.

Bei der Multi-Label-Klassifikation sind null oder mehr Labels als Ausgabe für jedes Eingabesample erforderlich, und die Ausgänge sind gleichzeitig erforderlich. Die Annahme ist, dass die Ausgabebeschriftungen eine Funktion der Eingaben sind.

Mit der Funktion make_multilabel_classification() in der scikit-learn-Bibliothek können wir einen synthetischen Klassifizierungsdatensatz für mehrere Etiketten erstellen.

Unser Datensatz enthält 1.000 Stichproben mit 10 Eingabefunktionen. Der Datensatz hat drei Klassenbeschriftungsausgaben für jede Stichprobe und jede Klasse hat einen oder zwei Werte (0 oder 1, z. B. vorhanden oder nicht vorhanden).

Das vollständige Beispiel zum Erstellen und Zusammenfassen des synthetischen Multi-Label-Klassifizierungsdatensatzes ist unten aufgeführt.

1
2
3
4
5
6
7
8
9

# beispiel für eine Multi-Label-Klassifizierungsaufgabe
von sklearn.datensätze importieren make_multilabel_classification
# Datensatz definieren
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
# form des Datensatzes zusammenfassen
drucken(X.Form, y.shape)
# Fassen Sie die ersten Beispiele zusammen
für i im Bereich(10):
drucken(X, y)

Wenn Sie das Beispiel ausführen, wird das Dataset erstellt und die Form der Eingabe- und Ausgabeelemente zusammengefasst.

Wir können sehen, dass es wie erwartet 1.000 Samples mit jeweils 10 Input-Features und drei Output-Features gibt.

Die ersten 10 Zeilen mit Ein- und Ausgängen werden zusammengefasst, und wir können sehen, dass alle Eingaben für diesen Datensatz numerisch sind und dass Ausgabeklassenbeschriftungen für jede der drei Klassenbeschriftungen 0- oder 1-Werte haben.

1
2
3
4
5
6
7
8
9
10
11
12

(1000, 10) (1000, 3)

Als nächstes schauen wir uns an, wie wir neuronale Netzwerkmodelle für Multi-Label-Klassifizierungsaufgaben entwickeln können.

Neuronale Netze für mehrere Etiketten

Einige Algorithmen für maschinelles Lernen unterstützen die Klassifizierung mehrerer Etiketten nativ.

Neuronale Netzwerkmodelle können so konfiguriert werden, dass sie die Multi-Label-Klassifizierung unterstützen, und können je nach den Besonderheiten der Klassifizierungsaufgabe eine gute Leistung erbringen.

Die Multi-Label-Klassifizierung kann direkt von neuronalen Netzen unterstützt werden, indem einfach die Anzahl der Zielbeschriftungen im Problem als Anzahl der Knoten in der Ausgabeschicht angegeben wird. Beispielsweise erfordert eine Aufgabe mit drei Ausgabebeschriftungen (Klassen) eine neuronale Netzwerkausgabeschicht mit drei Knoten in der Ausgabeschicht.

Jeder Knoten in der Ausgabeschicht muss die Sigmoid-Aktivierung verwenden. Dadurch wird eine Wahrscheinlichkeit der Klassenzugehörigkeit für das Label vorhergesagt, ein Wert zwischen 0 und 1. Schließlich muss das Modell mit der binären Kreuzentropieverlustfunktion übereinstimmen.

Um ein neuronales Netzwerkmodell für die Multi-Label-Klassifizierung zu konfigurieren, sind die Besonderheiten zusammengefasst:

  • Die Anzahl der Knoten in der Ausgabeebene entspricht der Anzahl der Beschriftungen.
  • Sigmoid-Aktivierung für jeden Knoten in der Ausgabeschicht.
  • Binäre Kreuzentropieverlustfunktion.

Wir können dies mit der Keras Deep Learning Library demonstrieren.

Wir werden ein MLP-Modell (Multilayer Perceptron) für die im vorherigen Abschnitt definierte Multi-Label-Klassifizierungsaufgabe definieren.

Jedes Sample hat 10 Eingänge und drei Ausgänge; daher benötigt das Netzwerk eine Eingangsschicht, die 10 Eingänge erwartet, die über das Argument „input_dim“ in der ersten versteckten Schicht und drei Knoten in der Ausgangsschicht angegeben sind.

Wir werden die beliebte ReLU-Aktivierungsfunktion in der versteckten Ebene verwenden. Die versteckte Ebene hat 20 Knoten, die nach einigem Ausprobieren ausgewählt wurden. Wir werden das Modell mit binärem Kreuzentropieverlust und der Adam-Version des stochastischen Gradientenabstiegs anpassen.

Die Definition des Netzwerks für die Multi-Label-Klassifizierungsaufgabe ist unten aufgeführt.

1
2
3
4
5

# definieren Sie das Modell
model = Sequential()
model .add(Dense(20, input_dim=n_inputs, kernel_initializer=’he_uniform‘, activation=’relu‘))
Modell.add(Dense(n_outputs, activation=’sigmoid‘))
Modell.compile(loss=’binary_crossentropy‘, Optimierer=’adam‘)

Daher können wir eine Funktion erstellen, um das Modell zu definieren und zurückzugeben, in dem die Anzahl der Eingabe- und Ausgabevariablen als Argumente bereitgestellt wird.

1
2
3
4
5
6
7

# holen Sie sich das Modell
def get_model(n_inputs, n_outputs):
model = Sequential()
model .add(Dense(20, input_dim=n_inputs, kernel_initializer=’he_uniform‘, activation=’relu‘))
Modell.add(Dense(n_outputs, activation=’sigmoid‘))
Modell.compile(loss=’binary_crossentropy‘, optimizer=’adam‘)
Modell zurückgeben

Nachdem wir nun mit der Definition eines MLP für die Multi-Label-Klassifizierung vertraut sind, wollen wir untersuchen, wie dieses Modell bewertet werden kann.

Neuronales Netzwerk für Multi-Label-Klassifikation

Wenn der Datensatz klein ist, empfiehlt es sich, neuronale Netzwerkmodelle wiederholt für denselben Datensatz auszuwerten und die mittlere Leistung über die Wiederholungen hinweg zu melden.

Dies liegt an der stochastischen Natur des Lernalgorithmus.

Darüber hinaus empfiehlt es sich, die k-fache Kreuzvalidierung anstelle von Zug- / Testaufteilungen eines Datensatzes zu verwenden, um eine unvoreingenommene Schätzung der Modellleistung zu erhalten, wenn Vorhersagen für neue Daten getroffen werden. Auch hier kann der Prozess nur dann in angemessener Zeit abgeschlossen werden, wenn nicht zu viele Daten vorhanden sind.

Unter Berücksichtigung dieser Tatsache werden wir das MLP-Modell für die Multi-Output-Regressionsaufgabe unter Verwendung einer wiederholten k-fachen Kreuzvalidierung mit 10 Falten und drei Wiederholungen bewerten.

Das MLP-Modell prognostiziert standardmäßig die Wahrscheinlichkeit für jede Klassenbezeichnung. Dies bedeutet, dass für jede Stichprobe drei Wahrscheinlichkeiten vorhergesagt werden. Diese können in gestochen scharfe Klassenbezeichnungen umgewandelt werden, indem die Werte auf 0 oder 1 gerundet werden. Wir können dann die Klassifizierungsgenauigkeit für die Crisp-Klassenetiketten berechnen.

1
2
3
4
5
6
7

# Machen Sie eine Vorhersage für das Testset
yhat = model .predict(X_test)
# Wahrscheinlichkeiten auf Klassenbezeichnungen runden
yhat = yhat .round()
# Genauigkeit berechnen
acc = accuracy_score(y_test, yhat)

Die Scores werden gesammelt und können zusammengefasst werden, indem der Mittelwert und die Standardabweichung über alle Wiederholungen und Kreuzvalidierungsfalten hinweg gemeldet werden.

Die folgende Funktion evaluate_model() nimmt den Datensatz, wertet das Modell aus und gibt eine Liste der Bewertungsergebnisse zurück, in diesem Fall Genauigkeitswerte.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# bewerten Sie ein Modell mit wiederholter k-facher Kreuzvalidierung
def evaluate_model(X, y):
results = list()
n_inputs, n_outputs = X.shape, y.shape
# Auswerteprozedur definieren
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# enumerate folds
für train_ix, test_ix in cv.split(X):
# Daten vorbereiten
X_train, X_test = X, X
y_train, y_test = y, y
# Modell definieren
model = get_model(n_inputs, n_outputs)
# Modell anpassen
Modell.fit(X_train, y_train, ausführlich = 0, Epochen=100)
# machen Sie eine Vorhersage für den Testsatz
yhat = model .predict(X_test)
# Wahrscheinlichkeiten auf Klassenbezeichnungen runden
yhat = yhat .round()
# Genauigkeit berechnen
acc = accuracy_score(y_test, yhat)
# Ergebnis speichern
print(‚>%.3f‘ % acc)
Ergebnisse.append(acc)
Ergebnisse zurückgeben

Wir können dann unseren Datensatz laden und das Modell auswerten und die mittlere Leistung melden.

Das vollständige Beispiel ist unten aufgeführt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# mlp für Multi-Label-Klassifizierung
von numpy import mean
von numpy import std
von sklearn.datensätze importieren make_multilabel_classification
von sklearn.model_selection import RepeatedKFold
von keras.modelle importieren Sequential
von keras.ebenen importieren Dense
aus sklearn.metrics import accuracy_score
# Datensatz abrufen
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, y
# Holen Sie sich das Modell
def get_model(n_inputs, n_outputs):
model = Sequential()
model.add(Dense(20, input_dim=n_inputs, kernel_initializer=’he_uniform‘, activation=’relu‘))
Modell.add(Dense(n_outputs, activation=’sigmoid‘))
Modell.compile(loss=’binary_crossentropy‘, optimizer=’adam‘)
return model
# Bewerten Sie ein Modell mit wiederholter k-facher Kreuzvalidierung
def evaluate_model(X, y):
results = list()
n_inputs, n_outputs = X. form, y.form
# Auswerteprozedur definieren
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# enumerate folds
für train_ix, test_ix in cv.split(X):
# Daten vorbereiten
X_train, X_test = X, X
y_train, y_test = y, y
# Modell definieren
model = get_model(n_inputs, n_outputs)
# Modell anpassen
Modell.fit(X_train, y_train, ausführlich = 0, Epochen=100)
# machen Sie eine Vorhersage für den Testsatz
yhat = model .predict(X_test)
# Wahrscheinlichkeiten auf Klassenbezeichnungen runden
yhat = yhat .round()
# Genauigkeit berechnen
acc = accuracy_score(y_test, yhat)
# Ergebnis speichern
print(‚>%.3f‘ % acc)
Ergebnisse.append(acc)
Ergebnisse zurückgeben
# Datensatz laden
X, y = get_dataset()
# Modell auswerten
Ergebnisse = evaluate_model(X, y)
# Leistung zusammenfassen
print( ‚Genauigkeit: %.3f (%.3f)‘ % (Mittelwert (Ergebnisse), std(Ergebnisse)))

Das Ausführen des Beispiels meldet die Klassifizierungsgenauigkeit für jede Falte und jede Wiederholung, um eine Vorstellung vom Bewertungsfortschritt zu erhalten.

Hinweis: Ihre Ergebnisse können aufgrund der stochastischen Natur des Algorithmus oder des Auswertungsverfahrens oder aufgrund von Unterschieden in der numerischen Genauigkeit variieren. Führen Sie das Beispiel einige Male aus und vergleichen Sie das durchschnittliche Ergebnis.

Am Ende wird die Mittelwert- und Standardabweichungsgenauigkeit angegeben. In diesem Fall erreicht das Modell eine Genauigkeit von etwa 81,2 Prozent.

Sie können diesen Code als Vorlage für die Bewertung von MLP-Modellen für Ihre eigenen Multi-Label-Klassifizierungsaufgaben verwenden. Die Anzahl der Knoten und Layer im Modell kann einfach angepasst und an die Komplexität Ihres Datensatzes angepasst werden.

1
2
3
4
5
6
7

>0.780
>0.820
>0.790
>0.810
>0.840
Genauigkeit: 0.812 (0.032)

Sobald eine Modellkonfiguration ausgewählt ist, können wir sie verwenden, um ein endgültiges Modell an alle verfügbaren Daten anzupassen und eine Vorhersage für neue Daten zu treffen.

Das folgende Beispiel veranschaulicht dies, indem zuerst das MLP-Modell auf den gesamten Multi-Label-Klassifizierungsdatensatz angepasst und dann die Funktion predict() für das gespeicherte Modell aufgerufen wird, um eine Vorhersage für eine neue Datenzeile zu treffen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# mlp für Prognosen nutzen auf Multi-Label-Klassifizierung
von numpy import asarray
von sklearn.datensätze importieren make_multilabel_classification
aus keras.modelle importieren Sequential
von keras.ebenen importieren:
# Holen Sie sich den Datensatz
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, y
# Holen Sie sich das Modell
def get_model(n_inputs, n_outputs):
model = Sequential()
model.add(Dense(20, input_dim=n_inputs, kernel_initializer=’he_uniform‘, activation=’relu‘))
Modell.add(Dense(n_outputs, activation=’sigmoid‘))
Modell.compile(loss=’binary_crossentropy‘, optimizer=’adam‘)
Modell zurückgeben
# Datensatz laden
X, y = get_dataset()
n_inputs, n_outputs = X.shape, y.shape
# Modell abrufen
model = get_model(n_inputs, n_outputs)
# Passen Sie das Modell an alle Daten an
Modell.fit(X, y, ausführlich = 0, Epochen=100)
# machen Sie eine Vorhersage für neue Daten
row =
newX = asarray()
yhat = model .vorhersagen (newX)
drucken(‚Vorhergesagt: %s‘ % y))

Das Ausführen des Beispiels passt zum Modell und macht eine Vorhersage für eine neue Zeile. Wie erwartet enthält die Vorhersage drei Ausgabevariablen, die für die Multi-Label-Klassifizierungsaufgabe erforderlich sind: die Wahrscheinlichkeiten jeder Klassenbezeichnung.

1
Vorhergesagt:

Weiterführende Literatur

Dieser Abschnitt enthält weitere Ressourcen zu diesem Thema, wenn Sie tiefer gehen möchten.

  • Multi-Label-Klassifikation, Wikipedia.
  • sklern.DataSet.make_multilabel_classification API.
  • Keras Homepage.
  • sklern.Modellauswahl.RepeatedStratifiedKFold API.

Zusammenfassung

In diesem Tutorial erfuhren Sie, wie Sie Deep-Learning-Modelle für die Multi-Label-Klassifizierung entwickeln.

Insbesondere haben Sie gelernt:

  • Die Multi-Label-Klassifizierung ist eine prädiktive Modellierungsaufgabe, bei der null oder mehr sich gegenseitig nicht ausschließende Klassenbezeichnungen vorhergesagt werden.
  • Neuronale Netzwerkmodelle können für Multi-Label-Klassifizierungsaufgaben konfiguriert werden.
  • Wie man ein neuronales Netzwerk für die Multi-Label-Klassifizierung auswertet und eine Vorhersage für neue Daten macht.

Haben Sie Fragen?
Stellen Sie Ihre Fragen in den Kommentaren unten und ich werde mein Bestes tun, um zu antworten.

Entwickeln Sie Deep Learning Projekte mit Python!

Deep Learning mit Python

Was wäre, wenn Sie in wenigen Minuten ein Netzwerk entwickeln könnten

…mit nur wenigen Zeilen Python

Entdecken Sie, wie in meinem neuen Ebook:
Deep Learning mit Python

Es umfasst End-to-End-Projekte zu Themen wie:
Multilayer Perceptrons, Faltungsnetze und rekurrente neuronale Netze und vieles mehr…

Bringen Sie endlich Deep Learning zu
Ihren eigenen Projekten

Überspringen Sie die Akademiker. Nur Ergebnisse.

Sehen, was drin ist

Tweet Teilen Teilen



+