# Δημιουργία μιας 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
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
{{ prediction_text }}