Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow. Aurélien Géron

Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron


Скачать книгу
mehrere Labels aufweist (ein Label pro Bildpunkt) und jedes Label mehrere Werte annehmen kann (Pixelintensitäten von 0 bis 255). Daher ist dies ein Beispiel für ein Klassifikationssystem mit mehreren Ausgaben.

image Die Unterscheidung zwischen Klassifikation und Regression ist wie in diesem Beispiel manchmal unscharf. Es lässt sich argumentieren, dass die Vorhersage der Intensität von Pixeln mehr mit Regression als mit Klassifikation zu tun hat. Außerdem sind Systeme mit mehreren Ausgaben nicht auf Klassifikationsaufgaben beschränkt; Sie könnten sogar ein System entwickeln, das mehrere Labels pro Datenpunkt ausgibt, darunter Kategorien und Werte.

      Erstellen wir zunächst Trainings- und Testdatensätze, indem wir den Intensitäten der Pixel in den MNIST-Bildern mit der Funktion randint() aus NumPy Rauschen hinzufügen. Die Zielbilder sind dann die Originalbilder:

      noise = rnd.randint(0, 100, (len(X_train), 784))

      X_train_mod = X_train + noise

      noise = rnd.randint(0, 100, (len(X_test), 784))

      X_test_mod = X_test + noise

      y_train_mod = X_train

      y_test_mod = X_test

      Schauen wir uns ein Bild aus dem Testdatensatz an (ja, wir schnüffeln hier in den Testdaten herum, Sie sollten an dieser Stelle entrüstet seufzen):

image

      Auf der linken Seite ist das verrauschte Eingabebild und auf der rechten Seite das saubere Zielbild. Trainieren wir nun den Klassifikator, um dieses Bild zu säubern:

      knn_clf.fit(X_train_mod, y_train_mod)

      clean_digit = knn_clf.predict([X_test_mod[some_index]])

      plot_digit(clean_digit)

