|
2 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
Δημιουργία μιας Web Εφαρμογής για χρήση ενός ML Μοντέλου
Σε αυτό το μάθημα, θα εκπαιδεύσετε ένα ML μοντέλο σε ένα σύνολο δεδομένων που είναι πραγματικά εξωγήινο: θεάσεις UFO τον τελευταίο αιώνα, προερχόμενο από τη βάση δεδομένων του NUFORC.
Θα μάθετε:
- Πώς να 'pickle' ένα εκπαιδευμένο μοντέλο
- Πώς να χρησιμοποιήσετε αυτό το μοντέλο σε μια εφαρμογή Flask
Θα συνεχίσουμε να χρησιμοποιούμε notebooks για να καθαρίσουμε δεδομένα και να εκπαιδεύσουμε το μοντέλο μας, αλλά μπορείτε να κάνετε ένα βήμα παραπέρα εξερευνώντας τη χρήση ενός μοντέλου "στην πράξη", δηλαδή σε μια web εφαρμογή.
Για να το κάνετε αυτό, πρέπει να δημιουργήσετε μια web εφαρμογή χρησιμοποιώντας Flask.
Προ-μάθημα κουίζ
Δημιουργία εφαρμογής
Υπάρχουν διάφοροι τρόποι για να δημιουργήσετε web εφαρμογές που καταναλώνουν μοντέλα μηχανικής μάθησης. Η αρχιτεκτονική της εφαρμογής σας μπορεί να επηρεάσει τον τρόπο με τον οποίο εκπαιδεύεται το μοντέλο σας. Φανταστείτε ότι εργάζεστε σε μια επιχείρηση όπου η ομάδα επιστήμης δεδομένων έχει εκπαιδεύσει ένα μοντέλο που θέλουν να χρησιμοποιήσετε σε μια εφαρμογή.
Σημεία προς εξέταση
Υπάρχουν πολλές ερωτήσεις που πρέπει να κάνετε:
- Είναι web εφαρμογή ή mobile εφαρμογή; Εάν δημιουργείτε μια mobile εφαρμογή ή χρειάζεστε το μοντέλο σε ένα IoT περιβάλλον, μπορείτε να χρησιμοποιήσετε TensorFlow Lite και να χρησιμοποιήσετε το μοντέλο σε μια εφαρμογή Android ή iOS.
- Πού θα βρίσκεται το μοντέλο; Στο cloud ή τοπικά;
- Υποστήριξη εκτός σύνδεσης. Πρέπει η εφαρμογή να λειτουργεί εκτός σύνδεσης;
- Ποια τεχνολογία χρησιμοποιήθηκε για την εκπαίδευση του μοντέλου; Η επιλεγμένη τεχνολογία μπορεί να επηρεάσει τα εργαλεία που πρέπει να χρησιμοποιήσετε.
- Χρήση TensorFlow. Εάν εκπαιδεύετε ένα μοντέλο χρησιμοποιώντας TensorFlow, για παράδειγμα, αυτό το οικοσύστημα παρέχει τη δυνατότητα να μετατρέψετε ένα μοντέλο TensorFlow για χρήση σε μια web εφαρμογή χρησιμοποιώντας TensorFlow.js.
- Χρήση PyTorch. Εάν δημιουργείτε ένα μοντέλο χρησιμοποιώντας μια βιβλιοθήκη όπως PyTorch, έχετε τη δυνατότητα να το εξάγετε σε μορφή ONNX (Open Neural Network Exchange) για χρήση σε JavaScript web εφαρμογές που μπορούν να χρησιμοποιήσουν το Onnx Runtime. Αυτή η επιλογή θα εξερευνηθεί σε ένα μελλοντικό μάθημα για ένα μοντέλο εκπαιδευμένο με Scikit-learn.
- Χρήση Lobe.ai ή Azure Custom Vision. Εάν χρησιμοποιείτε ένα ML SaaS (Software as a Service) σύστημα όπως Lobe.ai ή Azure Custom Vision για να εκπαιδεύσετε ένα μοντέλο, αυτός ο τύπος λογισμικού παρέχει τρόπους εξαγωγής του μοντέλου για πολλές πλατφόρμες, συμπεριλαμβανομένης της δημιουργίας ενός προσαρμοσμένου API που μπορεί να ερωτηθεί στο cloud από την online εφαρμογή σας.
Έχετε επίσης τη δυνατότητα να δημιουργήσετε μια πλήρη web εφαρμογή Flask που θα μπορεί να εκπαιδεύσει το μοντέλο μέσα από έναν web browser. Αυτό μπορεί επίσης να γίνει χρησιμοποιώντας TensorFlow.js σε ένα JavaScript περιβάλλον.
Για τους σκοπούς μας, δεδομένου ότι έχουμε εργαστεί με notebooks βασισμένα σε Python, ας εξερευνήσουμε τα βήματα που πρέπει να κάνετε για να εξάγετε ένα εκπαιδευμένο μοντέλο από ένα τέτοιο notebook σε μια μορφή που να μπορεί να διαβαστεί από μια web εφαρμογή χτισμένη σε Python.
Εργαλείο
Για αυτήν την εργασία, χρειάζεστε δύο εργαλεία: Flask και Pickle, και τα δύο λειτουργούν με Python.
✅ Τι είναι το Flask; Ορισμένο ως 'micro-framework' από τους δημιουργούς του, το Flask παρέχει τις βασικές λειτουργίες των web frameworks χρησιμοποιώντας Python και μια μηχανή δημιουργίας προτύπων για τη δημιουργία ιστοσελίδων. Ρίξτε μια ματιά σε αυτό το Learn module για να εξασκηθείτε στη δημιουργία με Flask.
✅ Τι είναι το Pickle; Το Pickle 🥒 είναι ένα Python module που σειριοποιεί και αποσειριοποιεί τη δομή ενός αντικειμένου Python. Όταν 'pickle' ένα μοντέλο, σειριοποιείτε ή "ισοπεδώνετε" τη δομή του για χρήση στο web. Προσοχή: το pickle δεν είναι εγγενώς ασφαλές, οπότε να είστε προσεκτικοί εάν σας ζητηθεί να 'un-pickle' ένα αρχείο. Ένα pickled αρχείο έχει την κατάληξη .pkl
.
Άσκηση - καθαρίστε τα δεδομένα σας
Σε αυτό το μάθημα θα χρησιμοποιήσετε δεδομένα από 80,000 θεάσεις UFO, που έχουν συλλεχθεί από το NUFORC (The National UFO Reporting Center). Αυτά τα δεδομένα περιλαμβάνουν ενδιαφέρουσες περιγραφές θεάσεων UFO, για παράδειγμα:
- Μακροσκελής περιγραφή. "Ένας άντρας εμφανίζεται από μια ακτίνα φωτός που λάμπει σε ένα χορταριασμένο πεδίο τη νύχτα και τρέχει προς το πάρκινγκ της Texas Instruments".
- Σύντομη περιγραφή. "τα φώτα μας κυνηγούσαν".
Το ufos.csv υπολογιστικό φύλλο περιλαμβάνει στήλες σχετικά με την πόλη
, την πολιτεία
και τη χώρα
όπου συνέβη η θέαση, το σχήμα
του αντικειμένου και τις γεωγραφικές συντεταγμένες
του.
Στο κενό notebook που περιλαμβάνεται σε αυτό το μάθημα:
-
Εισάγετε τις βιβλιοθήκες
pandas
,matplotlib
καιnumpy
όπως κάνατε στα προηγούμενα μαθήματα και εισάγετε το υπολογιστικό φύλλο ufos. Μπορείτε να δείτε ένα δείγμα δεδομένων:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
Μετατρέψτε τα δεδομένα ufos σε ένα μικρό dataframe με νέους τίτλους. Ελέγξτε τις μοναδικές τιμές στο πεδίο
Country
.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Τώρα, μπορείτε να μειώσετε την ποσότητα δεδομένων που πρέπει να επεξεργαστείτε, αφαιρώντας οποιεσδήποτε κενές τιμές και εισάγοντας μόνο θεάσεις διάρκειας 1-60 δευτερολέπτων:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
Εισάγετε τη βιβλιοθήκη
LabelEncoder
του Scikit-learn για να μετατρέψετε τις κειμενικές τιμές των χωρών σε αριθμούς:✅ Το LabelEncoder κωδικοποιεί δεδομένα αλφαβητικά
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
Τα δεδομένα σας θα πρέπει να μοιάζουν με αυτό:
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
Άσκηση - δημιουργήστε το μοντέλο σας
Τώρα μπορείτε να προετοιμαστείτε για την εκπαίδευση ενός μοντέλου διαιρώντας τα δεδομένα σε ομάδες εκπαίδευσης και δοκιμής.
-
Επιλέξτε τα τρία χαρακτηριστικά που θέλετε να εκπαιδεύσετε ως X vector, και το y vector θα είναι το
Country
. Θέλετε να μπορείτε να εισάγετεSeconds
,Latitude
καιLongitude
και να λαμβάνετε έναν κωδικό χώρας ως αποτέλεσμα.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)
-
Εκπαιδεύστε το μοντέλο σας χρησιμοποιώντας logistic 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))
Η ακρίβεια δεν είναι κακή (περίπου 95%), όπως ήταν αναμενόμενο, καθώς το Country
και οι Latitude/Longitude
συσχετίζονται.
Το μοντέλο που δημιουργήσατε δεν είναι πολύ επαναστατικό, καθώς θα πρέπει να μπορείτε να συμπεράνετε μια Country
από τις Latitude
και Longitude
, αλλά είναι μια καλή άσκηση για να προσπαθήσετε να εκπαιδεύσετε από ακατέργαστα δεδομένα που καθαρίσατε, εξαγάγατε και στη συνέχεια χρησιμοποιήσατε αυτό το μοντέλο σε μια web εφαρμογή.
Άσκηση - 'pickle' το μοντέλο σας
Τώρα, είναι ώρα να pickle το μοντέλο σας! Μπορείτε να το κάνετε αυτό με λίγες γραμμές κώδικα. Μόλις γίνει pickled, φορτώστε το pickled μοντέλο και δοκιμάστε το με ένα δείγμα δεδομένων που περιέχει τιμές για seconds, latitude και longitude.
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]]))
Το μοντέλο επιστρέφει '3', που είναι ο κωδικός χώρας για το Ηνωμένο Βασίλειο. Απίστευτο! 👽
Άσκηση - δημιουργήστε μια εφαρμογή Flask
Τώρα μπορείτε να δημιουργήσετε μια εφαρμογή Flask για να καλείτε το μοντέλο σας και να επιστρέφετε παρόμοια αποτελέσματα, αλλά με έναν πιο οπτικά ευχάριστο τρόπο.
-
Ξεκινήστε δημιουργώντας έναν φάκελο που ονομάζεται web-app δίπλα στο αρχείο notebook.ipynb όπου βρίσκεται το αρχείο ufo-model.pkl.
-
Στον φάκελο αυτό δημιουργήστε τρεις ακόμη φακέλους: static, με έναν φάκελο css μέσα του, και templates. Θα πρέπει τώρα να έχετε τα εξής αρχεία και καταλόγους:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl
✅ Ανατρέξτε στον φάκελο λύσης για μια εικόνα της τελικής εφαρμογής
-
Το πρώτο αρχείο που θα δημιουργήσετε στον φάκελο web-app είναι το αρχείο requirements.txt. Όπως το package.json σε μια εφαρμογή JavaScript, αυτό το αρχείο παραθέτει τις εξαρτήσεις που απαιτούνται από την εφαρμογή. Στο requirements.txt προσθέστε τις γραμμές:
scikit-learn pandas numpy flask
-
Τώρα, εκτελέστε αυτό το αρχείο πηγαίνοντας στον φάκελο web-app:
cd web-app
-
Στο τερματικό σας πληκτρολογήστε
pip install
, για να εγκαταστήσετε τις βιβλιοθήκες που αναφέρονται στο requirements.txt:pip install -r requirements.txt
-
Τώρα, είστε έτοιμοι να δημιουργήσετε τρία ακόμη αρχεία για να ολοκληρώσετε την εφαρμογή:
- Δημιουργήστε το app.py στη ρίζα.
- Δημιουργήστε το index.html στον κατάλογο templates.
- Δημιουργήστε το styles.css στον κατάλογο static/css.
-
Δημιουργήστε το αρχείο styles.css με μερικά στυλ:
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; }
-
Στη συνέχεια, δημιουργήστε το αρχείο index.html:
<!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>
Ρίξτε μια ματιά στη δημιουργία προτύπων σε αυτό το αρχείο. Παρατηρήστε τη σύνταξη 'mustache' γύρω από τις μεταβλητές που θα παρέχονται από την εφαρμογή, όπως το κείμενο πρόβλεψης:
{{}}
. Υπάρχει επίσης μια φόρμα που δημοσιεύει μια πρόβλεψη στη διαδρομή/predict
.Τέλος, είστε έτοιμοι να δημιουργήσετε το αρχείο Python που οδηγεί την κατανάλωση του μοντέλου και την εμφάνιση των προβλέψεων:
-
Στο
app.py
προσθέστε: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)
💡 Συμβουλή: όταν προσθέτετε
debug=True
ενώ εκτελείτε την web εφαρμογή χρησιμοποιώντας Flask, οποιεσδήποτε αλλαγές κάνετε στην εφαρμογή σας θα αντικατοπτρίζονται αμέσως χωρίς την ανάγκη επανεκκίνησης του server. Προσοχή! Μην ενεργοποιείτε αυτήν τη λειτουργία σε μια εφαρμογή παραγωγής.
Εάν εκτελέσετε python app.py
ή python3 app.py
- ο web server σας ξεκινά τοπικά και μπορείτε να συμπληρώσετε μια σύντομη φόρμα για να λάβετε μια απάντηση στην καυτή ερώτησή σας σχετικά με το πού έχουν παρατηρηθεί UFO!
Πριν το κάνετε αυτό, ρίξτε μια ματιά στα μέρη του app.py
:
- Πρώτα, φορτώνονται οι εξαρτήσεις και ξεκινά η εφαρμογή.
- Στη συνέχεια, εισάγεται το μοντέλο.
- Στη συνέχεια, το index.html αποδίδεται στη διαδρομή αρχικής σελίδας.
Στη διαδρομή /predict
, συμβαίνουν διάφορα πράγματα όταν δημοσιεύεται η φόρμα:
- Οι μεταβλητές της φόρμας συλλέγονται και μετατρέπονται σε numpy array. Στη συνέχεια αποστέλλονται στο μοντέλο και επιστρέφεται μια πρόβλεψη.
- Οι χώρες που θέλουμε να εμφανίζονται επαναδημιουργούνται ως αναγνώσιμο κείμενο από τον προβλεπόμενο κωδικό χώρας, και αυτή η τιμή επιστρέφεται στο index.html για να αποδοθεί στο πρότυπο.
Η χρήση ενός μοντέλου με αυτόν τον τρόπο, με Flask και ένα pickled μοντέλο, είναι σχετικά απλή. Το πιο δύσκολο είναι να κατανοήσετε ποια μορφή πρέπει να έχουν τα δεδομένα που πρέπει να σταλούν στο μοντέλο για να λάβετε μια πρόβλεψη. Αυτό εξαρτάται από το πώς εκπαιδεύτηκε το μοντέλο. Αυτό το μοντέλο έχει τρία σημεία δεδομένων που πρέπει να εισαχθούν για να λάβετε μια πρόβλεψη.
Σε ένα επαγγελματικό περιβάλλον, μπορείτε να δείτε πόσο σημαντική είναι η καλή επικοινωνία μεταξύ των ατόμων που εκπαιδεύουν το μοντέλο και αυτών που το καταναλώνουν σε μια web ή mobile εφαρμογή. Στην περίπτωσή μας, είναι μόνο ένα άτομο, εσείς!
🚀 Πρόκληση
Αντί να εργάζεστε σε ένα notebook και να εισάγετε το μοντέλο στην εφαρμογή Flask, θα μπορούσατε να εκπαιδεύσετε το μοντέλο απευθείας μέσα στην εφαρμογή Flask! Δοκιμάστε να μετατρέψετε τον κώδικα Python στο notebook, ίσως αφού καθαρίσετε τα δεδομένα σας, για να εκπαιδεύσετε το μοντέλο μέσα στην εφαρμογή σε μια διαδρομή που ονομάζεται train
. Ποια είναι τα πλεονεκτήματα και τα μειονεκτήματα αυτής της μεθόδου;
Μετά το μάθημα κουίζ
Ανασκόπηση & Αυτομελέτη
Υπάρχουν πολλοί τρόποι για να δημιουργήσετε μια web εφαρμογή που καταναλώνει ML μοντέλα. Κάντε μια λίστα με τους τρόπους που θα μπορούσατε να χρησιμοποιήσετε JavaScript ή Python για να δημιουργήσετε μια web εφαρμογή που αξιοποιεί τη μηχανική μάθηση. Σκεφτείτε την αρχιτεκτονική: πρέπει το μοντέλο να παραμείνει στην εφαρμογή ή να ζει στο cloud; Εάν ισχύει το δεύτερο, πώς θα το προσπελάσετε; Σχεδιάστε ένα αρχιτεκτονικό μοντέλο για μια εφαρμοσμένη λύση ML web.
Εργασία
Δοκιμάστε ένα διαφορετικό μοντέλο
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.