17 KiB
Erstellen einer Webanwendung zur Nutzung eines ML-Modells
In dieser Lektion werden Sie ein ML-Modell auf einem Datensatz trainieren, der wirklich außergewöhnlich ist: UFO-Sichtungen im letzten Jahrhundert, bezogen aus der Datenbank von NUFORC.
Sie werden lernen:
- Wie man ein trainiertes Modell 'pickelt'
- Wie man dieses Modell in einer Flask-App verwendet
Wir werden weiterhin Notebooks verwenden, um Daten zu bereinigen und unser Modell zu trainieren, aber Sie können den Prozess einen Schritt weiter gehen, indem Sie das Modell 'in der Wildnis' erkunden, sozusagen: in einer Webanwendung.
Um dies zu tun, müssen Sie eine Webanwendung mit Flask erstellen.
Vorlesungsquiz
Eine App erstellen
Es gibt mehrere Möglichkeiten, Webanwendungen zu erstellen, die maschinelles Lernen Modelle konsumieren. Ihre Webarchitektur kann die Art und Weise beeinflussen, wie Ihr Modell trainiert wird. Stellen Sie sich vor, Sie arbeiten in einem Unternehmen, in dem die Datenwissenschaftsgruppe ein Modell trainiert hat, das Sie in einer App verwenden sollen.
Überlegungen
Es gibt viele Fragen, die Sie stellen müssen:
- Ist es eine Web-App oder eine mobile App? Wenn Sie eine mobile App erstellen oder das Modell in einem IoT-Kontext verwenden müssen, könnten Sie TensorFlow Lite verwenden und das Modell in einer Android- oder iOS-App nutzen.
- Wo wird das Modell gehostet? In der Cloud oder lokal?
- Offline-Unterstützung. Muss die App offline funktionieren?
- Welche Technologie wurde verwendet, um das Modell zu trainieren? Die gewählte Technologie kann die Werkzeuge beeinflussen, die Sie verwenden müssen.
- Verwendung von TensorFlow. Wenn Sie ein Modell mit TensorFlow trainieren, bietet dieses Ökosystem die Möglichkeit, ein TensorFlow-Modell für die Verwendung in einer Web-App mit TensorFlow.js zu konvertieren.
- Verwendung von PyTorch. Wenn Sie ein Modell mit einer Bibliothek wie PyTorch erstellen, haben Sie die Möglichkeit, es im ONNX (Open Neural Network Exchange) Format für die Verwendung in JavaScript-Web-Apps zu exportieren, die das Onnx Runtime nutzen können. Diese Option wird in einer zukünftigen Lektion für ein mit Scikit-learn trainiertes Modell untersucht.
- Verwendung von Lobe.ai oder Azure Custom Vision. Wenn Sie ein ML SaaS (Software as a Service) System wie Lobe.ai oder Azure Custom Vision verwenden, um ein Modell zu trainieren, bietet diese Art von Software Möglichkeiten, das Modell für viele Plattformen zu exportieren, einschließlich der Erstellung einer maßgeschneiderten API, die von Ihrer Online-Anwendung in der Cloud abgefragt werden kann.
Sie haben auch die Möglichkeit, eine vollständige Flask-Webanwendung zu erstellen, die in der Lage wäre, das Modell selbst in einem Webbrowser zu trainieren. Dies kann auch mit TensorFlow.js in einem JavaScript-Kontext erfolgen.
Für unsere Zwecke, da wir mit Python-basierten Notebooks gearbeitet haben, lassen Sie uns die Schritte erkunden, die erforderlich sind, um ein trainiertes Modell aus einem solchen Notebook in ein von einer Python-basierten Web-App lesbares Format zu exportieren.
Werkzeug
Für diese Aufgabe benötigen Sie zwei Werkzeuge: Flask und Pickle, die beide in Python laufen.
✅ Was ist Flask? Flask wird von seinen Schöpfern als 'Micro-Framework' definiert und bietet die grundlegenden Funktionen von Web-Frameworks mit Python und einer Template-Engine zum Erstellen von Webseiten. Werfen Sie einen Blick auf dieses Lernmodul, um das Erstellen mit Flask zu üben.
✅ Was ist Pickle? Pickle 🥒 ist ein Python-Modul, das eine Python-Objektstruktur serialisiert und deserialisiert. Wenn Sie ein Modell 'pickeln', serialisieren oder flatten Sie seine Struktur zur Verwendung im Web. Seien Sie vorsichtig: Pickle ist nicht von Natur aus sicher, also seien Sie vorsichtig, wenn Sie aufgefordert werden, eine Datei 'un-pickeln'. Eine pickled Datei hat die Endung .pkl
.
Übung - Bereinigen Sie Ihre Daten
In dieser Lektion verwenden Sie Daten von 80.000 UFO-Sichtungen, die von NUFORC (Das Nationale UFO-Meldungszentrum) gesammelt wurden. Diese Daten enthalten einige interessante Beschreibungen von UFO-Sichtungen, zum Beispiel:
- Lange Beispieldarstellung. "Ein Mann erscheint aus einem Lichtstrahl, der auf ein Grasfeld in der Nacht scheint, und läuft auf den Parkplatz von Texas Instruments zu."
- Kurze Beispieldarstellung. "Die Lichter verfolgten uns."
Die ufos.csv Tabelle enthält Spalten über die city
, state
und country
, wo die Sichtung stattfand, das shape
des Objekts und dessen latitude
und longitude
.
In dem leeren Notebook, das in dieser Lektion enthalten ist:
-
Importieren Sie
pandas
,matplotlib
undnumpy
, wie Sie es in den vorherigen Lektionen getan haben, und importieren Sie die ufos-Tabelle. Sie können sich eine Beispiel-Datenmenge ansehen:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
Konvertieren Sie die UFO-Daten in ein kleines DataFrame mit neuen Titeln. Überprüfen Sie die eindeutigen Werte im Feld
Country
.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Jetzt können Sie die Menge der Daten, mit denen wir arbeiten müssen, reduzieren, indem Sie alle Nullwerte entfernen und nur Sichtungen zwischen 1-60 Sekunden importieren:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
Importieren Sie die
LabelEncoder
-Bibliothek von Scikit-learn, um die Textwerte für Länder in eine Zahl zu konvertieren:✅ LabelEncoder kodiert Daten alphabetisch
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
Ihre Daten sollten so aussehen:
Seconds Country Latitude Longitude 2 20.0 3 53.200000 -2.916667 3 20.0 4 28.978333 -96.645833 14 30.0 4 35.823889 -80.253611 23 60.0 4 45.582778 -122.352222 24 3.0 3 51.783333 -0.783333
Übung - Erstellen Sie Ihr Modell
Jetzt können Sie sich darauf vorbereiten, ein Modell zu trainieren, indem Sie die Daten in die Trainings- und Testgruppe aufteilen.
-
Wählen Sie die drei Merkmale aus, auf denen Sie trainieren möchten, als Ihren X-Vektor, und der y-Vektor wird
Country
. You want to be able to inputSeconds
,Latitude
andLongitude
sein und eine Länder-ID zurückgeben.from sklearn.model_selection import train_test_split Selected_features = ['Seconds','Latitude','Longitude'] X = ufos[Selected_features] y = ufos['Country'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
Trainieren Sie Ihr Modell mit logistischer Regression:
from sklearn.metrics import accuracy_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('Accuracy: ', accuracy_score(y_test, predictions))
Die Genauigkeit ist nicht schlecht (ungefähr 95%), was nicht überraschend ist, da Country
and Latitude/Longitude
correlate.
The model you created isn't very revolutionary as you should be able to infer a Country
from its Latitude
and Longitude
, aber es ist eine gute Übung, zu versuchen, aus Rohdaten zu trainieren, die Sie bereinigt, exportiert und dann dieses Modell in einer Web-App verwendet haben.
Übung - 'pickeln' Sie Ihr Modell
Jetzt ist es an der Zeit, Ihr Modell zu pickeln! Sie können dies in wenigen Codezeilen tun. Sobald es pickled ist, laden Sie Ihr pickled Modell und testen Sie es mit einem Beispieldatenarray, das Werte für Sekunden, Breite und Länge enthält,
import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))
model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))
Das Modell gibt '3' zurück, was der Ländercode für das Vereinigte Königreich ist. Wild! 👽
Übung - Erstellen Sie eine Flask-App
Jetzt können Sie eine Flask-App erstellen, um Ihr Modell aufzurufen und ähnliche Ergebnisse zurückzugeben, jedoch auf eine visuell ansprechendere Weise.
-
Beginnen Sie damit, einen Ordner namens web-app neben der notebook.ipynb-Datei zu erstellen, in der sich Ihre ufo-model.pkl-Datei befindet.
-
Erstellen Sie in diesem Ordner drei weitere Ordner: static, mit einem Ordner css darin, und templates. Sie sollten jetzt die folgenden Dateien und Verzeichnisse haben:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl
✅ Verweisen Sie auf den Lösungsordner, um eine Ansicht der fertigen App zu sehen.
-
Die erste Datei, die Sie im web-app-Ordner erstellen müssen, ist die requirements.txt-Datei. Wie package.json in einer JavaScript-App listet diese Datei die Abhängigkeiten auf, die von der App benötigt werden. Fügen Sie in requirements.txt die Zeilen hinzu:
scikit-learn pandas numpy flask
-
Führen Sie diese Datei jetzt aus, indem Sie in den web-app-Ordner navigieren:
cd web-app
-
Geben Sie in Ihrem Terminal
pip install
ein, um die in requirements.txt aufgelisteten Bibliotheken zu installieren:pip install -r requirements.txt
-
Jetzt sind Sie bereit, drei weitere Dateien zu erstellen, um die App abzuschließen:
- Erstellen Sie app.py im Stammverzeichnis.
- Erstellen Sie index.html im templates-Verzeichnis.
- Erstellen Sie styles.css im static/css-Verzeichnis.
-
Gestalten Sie die styles.css-Datei mit einigen Stilen:
body { width: 100%; height: 100%; font-family: 'Helvetica'; background: black; color: #fff; text-align: center; letter-spacing: 1.4px; font-size: 30px; } input { min-width: 150px; } .grid { width: 300px; border: 1px solid #2d2d2d; display: grid; justify-content: center; margin: 20px auto; } .box { color: #fff; background: #2d2d2d; padding: 12px; display: inline-block; }
-
Als Nächstes gestalten Sie die index.html-Datei:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>🛸 UFO Appearance Prediction! 👽</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body> <div class="grid"> <div class="box"> <p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p> <form action="{{ url_for('predict')}}" method="post"> <input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" /> <input type="text" name="latitude" placeholder="Latitude" required="required" /> <input type="text" name="longitude" placeholder="Longitude" required="required" /> <button type="submit" class="btn">Predict country where the UFO is seen</button> </form> <p>{{ prediction_text }}</p> </div> </div> </body> </html>
Werfen Sie einen Blick auf das Template in dieser Datei. Beachten Sie die 'Mustache'-Syntax um Variablen, die von der App bereitgestellt werden, wie den Vorhersagetext:
{{}}
. There's also a form that posts a prediction to the/predict
route.Finally, you're ready to build the python file that drives the consumption of the model and the display of predictions:
-
In
app.py
fügen Sie hinzu:import numpy as np from flask import Flask, request, render_template import pickle app = Flask(__name__) model = pickle.load(open("./ufo-model.pkl", "rb")) @app.route("/") def home(): return render_template("index.html") @app.route("/predict", methods=["POST"]) def predict(): int_features = [int(x) for x in request.form.values()] final_features = [np.array(int_features)] prediction = model.predict(final_features) output = prediction[0] countries = ["Australia", "Canada", "Germany", "UK", "US"] return render_template( "index.html", prediction_text="Likely country: {}".format(countries[output]) ) if __name__ == "__main__": app.run(debug=True)
💡 Tipp: Wenn Sie
debug=True
while running the web app using Flask, any changes you make to your application will be reflected immediately without the need to restart the server. Beware! Don't enable this mode in a production app.
If you run python app.py
or python3 app.py
- your web server starts up, locally, and you can fill out a short form to get an answer to your burning question about where UFOs have been sighted!
Before doing that, take a look at the parts of app.py
:
- First, dependencies are loaded and the app starts.
- Then, the model is imported.
- Then, index.html is rendered on the home route.
On the /predict
route, several things happen when the form is posted:
- The form variables are gathered and converted to a numpy array. They are then sent to the model and a prediction is returned.
- The Countries that we want displayed are re-rendered as readable text from their predicted country code, and that value is sent back to index.html to be rendered in the template.
Using a model this way, with Flask and a pickled model, is relatively straightforward. The hardest thing is to understand what shape the data is that must be sent to the model to get a prediction. That all depends on how the model was trained. This one has three data points to be input in order to get a prediction.
In a professional setting, you can see how good communication is necessary between the folks who train the model and those who consume it in a web or mobile app. In our case, it's only one person, you!
🚀 Challenge
Instead of working in a notebook and importing the model to the Flask app, you could train the model right within the Flask app! Try converting your Python code in the notebook, perhaps after your data is cleaned, to train the model from within the app on a route called train
hinzufügen. Was sind die Vor- und Nachteile, diesen Ansatz zu verfolgen?
Nachlesungsquiz
Überprüfung & Selbststudium
Es gibt viele Möglichkeiten, eine Web-App zu erstellen, um ML-Modelle zu konsumieren. Machen Sie eine Liste der Möglichkeiten, wie Sie JavaScript oder Python verwenden könnten, um eine Web-App zu erstellen, die maschinelles Lernen nutzt. Berücksichtigen Sie die Architektur: Sollte das Modell in der App bleiben oder in der Cloud leben? Wenn Letzteres, wie würden Sie darauf zugreifen? Zeichnen Sie ein architektonisches Modell für eine angewandte ML-Weblösung.
Aufgabe
Versuchen Sie ein anderes Modell
Haftungsausschluss:
Dieses Dokument wurde mit maschinellen KI-Übersetzungsdiensten übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als die maßgebliche Quelle betrachtet werden. Für wichtige Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.