image

      Wir sind nah genug am Ziel! Damit beenden wir unsere Tour durch die Klassifikationsverfahren. Sie wissen nun, wie Sie Metriken für Klassifikationsaufgaben auswählen, einen guten Kompromiss zwischen Relevanz und Sensitivität eingehen, Klassifikatoren vergleichen und ganz allgemein gute Systeme für unterschiedliche Klassifikationsaufgaben konstruieren.

       Übungen

      1 Versuchen Sie, einen Klassifikator für den MNIST-Datensatz zu entwickeln, der auf den Testdaten eine Genauigkeit von mehr als 97% erzielt. Hinweis: Der KNeighborsClassifier funktioniert bei dieser Aufgabe recht gut; Sie müssen aber geeignete Hyperparameter finden (probieren Sie eine Gittersuche auf den Hyperparametern weights und n_neighbors).

      2 Schreiben Sie eine Funktion, mit der sich ein MNIST-Bild in jede Richtung (links, rechts, oben, unten) um ein Pixel verschieben lässt.5 Erstellen Sie anschließend aus sämtlichen Bildern im Trainingsdatensatz vier verschobene Kopien (eine pro Richtung) und fügen Sie diese den Trainingsdaten hinzu. Trainieren Sie dann Ihr bestes Modell auf dem so erweiterten Trainingsdatensatz und messen Sie die Genauigkeit auf den Testdaten. Sie sollten beobachten, dass das Modell noch besser wird! Diese Technik, einen Trainingsdatensatz künstlich zu vergrößern, nennt man Data Augmentation oder Erweitern des Trainingsdatensatzes.

      3 Versuchen Sie sich am Titanic-Datensatz. Ein geeigneter Ort, dies auszuprobieren, ist Kaggle (https://www.kaggle.com/c/titanic).

      4 Entwickeln Sie einen Spamfilter (eine fortgeschrittene Übung):– Laden Sie Beispiele für Spam und Ham aus dem öffentlichen Datensatz von Apache SpamAssassin (https://homl.info/spamassassin) herunter.– Entpacken Sie die Datensätze und machen Sie sich mit dem Format der Daten vertraut.– Unterteilen Sie die Datensätze in Trainings- und Testdaten.– Schreiben Sie eine Pipeline zur Vorverarbeitung der Daten, um jede E-Mail in einen Merkmalsvektor zu überführen. Ihre Pipeline sollte eine E-Mail in einen (dünn besetzten) Vektor transformieren, der das Vorhandensein jedes möglichen Worts beinhaltet. Wenn beispielsweise sämtliche E-Mails nur die vier Wörter »Hello«, »how«, »are«, »you« enthielten, würde aus der E-Mail »Hello you Hello Hello you« der Vektor [1, 0, 0, 1] entstehen ([»Hello« ist vorhanden, »how« und »are« nicht, »you« ist vorhanden]) oder [3, 0, 0, 2], falls Sie die Häufigkeit jedes Worts auszählen möchten.

      Sie können Ihrer Pipeline Hyperparameter hinzufügen, um einzustellen, ob der Header der E-Mails verworfen werden soll oder nicht. Sie können jede E-Mail in Kleinbuchstaben umwandeln, Interpunktion entfernen, alle URLs durch »URL« und alle Zahlen durch »NUMBER« ersetzen oder sogar Stemming einsetzen (also die Endungen von Wörtern entfernen; es gibt für diesen Zweck Python-Bibliotheken).

      Probieren Sie anschließend mehrere Klassifikatoren aus und prüfen Sie, ob Sie einen guten Spamfilter bauen können, der eine hohe Sensitivität und Relevanz aufweist.

      Lösungen zu diesen Übungen finden Sie in den Jupyter-Notebooks auf https://github.com/ageron/handson-ml2.

       KAPITEL 4

       Trainieren von Modellen

      Bisher haben wir Modelle zum Machine Learning und deren Trainingsalgorithmen mehr oder weniger als Black Box behandelt. Wenn Sie sich mit den Übungen in den ersten Kapiteln beschäftigt haben, war es vielleicht überraschend für Sie, wie viel Sie erreichen können, ohne etwas über die Funktionsweise der Modelle zu wissen: Sie haben ein System zur Regression optimiert, Sie haben einen Klassifikator für Ziffern verbessert und sogar einen Spamfilter aufgebaut – alles ohne zu wissen, wie diese eigentlich funktionieren. Tatsächlich brauchen Sie in den meisten Fällen die Details der Implementierung nicht zu kennen.

      Ein Grundverständnis der Funktionsweise der Modelle hilft Ihnen allerdings dabei, sich schnell auf ein geeignetes Modell, das richtige Trainingsverfahren und einen guten Satz Hyperparameter für Ihre Aufgabe einzuschießen. Die Hintergründe zu verstehen, hilft Ihnen auch bei der Fehlersuche und erlaubt eine effizientere Fehleranalyse. Schließlich sind die meisten in diesem Kapitel besprochenen Themen eine Voraussetzung für Verständnis, Aufbau und Training von neuronalen Netzen (mit denen wir uns in Teil II dieses Buchs befassen werden).

      In diesem Kapitel betrachten wir Modelle zur linearen Regression, einem der einfachsten Modelle überhaupt. Wir werden zwei unterschiedliche Ansätze zum Trainieren diskutieren:

       Verwenden einer Gleichung mit »geschlossener Form«, die die für den Trainingsdatensatz idealen Modellparameter direkt berechnet (also die Modellparameter, die eine Kostenfunktion über die Trainingsdaten minimieren).

       Verwenden eines iterativen Optimierungsverfahrens, des Gradientenverfahrens (GD), bei dem die Modellparameter schrittweise angepasst werden, um die Kostenfunktion über die Trainingsdaten zu minimieren und dabei möglicherweise die gleichen Parameter wie beim ersten Ansatz zu erhalten. Wir werden einige Varianten des Gradientenverfahrens betrachten, die uns bei den neuronalen Netzen in Teil II wieder und wieder begegnen werden: das Batch-Gradientenverfahren, das Mini-Batch-Gradientenverfahren und das stochastische Gradientenverfahren.

      Anschließend werden wir einen Blick auf die polynomielle Regression werfen, ein komplexeres Modell, das sich auch für nichtlineare Daten eignet. Da es bei diesem Modell mehr Parameter als bei der linearen Regression gibt, ist es anfälliger für ein Overfitting der Trainingsdaten. Wir werden uns daher


Скачать книгу