# Δημιουργία μιας Web Εφαρμογής για χρήση ενός ML Μοντέλου Σε αυτό το μάθημα, θα εκπαιδεύσετε ένα ML μοντέλο σε ένα σύνολο δεδομένων που είναι πραγματικά εξωγήινο: _θεάσεις UFO τον τελευταίο αιώνα_, προερχόμενο από τη βάση δεδομένων του NUFORC. Θα μάθετε: - Πώς να 'pickle' ένα εκπαιδευμένο μοντέλο - Πώς να χρησιμοποιήσετε αυτό το μοντέλο σε μια εφαρμογή Flask Θα συνεχίσουμε να χρησιμοποιούμε notebooks για να καθαρίσουμε δεδομένα και να εκπαιδεύσουμε το μοντέλο μας, αλλά μπορείτε να κάνετε ένα βήμα παραπέρα εξερευνώντας τη χρήση ενός μοντέλου "στην πράξη", δηλαδή σε μια web εφαρμογή. Για να το κάνετε αυτό, πρέπει να δημιουργήσετε μια web εφαρμογή χρησιμοποιώντας Flask. ## [Προ-μάθημα κουίζ](https://ff-quizzes.netlify.app/en/ml/) ## Δημιουργία εφαρμογής Υπάρχουν διάφοροι τρόποι για να δημιουργήσετε web εφαρμογές που καταναλώνουν μοντέλα μηχανικής μάθησης. Η αρχιτεκτονική της εφαρμογής σας μπορεί να επηρεάσει τον τρόπο με τον οποίο εκπαιδεύεται το μοντέλο σας. Φανταστείτε ότι εργάζεστε σε μια επιχείρηση όπου η ομάδα επιστήμης δεδομένων έχει εκπαιδεύσει ένα μοντέλο που θέλουν να χρησιμοποιήσετε σε μια εφαρμογή. ### Σημεία προς εξέταση Υπάρχουν πολλές ερωτήσεις που πρέπει να κάνετε: - **Είναι web εφαρμογή ή mobile εφαρμογή;** Εάν δημιουργείτε μια mobile εφαρμογή ή χρειάζεστε το μοντέλο σε ένα IoT περιβάλλον, μπορείτε να χρησιμοποιήσετε [TensorFlow Lite](https://www.tensorflow.org/lite/) και να χρησιμοποιήσετε το μοντέλο σε μια εφαρμογή Android ή iOS. - **Πού θα βρίσκεται το μοντέλο;** Στο cloud ή τοπικά; - **Υποστήριξη εκτός σύνδεσης.** Πρέπει η εφαρμογή να λειτουργεί εκτός σύνδεσης; - **Ποια τεχνολογία χρησιμοποιήθηκε για την εκπαίδευση του μοντέλου;** Η επιλεγμένη τεχνολογία μπορεί να επηρεάσει τα εργαλεία που πρέπει να χρησιμοποιήσετε. - **Χρήση TensorFlow.** Εάν εκπαιδεύετε ένα μοντέλο χρησιμοποιώντας TensorFlow, για παράδειγμα, αυτό το οικοσύστημα παρέχει τη δυνατότητα να μετατρέψετε ένα μοντέλο TensorFlow για χρήση σε μια web εφαρμογή χρησιμοποιώντας [TensorFlow.js](https://www.tensorflow.org/js/). - **Χρήση PyTorch.** Εάν δημιουργείτε ένα μοντέλο χρησιμοποιώντας μια βιβλιοθήκη όπως [PyTorch](https://pytorch.org/), έχετε τη δυνατότητα να το εξάγετε σε μορφή [ONNX](https://onnx.ai/) (Open Neural Network Exchange) για χρήση σε JavaScript web εφαρμογές που μπορούν να χρησιμοποιήσουν το [Onnx Runtime](https://www.onnxruntime.ai/). Αυτή η επιλογή θα εξερευνηθεί σε ένα μελλοντικό μάθημα για ένα μοντέλο εκπαιδευμένο με Scikit-learn. - **Χρήση Lobe.ai ή Azure Custom Vision.** Εάν χρησιμοποιείτε ένα ML SaaS (Software as a Service) σύστημα όπως [Lobe.ai](https://lobe.ai/) ή [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) για να εκπαιδεύσετε ένα μοντέλο, αυτός ο τύπος λογισμικού παρέχει τρόπους εξαγωγής του μοντέλου για πολλές πλατφόρμες, συμπεριλαμβανομένης της δημιουργίας ενός προσαρμοσμένου API που μπορεί να ερωτηθεί στο cloud από την online εφαρμογή σας. Έχετε επίσης τη δυνατότητα να δημιουργήσετε μια πλήρη web εφαρμογή Flask που θα μπορεί να εκπαιδεύσει το μοντέλο μέσα από έναν web browser. Αυτό μπορεί επίσης να γίνει χρησιμοποιώντας TensorFlow.js σε ένα JavaScript περιβάλλον. Για τους σκοπούς μας, δεδομένου ότι έχουμε εργαστεί με notebooks βασισμένα σε Python, ας εξερευνήσουμε τα βήματα που πρέπει να κάνετε για να εξάγετε ένα εκπαιδευμένο μοντέλο από ένα τέτοιο notebook σε μια μορφή που να μπορεί να διαβαστεί από μια web εφαρμογή χτισμένη σε Python. ## Εργαλείο Για αυτήν την εργασία, χρειάζεστε δύο εργαλεία: Flask και Pickle, και τα δύο λειτουργούν με Python. ✅ Τι είναι το [Flask](https://palletsprojects.com/p/flask/); Ορισμένο ως 'micro-framework' από τους δημιουργούς του, το Flask παρέχει τις βασικές λειτουργίες των web frameworks χρησιμοποιώντας Python και μια μηχανή δημιουργίας προτύπων για τη δημιουργία ιστοσελίδων. Ρίξτε μια ματιά σε [αυτό το Learn module](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) για να εξασκηθείτε στη δημιουργία με Flask. ✅ Τι είναι το [Pickle](https://docs.python.org/3/library/pickle.html); Το Pickle 🥒 είναι ένα Python module που σειριοποιεί και αποσειριοποιεί τη δομή ενός αντικειμένου Python. Όταν 'pickle' ένα μοντέλο, σειριοποιείτε ή "ισοπεδώνετε" τη δομή του για χρήση στο web. Προσοχή: το pickle δεν είναι εγγενώς ασφαλές, οπότε να είστε προσεκτικοί εάν σας ζητηθεί να 'un-pickle' ένα αρχείο. Ένα pickled αρχείο έχει την κατάληξη `.pkl`. ## Άσκηση - καθαρίστε τα δεδομένα σας Σε αυτό το μάθημα θα χρησιμοποιήσετε δεδομένα από 80,000 θεάσεις UFO, που έχουν συλλεχθεί από το [NUFORC](https://nuforc.org) (The National UFO Reporting Center). Αυτά τα δεδομένα περιλαμβάνουν ενδιαφέρουσες περιγραφές θεάσεων UFO, για παράδειγμα: - **Μακροσκελής περιγραφή.** "Ένας άντρας εμφανίζεται από μια ακτίνα φωτός που λάμπει σε ένα χορταριασμένο πεδίο τη νύχτα και τρέχει προς το πάρκινγκ της Texas Instruments". - **Σύντομη περιγραφή.** "τα φώτα μας κυνηγούσαν". Το [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) υπολογιστικό φύλλο περιλαμβάνει στήλες σχετικά με την `πόλη`, την `πολιτεία` και τη `χώρα` όπου συνέβη η θέαση, το `σχήμα` του αντικειμένου και τις `γεωγραφικές συντεταγμένες` του. Στο κενό [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) που περιλαμβάνεται σε αυτό το μάθημα: 1. Εισάγετε τις βιβλιοθήκες `pandas`, `matplotlib` και `numpy` όπως κάνατε στα προηγούμενα μαθήματα και εισάγετε το υπολογιστικό φύλλο ufos. Μπορείτε να δείτε ένα δείγμα δεδομένων: ```python import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` 1. Μετατρέψτε τα δεδομένα ufos σε ένα μικρό dataframe με νέους τίτλους. Ελέγξτε τις μοναδικές τιμές στο πεδίο `Country`. ```python ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique() ``` 1. Τώρα, μπορείτε να μειώσετε την ποσότητα δεδομένων που πρέπει να επεξεργαστείτε, αφαιρώντας οποιεσδήποτε κενές τιμές και εισάγοντας μόνο θεάσεις διάρκειας 1-60 δευτερολέπτων: ```python ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info() ``` 1. Εισάγετε τη βιβλιοθήκη `LabelEncoder` του Scikit-learn για να μετατρέψετε τις κειμενικές τιμές των χωρών σε αριθμούς: ✅ Το LabelEncoder κωδικοποιεί δεδομένα αλφαβητικά ```python from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head() ``` Τα δεδομένα σας θα πρέπει να μοιάζουν με αυτό: ```output 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 ``` ## Άσκηση - δημιουργήστε το μοντέλο σας Τώρα μπορείτε να προετοιμαστείτε για την εκπαίδευση ενός μοντέλου διαιρώντας τα δεδομένα σε ομάδες εκπαίδευσης και δοκιμής. 1. Επιλέξτε τα τρία χαρακτηριστικά που θέλετε να εκπαιδεύσετε ως X vector, και το y vector θα είναι το `Country`. Θέλετε να μπορείτε να εισάγετε `Seconds`, `Latitude` και `Longitude` και να λαμβάνετε έναν κωδικό χώρας ως αποτέλεσμα. ```python 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) ``` 1. Εκπαιδεύστε το μοντέλο σας χρησιμοποιώντας logistic regression: ```python 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. ```python 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 για να καλείτε το μοντέλο σας και να επιστρέφετε παρόμοια αποτελέσματα, αλλά με έναν πιο οπτικά ευχάριστο τρόπο. 1. Ξεκινήστε δημιουργώντας έναν φάκελο που ονομάζεται **web-app** δίπλα στο αρχείο _notebook.ipynb_ όπου βρίσκεται το αρχείο _ufo-model.pkl_. 1. Στον φάκελο αυτό δημιουργήστε τρεις ακόμη φακέλους: **static**, με έναν φάκελο **css** μέσα του, και **templates**. Θα πρέπει τώρα να έχετε τα εξής αρχεία και καταλόγους: ```output web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl ``` ✅ Ανατρέξτε στον φάκελο λύσης για μια εικόνα της τελικής εφαρμογής 1. Το πρώτο αρχείο που θα δημιουργήσετε στον φάκελο _web-app_ είναι το αρχείο **requirements.txt**. Όπως το _package.json_ σε μια εφαρμογή JavaScript, αυτό το αρχείο παραθέτει τις εξαρτήσεις που απαιτούνται από την εφαρμογή. Στο **requirements.txt** προσθέστε τις γραμμές: ```text scikit-learn pandas numpy flask ``` 1. Τώρα, εκτελέστε αυτό το αρχείο πηγαίνοντας στον φάκελο _web-app_: ```bash cd web-app ``` 1. Στο τερματικό σας πληκτρολογήστε `pip install`, για να εγκαταστήσετε τις βιβλιοθήκες που αναφέρονται στο _requirements.txt_: ```bash pip install -r requirements.txt ``` 1. Τώρα, είστε έτοιμοι να δημιουργήσετε τρία ακόμη αρχεία για να ολοκληρώσετε την εφαρμογή: 1. Δημιουργήστε το **app.py** στη ρίζα. 2. Δημιουργήστε το **index.html** στον κατάλογο _templates_. 3. Δημιουργήστε το **styles.css** στον κατάλογο _static/css_. 1. Δημιουργήστε το αρχείο _styles.css_ με μερικά στυλ: ```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; } ``` 1. Στη συνέχεια, δημιουργήστε το αρχείο _index.html_: ```html 🛸 UFO Appearance Prediction! 👽

