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

Автор: Aurélien Géron
Издательство: Bookwire
Серия:
Жанр произведения: Математика
Год издания: 0
isbn: 9783960103400
Скачать книгу
Qualitätsmaße

      Einen Klassifikator auszuwerten, ist oft deutlich verzwickter, als einen Regressor auszuwerten, daher werden wir einen Großteil dieses Kapitels mit diesem Thema zubringen. Es gibt viele unterschiedliche Qualitätsmaße. Schnappen Sie sich also noch einen Kaffee und seien Sie bereit, viele neue Begriffe und Abkürzungen kennenzulernen!

       Messen der Genauigkeit über Kreuzvalidierung

      Kreuzvalidierung ist eine gute Möglichkeit zum Auswerten von Modellen, wie Sie bereits in Kapitel 2 gesehen haben.

       Implementierung der Kreuzvalidierung

      Bisweilen benötigen Sie eine genauere Kontrolle über den Prozess der Kreuzvalidierung, als sie von Scikit-Learn angeboten wird. In diesen Fällen können Sie die Kreuzvalidierung selbst implementieren. Das folgende Codebeispiel tut in etwa das Gleiche wie die Scikit-Learn-Funktion cross_val_score() und liefert das gleiche Ergebnis:

      from sklearn.model_selection import StratifiedKFold

      from sklearn.base import clone

      skfolds = StratifiedKFold(n_splits=3, random_state=42)

      for train_index, test_index in skfolds.split(X_train, y_train_5):

      clone_clf = clone(sgd_clf)

      X_train_folds = X_train[train_index]

      y_train_folds = y_train_5[train_index]

      X_test_fold = X_train[test_index]

      y_test_fold = y_train_5[test_index]

      clone_clf.fit(X_train_folds, y_train_folds)

      y_pred = clone_clf.predict(X_test_fold)

      n_correct = sum(y_pred == y_test_fold)

      print(n_correct / len(y_pred)) # gibt 0.9502, 0.96565 und 0.96495 aus

      Die Klasse StratifiedKFold bildet eine stratifizierte Stichprobe (wie in Kapitel 2 erklärt), um Folds mit einer repräsentativen Anzahl Punkte aus jeder Kategorie zu ermitteln. Bei jeder Iteration erstellt der Code einen Klon des Klassifikators, trainiert diesen auf den zum Trainieren abgestellten Folds und führt eine Vorhersage für den Fold zum Testen durch. Anschließend ermittelt er die Anzahl korrekter Vorhersagen und gibt deren Anteil aus.

      Wir verwenden die Funktion cross_val_score(), um unser SGDClassifier-Modell mit k-facher Kreuzvalidierung und drei Folds auszuwerten. Bei der k-fachen Kreuzvalidierung wird der Trainingsdatensatz bekanntlich in k Folds aufgeteilt (drei in diesem Fall), anschließend werden auf jedem Fold Vorhersagen getroffen und ausgewertet, wobei das Modell mit den jeweils restlichen Folds trainiert wird (siehe Kapitel 2):

      >>> from sklearn.model_selection import cross_val_score

      >>> cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring="accuracy")

      array([0.96355, 0.93795, 0.95615])

      Wow! Eine Genauigkeit über 93% (Anteil korrekter Vorhersagen) auf sämtlichen Folds der Kreuzvalidierung? Das sieht fantastisch aus, nicht wahr? Bevor Sie sich aber vom Ergebnis mitreißen lassen, betrachten wir zum Vergleich einen sehr primitiven Klassifikator, der einfach jedes Bild der Kategorie »nicht-5« zuordnet:

      from sklearn.base import BaseEstimator

      class Never5Classifier(BaseEstimator):

      def fit(self, X, y=None):

      pass

      def predict(self, X):

      return np.zeros((len(X), 1), dtype=bool)

      Können Sie die Genauigkeit dieses Modells erraten? Finden wir es heraus:

      >>> never_5_clf = Never5Classifier()

      >>> cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring="accuracy")

      array([0.91125, 0.90855, 0.90915])

      Richtig, es hat eine Genauigkeit von über 90%! Dies liegt einfach daran, dass nur etwa 10% der Bilder 5en sind. Wenn Sie also jedes Mal darauf tippen, dass ein Bild keine 5 enthält, werden Sie in 90% der Fälle richtig liegen. Damit schlagen Sie sogar Nostradamus.

      Dies zeigt, warum die Genauigkeit bei Klassifikatoren für gewöhnlich nicht das Qualitätsmaß der Wahl ist, besonders wenn Sie es mit unbalancierten Datensätzen zu tun haben (also solchen, bei denen einige Kategorien viel häufiger als andere auftreten).

       Konfusionsmatrix

      Eine weitaus bessere Möglichkeit zum Auswerten der Vorhersageleistung eines Klassifikators ist das Betrachten einer Konfusionsmatrix. Die Idee dabei ist, die Datenpunkte auszuzählen, bei denen Kategorie A als Kategorie B klassifiziert wird. Um zum Beispiel zu sehen, wie oft der Klassifikator das Bild einer 5 für eine 3 gehalten hat, würden Sie in der 5. Zeile und der 3. Spalte der Konfusionsmatrix nachschauen.

      Um eine Konfusionsmatrix zu berechnen, benötigen Sie einen Satz Vorhersagen, die sich dann mit den korrekten Zielwerten vergleichen lassen. Sie könnten auch auf dem Testdatensatz Vorhersagen treffen, wir lassen das aber im Moment beiseite (denken Sie daran, dass Sie die Testdaten erst ganz am Ende Ihres Projekts verwenden sollten, sobald Sie einen einsatzbereiten Klassifikator haben). Stattdessen können Sie die Funktion cross_val_predict() einsetzen:

      from sklearn.model_selection import cross_val_predict

      y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)

      Wie die Funktion cross_val_score() führt auch cross_val_predict() eine k-fache Kreuzvalidierung durch, aber anstatt Genauigkeiten zurückzugeben, liefert sie die für jeden Test-Fold berechneten Vorhersagen. Damit erhalten Sie für jeden Datenpunkt im Trainingsdatensatz eine saubere Vorhersage (»sauber« bedeutet, dass das zur Vorhersage eingesetzte Modell diese Daten beim Trainieren nicht gesehen hat).

      Nun sind wir bereit, die Konfusionsmatrix mit der Funktion confusion_matrix() zu berechnen. Wir übergeben dieser einfach die Zielkategorien (y_train_5) und die vorhergesagten Kategorien (y_train_pred):

      >>> from sklearn.metrics import confusion_matrix

      >>> confusion_matrix(y_train_5, y_train_pred)

      array([[53057, 1522],

      [ 1325, 4096]])

      Jede Zeile in einer Konfusionsmatrix steht für eine tatsächliche Kategorie, während jede Spalte eine vorhergesagte Kategorie darstellt. Die erste Zeile dieser Matrix beinhaltet Nicht-5-Bilder (die negative Kategorie): 53.057 davon wurden korrekt als Nicht-5en klassifiziert (man nennt diese richtig Negative), die übrigen 1.522 wurden fälschlicherweise als 5en klassifiziert (falsch Positive). Die zweite Zeile betrachtet die Bilder mit 5en (die positive Kategorie): 1.325 Bilder wurden fälschlicherweise als Nicht-5en vorhergesagt (falsch Negative), die restlichen 4.096 wurden korrekt als 5en vorhergesagt (richtig Positive). Ein perfekter Klassifikator würde lediglich richtig Positive und richtig Negative produzieren, sodass die Konfusionsmatrix nur auf der Hauptdiagonalen (von links oben nach rechts unten) Werte ungleich null enthielte:

      >>> y_train_perfect_predictions = y_train_5 # als ob wir perfekt wären

      >>> confusion_matrix(y_train_5, y_train_perfect_predictions)

      array([[54579, 0],

      [ 0, 5421]])

      Die Konfusionsmatrix