Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow. Aurélien Géron. Читать онлайн. Newlib. NEWLIB.NET

Автор: Aurélien Géron
Издательство: Bookwire
Серия:
Жанр произведения: Математика
Год издания: 0
isbn: 9783960103400
Скачать книгу
kompakteres Qualitätsmaß. Ein interessantes Maß ist die Genauigkeit der positiven Vorhersagen; dies nennt man auch die Relevanz (engl. Precision) des Klassifikators (siehe Formel 3-1).

       Formel 3-1: Relevanz

image

      RP ist dabei die Anzahl richtig Positiver und FP die Anzahl falsch Positiver.

      Eine perfekte Relevanz lässt sich trivialerweise erhalten, indem man eine einzige positive Vorhersage trifft und sicherstellt, dass sie richtig ist (Relevanz = 1/1 = 100%). Dies wäre nicht besonders nützlich, da der Klassifikator dann alle außer einem positiven Datenpunkt ignorieren würde. Daher geht die Relevanz üblicherweise mit einem zweiten Maß namens Sensitivität (engl. Recall) einher, das auch als Trefferquote oder Richtig-positiv-Rate (TPR) bezeichnet wird: Dieses ist der Anteil positiver Datenpunkte, die vom Klassifikator entdeckt wurden (siehe Formel 3-2).

       Formel 3-2: Sensitivität

image

      RN ist dabei natürlich die Anzahl falsch Negativer.

      Falls Sie die Konfusionsmatrix verwirrt, hilft Ihnen womöglich Abbildung 3-2.

       Abbildung 3-2: Eine illustrierte Konfusionsmatrix

       Relevanz und Sensitivität

      Scikit-Learn enthält mehrere Funktionen zum Berechnen von Klassifikationsmetriken, darunter Relevanz und Sensitivität:

      >>> from sklearn.metrics import precision_score, recall_score

      >>> precision_score(y_train_5, y_train_pred) # == 4096 / (4096 + 1522)

      0.7290850836596654

      >>> recall_score(y_train_5, y_train_pred) # == 4096 / (4096 + 1325)

      0.7555801512636044

      Damit glänzt Ihr 5-Detektor nicht mehr so stark, wie es die Genauigkeit zunächst vermuten ließ. Wenn er erklärt, dass ein Bild eine 5 enthält, liegt er nur in 72,9% der Fälle richtig. Außerdem findet er nur 75,6% der vorhandenen 5en.

      Es ist oft bequem, Relevanz und Sensitivität zu einer einzigen Metrik zu kombinieren, dem F1-Score, insbesondere wenn Sie zwei Klassifikatoren miteinander vergleichen möchten. Der F1-Score ist der harmonische Mittelwert von Relevanz und Sensitivität (siehe Formel 3-3). Während der gewöhnliche Mittelwert alle Werte gleich behandelt, erhalten beim harmonischen Mittelwert niedrigere Mittelwerte ein weitaus höheres Gewicht. Daher erhält ein Klassifikator nur dann einen hohen F1-Score, wenn sowohl Relevanz als auch Sensitivität hoch sind.

       Formel 3-3: F1

image

      Der F1-Score lässt sich mit der Funktion f1_score() berechnen:

      >>> from sklearn.metrics import f1_score

      >>> f1_score(y_train_5, y_pred)

      0.7420962043663375

      Der F1-Score begünstigt Klassifikatoren mit ähnlicher Relevanz und Sensitivität. Das ist nicht immer erwünscht: Bei manchen Anwendungen ist Relevanz wichtiger, in anderen ist die Sensitivität von herausragender Bedeutung. Wenn Sie beispielsweise einen Klassifikator trainieren, der für Kinder geeignete Videos erkennt, werden Sie vermutlich einen bevorzugen, der zwar viele gute Videos verwirft (niedrige Sensitivität), aber wirklich nur geeignete anzeigt (hohe Relevanz). Ablehnen werden Sie hingegen den Klassifikator, der zwar eine hohe Sensitivität aufweist, dafür aber ein paar wirklich ungeeignete Videos in Ihrem Produkt anzeigt (in solchen Fällen könnten Sie sogar erwägen, die Videoauswahl des Klassifikators von Hand zu überprüfen). Wenn Sie andererseits Einkaufsdiebstähle auf den Bildern einer Überwachungskamera erkennen möchten, ist es vermutlich in Ordnung, wenn Ihr Klassifikator eine Relevanz von nur 30% erzielt, dafür aber eine Sensitivität von 99% aufweist (das Sicherheitspersonal wird dann einige Fehlalarme erhalten, aber fast alle Diebe werden geschnappt).

      Leider können Sie nicht beides haben: Ein Erhöhen der Relevanz senkt die Sensitivität und umgekehrt. Dies nennt man auch die Wechselbeziehung zwischen Relevanz und Sensitivität.

       Die Wechselbeziehung zwischen Relevanz und Sensitivität

      Um diese Wechselbeziehung besser zu verstehen, betrachten wir, wie der SGDClassifier bei der Klassifikation Entscheidungen trifft. Für jeden Datenpunkt wird anhand einer Entscheidungsfunktion ein Score berechnet, und falls dieser Score über einem Schwellenwert liegt, wird der Datenpunkt der positiven Kategorie zugeordnet, andernfalls der negativen Kategorie. Abbildung 3-3 zeigt einige Ziffern mit dem niedrigsten Score auf der linken und dem höchsten Score auf der rechten Seite. Nehmen wir an, die Entscheidungsgrenze läge beim Pfeil in der Mitte (zwischen den zwei 5en): Sie erhalten dann vier richtig Positive (echte 5en) auf der rechten Seite des Schwellenwerts und einen falsch Positiven (eine 6).

      Abbildung 3-3: Bei dieser Wechselbeziehung zwischen Relevanz und Sensitivität werden Bilder aufgrund ihres Klassifikationsscores bewertet – solche oberhalb des gewählten Schwellenwerts betrachtet man als positiv. Je höher der Schwellenwert ist, desto geringer ist die Sensitivität, aber desto höher ist (im Allgemeinen) auch die Relevanz.

      In Scikit-Learn können Sie den Schwellenwert nicht direkt festlegen, aber die zur Vorhersage verwendeten Scores der Entscheidungsfunktion sind verfügbar. Anstatt die Methode predict() eines Klassifikators aufzurufen, können Sie die Methode decision_function() verwenden, die für jeden Datenpunkt einen Score liefert, auf dessen Grundlage Sie Vorhersagen mit einem beliebigen Schwellenwert treffen können:

      >>> y_scores = sgd_clf.decision_function([some_digit])

      >>> y_scores

      array([2412.53175101])

      >>> threshold = 0

      >>> y_some_digit_pred = (y_scores > threshold)

      array([ True])

      Der SGDClassifier verwendet als Schwellenwert 0, sodass der obige Code das gleiche Ergebnis wie die Methode predict() liefert (nämlich True). Erhöhen wir nun diesen Schwellenwert:

      >>> threshold = 8000

      >>> y_some_digit_pred = (y_scores > threshold)

      >>> y_some_digit_pred

      array([False])

      Das bestätigt uns, dass ein Erhöhen des Schwellenwerts die Sensitivität verringert.