According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

{{ prediction_text }}

``` Ρίξτε μια ματιά στη δημιουργία προτύπων σε αυτό το αρχείο. Παρατηρήστε τη σύνταξη 'mustache' γύρω από τις μεταβλητές που θα παρέχονται από την εφαρμογή, όπως το κείμενο πρόβλεψης: `{{}}`. Υπάρχει επίσης μια φόρμα που δημοσιεύει μια πρόβλεψη στη διαδρομή `/predict`. Τέλος, είστε έτοιμοι να δημιουργήσετε το αρχείο Python που οδηγεί την κατανάλωση του μοντέλου και την εμφάνιση των προβλέψεων: 1. Στο `app.py` προσθέστε: ```python 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`](https://www.askpython.com/python-modules/flask/flask-debug-mode) ενώ εκτελείτε την web εφαρμογή χρησιμοποιώντας Flask, οποιεσδήποτε αλλαγές κάνετε στην εφαρμογή σας θα αντικατοπτρίζονται αμέσως χωρίς την ανάγκη επανεκκίνησης του server. Προσοχή! Μην ενεργοποιείτε αυτήν τη λειτουργία σε μια εφαρμογή παραγωγής. Εάν εκτελέσετε `python app.py` ή `python3 app.py` - ο web server σας ξεκινά τοπικά και μπορείτε να συμπληρώσετε μια σύντομη φόρμα για να λάβετε μια απάντηση στην καυτή ερώτησή σας σχετικά με το πού έχουν παρατηρηθεί UFO! Πριν το κάνετε αυτό, ρίξτε μια ματιά στα μέρη του `app.py`: 1. Πρώτα, φορτώνονται οι εξαρτήσεις και ξεκινά η εφαρμογή. 1. Στη συνέχεια, εισάγεται το μοντέλο. 1. Στη συνέχεια, το index.html αποδίδεται στη διαδρομή αρχικής σελίδας. Στη διαδρομή `/predict`, συμβαίνουν διάφορα πράγματα όταν δημοσιεύεται η φόρμα: 1. Οι μεταβλητές της φόρμας συλλέγονται και μετατρέπονται σε numpy array. Στη συνέχεια αποστέλλονται στο μοντέλο και επιστρέφεται μια πρόβλεψη. 2. Οι χώρες που θέλουμε να εμφανίζονται επαναδημιουργούνται ως αναγνώσιμο κείμενο από τον προβλεπόμενο κωδικό χώρας, και αυτή η τιμή επιστρέφεται στο index.html για να αποδοθεί στο πρότυπο. Η χρήση ενός μοντέλου με αυτόν τον τρόπο, με Flask και ένα pickled μοντέλο, είναι σχετικά απλή. Το πιο δύσκολο είναι να κατανοήσετε ποια μορφή πρέπει να έχουν τα δεδομένα που πρέπει να σταλούν στο μοντέλο για να λάβετε μια πρόβλεψη. Αυτό εξαρτάται από το πώς εκπαιδεύτηκε το μοντέλο. Αυτό το μοντέλο έχει τρία σημεία δεδομένων που πρέπει να εισαχθούν για να λάβετε μια πρόβλεψη. Σε ένα επαγγελματικό περιβάλλον, μπορείτε να δείτε πόσο σημαντική είναι η καλή επικοινωνία μεταξύ των ατόμων που εκπαιδεύουν το μοντέλο και αυτών που το καταναλώνουν σε μια web ή mobile εφαρμογή. Στην περίπτωσή μας, είναι μόνο ένα άτομο, εσείς! --- ## 🚀 Πρόκληση Αντί να εργάζεστε σε ένα notebook και να εισάγετε το μοντέλο στην εφαρμογή Flask, θα μπορούσατε να εκπαιδεύσετε το μοντέλο απευθείας μέσα στην εφαρμογή Flask! Δοκιμάστε να μετατρέψετε τον κώδικα Python στο notebook, ίσως αφού καθαρίσετε τα δεδομένα σας, για να εκπαιδεύσετε το μοντέλο μέσα στην εφαρμογή σε μια διαδρομή που ονομάζεται `train`. Ποια είναι τα πλεονεκτήματα και τα μειονεκτήματα αυτής της μεθόδου; ## [Μετά το μάθημα κουίζ](https://ff-quizzes.netlify.app/en/ml/) ## Ανασκόπηση & Αυτομελέτη Υπάρχουν πολλοί τρόποι για να δημιουργήσετε μια web εφαρμογή που καταναλώνει ML μοντέλα. Κάντε μια λίστα με τους τρόπους που θα μπορούσατε να χρησιμοποιήσετε JavaScript ή Python για να δημιουργήσετε μια web εφαρμογή που αξιοποιεί τη μηχανική μάθηση. Σκεφτείτε την αρχιτεκτονική: πρέπει το μοντέλο να παραμείνει στην εφαρμογή ή να ζει στο cloud; Εάν ισχύει το δεύτερο, πώς θα το προσπελάσετε; Σχεδιάστε ένα αρχιτεκτονικό μοντέλο για μια εφαρμοσμένη λύση ML web. ## Εργασία [Δοκιμάστε ένα διαφορετικό μοντέλο](assignment.md) --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.