Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 105
Klassifikation mit mehreren Labels
ОглавлениеBisher wurde jeder Datenpunkt stets genau einer Kategorie zugeordnet. In einigen Fällen kann es sein, dass Sie Ihren Klassifikator mehrere Kategorien für jeden Datenpunkt ausgeben lassen möchten. Betrachten Sie beispielsweise einen Klassifikator zur Gesichtserkennung: Was sollte dieser tun, wenn er mehrere Personen im gleichen Bild findet? Natürlich sollte er jeder erkannten Person ein Tag zuordnen. Sagen wir einmal, der Klassifikator sei auf drei Gesichtern trainiert worden: Alice, Bob und Charlie. Wenn er anschließend ein Bild von Alice und Bob gezeigt bekommt, sollte er [1, 0, 1] ausgeben (was bedeutet: »Alice ja, Bob nein, Charlie ja«). Solch einen Klassifikator, der mehrere binäre Tags ausgibt, nennt man ein Klassifikationssystem mit mehreren Labels.
Wir beschäftigen uns an dieser Stelle noch nicht mit Gesichtserkennung. Stattdessen betrachten wir zur Veranschaulichung ein einfacheres Beispiel:
from sklearn.neighbors import KNeighborsClassifier
y_train_large = (y_train >= 7)
y_train_odd = (y_train % 2 == 1)
y_multilabel = np.c_[y_train_large, y_train_odd]
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_multilabel)
Dieses Codebeispiel erstellt das Array y_multilabel mit zwei Labels als Ziel für jedes Ziffernbild: Das erste besagt, ob die Ziffer groß ist (7, 8 oder 9), und das zweite, ob sie ungerade ist. Die folgenden Zeilen erstellen eine Instanz von KNeighborsClassifier (diese unterstützt die Klassifikation mehrerer Labels, was nicht alle Klassifikatoren tun). Wir trainieren diesen mit dem Array mit mehreren Zielwerten. Nun können Sie eine Vorhersage vornehmen und bemerken, dass zwei Labels ausgegeben werden:
>>> knn_clf.predict([some_digit])
array([[False, True]])
Und das Ergebnis ist richtig! Die Ziffer 5 ist tatsächlich nicht groß (False) und ungerade (True).
Es gibt viele Möglichkeiten, einen Klassifikator mit mehreren Labels auszuwerten, und die Wahl der richtigen Metrik hängt von Ihrem Projekt ab. Ein Ansatz ist beispielsweise, den F1-Score für jedes Label einzeln zu bestimmen (oder eine andere der oben besprochenen binären Klassifikationsmetriken) und anschließend einfach deren Mittelwert zu berechnen. Der folgende Code berechnet den mittleren F1-Score über sämtliche Labels:
>>> y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)
>>> f1_score(y_multilabel, y_train_knn_pred, average="macro")
0.976410265560605
Dabei nehmen wir an, dass alle Labels gleich wichtig sind, was nicht der Fall sein muss. Wenn Sie zum Beispiel viel mehr Bilder von Alice als von Bob oder Charlie haben, sollten Sie dem Score eines Klassifikators bei Alice ein höheres Gewicht verleihen. Eine einfache Möglichkeit ist dabei, jedem Label ein Gewicht entsprechend der Anzahl Datenpunkte mit diesem Label (dem Support) zu verleihen. Um das zu erreichen, setzen Sie im obigen Codebeispiel average="weighted".4