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


Скачать книгу
sorted(zip(feature_importances, attributes), reverse=True)

      [(0.3661589806181342, 'median_income'),

      (0.1647809935615905, 'INLAND'),

      (0.10879295677551573, 'pop_per_hhold'),

      (0.07334423551601242, 'longitude'),

      (0.0629090704826203, 'latitude'),

      (0.05641917918195401, 'rooms_per_hhold'),

      (0.05335107734767581, 'bedrooms_per_room'),

      (0.041143798478729635, 'housing_median_age'),

      (0.014874280890402767, 'population'),

      (0.014672685420543237, 'total_rooms'),

      (0.014257599323407807, 'households'),

      (0.014106483453584102, 'total_bedrooms'),

      (0.010311488326303787, '<1H OCEAN'),

      (0.002856474637320158, 'NEAR OCEAN'),

      (0.00196041559947807, 'NEAR BAY'),

      (6.028038672736599e-05, 'ISLAND')]

      Mit dieser Information könnten Sie einige der weniger nützlichen Merkmale entfernen (z.B. ist offenbar nur eine Kategorie für die Nähe zum Ozean wirklich nützlich, Sie könnten versuchen, die übrigen wegzulassen).

      Sie sollten ebenfalls versuchen, die Fehler Ihres Systems zu betrachten und zu verstehen, warum es diese begeht und wie sie behoben werden könnten (z.B. durch Hinzufügen von zusätzlichen Merkmalen oder Entfernen von überflüssigen, von Ausreißern und so weiter).

       Evaluiere das System auf dem Testdatensatz

      Haben Sie Ihre Modelle über eine gewisse Zeit optimiert, haben Sie ein System, das ausreichend gut funktioniert. Nun kann das endgültige Modell mit dem Testdatensatz evaluiert werden. Daran ist nichts Besonderes; Sie nehmen die Prädiktoren und Labels Ihres Testdatensatzes, transformieren die Daten mit full_pipeline (rufen Sie transform() auf, nicht fit_transform(), denn Sie wollen nicht an den Testdatensatz anpassen!) und evaluieren das endgültige Modell mit den Testdaten:

      final_model = grid_search.best_estimator_

      X_test = strat_test_set.drop("median_house_value", axis=1)

      y_test = strat_test_set["median_house_value"].copy()

      X_test_prepared = full_pipeline.transform(X_test)

      final_predictions = final_model.predict(X_test_prepared)

      final_mse = mean_squared_error(y_test, final_predictions)

      final_rmse = np.sqrt(final_mse) # => evaluiert zu 47730.2

      Manchmal wird solch eine Punktschätzung des Verallgemeinerungsfehlers nicht ausreichen, um Sie davon zu überzeugen, das Modell zu übernehmen. Was, wenn es nur 0,1% besser als das aktuell genutzte Modell ist? Vielleicht wollen Sie verstehen, wie exakt diese Schätzung ist. Dazu können Sie mit scipy.stats.t.interval() ein 95-%-Konfidenzintervall für den Verallgemeinerungsfehler berechnen.

      >>> from scipy import stats

      >>> confidence = 0.95

      >>> squared_errors = (final_predictions - y_test) ** 2

      >>> np.sqrt(stats.t.interval(confidence, len(squared_errors) - 1,

      ... loc=squared_errors.mean(),

      ... scale=stats.sem(squared_errors)))

      ...

      array([45685.10470776, 49691.25001878])

      Wenn Sie eine Menge Hyperparameter optimiert haben, ist die Qualität der Vorhersage normalerweise etwas schlechter als die mit der Kreuzvalidierung bestimmte (weil Ihr System dann auf die Validierungsdaten optimiert ist und nicht ganz so gut auf unbekannten Daten abschneidet). In diesem Beispiel ist das nicht der Fall, aber wenn es passiert, müssen Sie der Versuchung widerstehen, Ihre Hyperparameter noch einmal zu ändern, um die Zahlen gut aussehen zu lassen. Die Verbesserungen werden vermutlich nicht gut auf neue Daten verallgemeinerbar sein.

      Es folgt die Phase vor der Inbetriebnahme. Sie müssen Ihre Lösung präsentieren (und hervorheben, was Sie herausgefunden haben, was funktioniert hat und was nicht, welche Annahmen getroffen wurden und wo die Grenzen Ihres Systems sind), dokumentieren und ansprechendes Präsentationsmaterial mit klaren Visualisierungen und eingängigen Aussagen (z.B. »das mittlere Einkommen ist der beste Prädiktor des Immobilienpreises«) anbieten. Im Beispiel mit den kalifornischen Immobilienpreisen ist die abschließende Genauigkeit des Systems nicht besser als die Preisschätzungen der Experten, die oft um etwa 20% danebenliegen, aber es kann trotzdem hilfreich sein, es einzusetzen, insbesondere wenn besagte Experten damit Zeit für interessantere und produktivere Aufgaben verschafft bekommen.

       Nimm das System in Betrieb, überwache und warte es

      Sie haben die Freigabe für die Inbetriebnahme! Sie müssen Ihre Lösung nun fit machen für die Produktivumgebung (zum Beispiel den Code ordentlich machen, Dokumentation und Tests schreiben und so weiter). Dann können Sie Ihr Modell in Ihre Produktivumgebung deployen. Eine Möglichkeit dafür besteht darin, das trainierte Scikit-Learn-Modell zu sichern (beispielsweise mit joblib) – einschließlich der vollständigen Vorverarbeitungs- und Vorhersagepipeline –, dann dieses trainierte Modell in Ihrer Produktivumgebung zu laden und es durch den Aufruf der Methode predict() zu verwenden. Vielleicht wird das Modell ja auf einer Website genutzt: Der Anwender gibt Daten über einen neuen Bezirk ein und klickt auf den Button Preis schätzen. Dadurch wird eine Anfrage mit den Daten an den Webserver geschickt, der diese an Ihre Webanwendung weiterleitet, und Ihr Code ruft dort einfach die Methode predict() des Modells auf (Sie werden das Modell nicht bei jedem Einsatz laden wollen, sondern einmalig, wenn der Server startet). Alternativ können Sie das Modell auch in einem eigenen Webservice verpacken, den Ihre Webanwendung über eine REST-API23 aufrufen kann (siehe Abbildung 2-17). Das erleichtert das Aktualisieren des Modells, ohne dass die Hauptanwendung unterbrochen werden muss. Auch wird das Skalieren so einfacher, da Sie so viele Webservices wie nötig starten und die Requests von Ihrer Webanwendung darauf per Load Balancing verteilen können. Zudem ist es so möglich, Ihre Webanwendung in einer beliebigen Programmiersprache zu entwickeln, statt auf Python angewiesen zu sein.

       Abbildung 2-17: Ein Modell, das als Webservice deployt und von einer Webanwendung genutzt wird

      Eine andere verbreitete Strategie besteht darin, Ihr Modell in die Cloud zu deployen – zum Beispiel auf die Google Cloud AI Platform (früher bekannt als Google Cloud ML Engine): Speichern Sie Ihr Modell einfach mithilfe von joblib, laden Sie es auf Google Cloud Storage (GCS), wechseln Sie zur Google Cloud AI Platform, erstellen Sie eine neue Modellversion und lassen Sie diese auf die GCS-Datei zeigen. Das ist alles! Sie erhalten so einen einfachen Webservice, der Ihnen Load Balancing und Skalieren abnimmt. Er erwartet JSON-Requests mit den Eingabedaten (zum Beispiel von einem Bezirk) und gibt JSON-Responses mit den Vorhersagen zurück. Sie können diesen Webservice dann auf Ihrer Website verwenden (oder welche Produktivumgebung Sie sonst so nutzen). Wie wir in Kapitel 19 sehen werden, unterscheidet sich das Deployen von TensorFlow-Modellen auf AI Platform nicht sonderlich vom Deployen von Scikit-Learn-Modellen.

      Aber mit dem Deployen ist die Geschichte noch nicht zu Ende. Sie müssen auch Code zur Überwachung schreiben, damit Sie die Leistung des laufenden Systems in regelmäßigen Abständen prüfen können und ein Alarm ausgelöst wird, wenn sie abfällt. Dies ist wichtig,


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