# Ehita veebirakendus ML-mudeli kasutamiseks Selles tunnis treenid ML-mudelit andmekogumiga, mis on täiesti teistsugune: _UFO-vaatlused viimase sajandi jooksul_, pärinedes NUFORC-i andmebaasist. Sa õpid: - Kuidas 'marineerida' treenitud mudelit - Kuidas kasutada seda mudelit Flaski rakenduses Jätkame sülearvutite kasutamist andmete puhastamiseks ja mudeli treenimiseks, kuid võid protsessi viia sammu võrra kaugemale, uurides mudeli kasutamist "metsikus looduses", nii öelda: veebirakenduses. Selleks pead ehitama veebirakenduse, kasutades Flaski. ## [Loengu-eelne viktoriin](https://ff-quizzes.netlify.app/en/ml/) ## Rakenduse loomine Masinõppe mudelite tarbimiseks veebirakenduste loomiseks on mitmeid viise. Sinu veebiarhitektuur võib mõjutada mudeli treenimise viisi. Kujuta ette, et töötad ettevõttes, kus andmeteaduse meeskond on treeninud mudeli, mida nad soovivad rakenduses kasutada. ### Mõtteainet On mitmeid küsimusi, mida pead endalt küsima: - **Kas see on veebirakendus või mobiilirakendus?** Kui ehitad mobiilirakendust või vajad mudelit IoT kontekstis, võid kasutada [TensorFlow Lite](https://www.tensorflow.org/lite/) ja kasutada mudelit Androidi või iOS-i rakenduses. - **Kus mudel asub?** Pilves või kohapeal? - **Võimalus töötada võrguühenduseta.** Kas rakendus peab töötama võrguühenduseta? - **Millist tehnoloogiat kasutati mudeli treenimiseks?** Valitud tehnoloogia võib mõjutada vajalikke tööriistu. - **TensorFlow kasutamine.** Kui treenid mudelit TensorFlow abil, pakub see ökosüsteem võimalust konverteerida TensorFlow mudel veebirakenduses kasutamiseks, kasutades [TensorFlow.js](https://www.tensorflow.org/js/). - **PyTorch kasutamine.** Kui ehitad mudelit, kasutades sellist teeki nagu [PyTorch](https://pytorch.org/), on sul võimalus eksportida see [ONNX](https://onnx.ai/) (Open Neural Network Exchange) formaadis JavaScripti veebirakenduste jaoks, mis saavad kasutada [Onnx Runtime](https://www.onnxruntime.ai/). Seda võimalust uuritakse tulevases tunnis Scikit-learniga treenitud mudeli jaoks. - **Lobe.ai või Azure Custom Vision kasutamine.** Kui kasutad ML SaaS (tarkvara teenusena) süsteemi, nagu [Lobe.ai](https://lobe.ai/) või [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) mudeli treenimiseks, pakub selline tarkvara viise mudeli eksportimiseks mitmetele platvormidele, sealhulgas kohandatud API loomist, mida saab pilves päringuteks kasutada. Sul on ka võimalus ehitada terve Flaski veebirakendus, mis suudab ise mudelit veebibrauseris treenida. Seda saab teha ka JavaScripti kontekstis, kasutades TensorFlow.js-i. Meie eesmärkide jaoks, kuna oleme töötanud Pythonil põhinevate sülearvutitega, uurime samme, mida pead tegema, et eksportida treenitud mudel sellisest sülearvutist Pythonil ehitatud veebirakenduse jaoks loetavasse formaati. ## Tööriist Selle ülesande jaoks vajad kahte tööriista: Flaski ja Pickle'it, mis mõlemad töötavad Pythonis. ✅ Mis on [Flask](https://palletsprojects.com/p/flask/)? Selle loojate poolt defineeritud kui 'mikro-raamistik', pakub Flask veebiraamistike põhifunktsioone, kasutades Pythonit ja mallimootorit veebilehtede loomiseks. Vaata [seda õppe moodulit](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott), et harjutada Flaskiga ehitamist. ✅ Mis on [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 on Pythoni moodul, mis serialiseerib ja deserialiseerib Pythoni objektistruktuuri. Kui 'marineerid' mudelit, serialiseerid või lamedad selle struktuuri veebis kasutamiseks. Ole ettevaatlik: Pickle ei ole olemuselt turvaline, seega ole ettevaatlik, kui sind kutsutakse faili 'lahti marineerima'. Marineeritud failil on järelliide `.pkl`. ## Harjutus - puhasta oma andmed Selles tunnis kasutad andmeid 80 000 UFO-vaatlusest, mis on kogutud [NUFORC](https://nuforc.org) (Riiklik UFO-raportite keskus) poolt. Need andmed sisaldavad huvitavaid kirjeldusi UFO-vaatlustest, näiteks: - **Pikk näite kirjeldus.** "Mees ilmub valguskiirest, mis paistab öösel rohtunud väljal, ja jookseb Texas Instrumentsi parklat suunas." - **Lühike näite kirjeldus.** "tuled jälitasid meid." [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) tabel sisaldab veerge `city`, `state` ja `country`, kus vaatlus toimus, objekti `shape` ning selle `latitude` ja `longitude`. Kaasaolevas tühjas [sülearvutis](notebook.ipynb): 1. impordi `pandas`, `matplotlib` ja `numpy`, nagu tegid eelnevates tundides, ning impordi ufode tabel. Võid vaadata näidisandmekogumit: ```python import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` 1. Konverteeri ufode andmed väiksemaks andmeraamiks värskete pealkirjadega. Kontrolli unikaalseid väärtusi `Country` väljal. ```python ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique() ``` 1. Nüüd saad vähendada andmete hulka, millega pead tegelema, eemaldades kõik nullväärtused ja importides ainult vaatlused, mis kestavad 1-60 sekundit: ```python ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info() ``` 1. Impordi Scikit-learn'i `LabelEncoder` teek, et konverteerida riikide tekstiväärtused numbriteks: ✅ LabelEncoder kodeerib andmeid tähestikulises järjekorras ```python from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head() ``` Sinu andmed peaksid välja nägema sellised: ```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 ``` ## Harjutus - ehita oma mudel Nüüd saad valmistuda mudeli treenimiseks, jagades andmed treening- ja testimisgruppi. 1. Vali kolm funktsiooni, mille põhjal soovid mudelit treenida, kui oma X vektor, ja y vektoriks saab `Country`. Soovid sisestada `Seconds`, `Latitude` ja `Longitude` ning saada riigi ID-d tagastamiseks. ```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. Treeni oma mudel logistilise regressiooni abil: ```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)) ``` Täpsus pole halb **(umbes 95%)**, mis pole üllatav, kuna `Country` ja `Latitude/Longitude` korreleeruvad. Loodud mudel pole väga revolutsiooniline, kuna peaksid suutma `Country` tuletada selle `Latitude` ja `Longitude` põhjal, kuid see on hea harjutus, et proovida treenida toorandmetest, mida oled puhastanud, eksportinud ja seejärel kasutada seda mudelit veebirakenduses. ## Harjutus - 'marineeri' oma mudel Nüüd on aeg oma mudel _marineerida_! Seda saad teha mõne koodirea abil. Kui see on _marineeritud_, laadi oma marineeritud mudel ja testi seda näidisandmete massiivi vastu, mis sisaldab väärtusi sekundite, laius- ja pikkuskraadi kohta. ```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]])) ``` Mudel tagastab **'3'**, mis on Ühendkuningriigi riigikood. Hämmastav! 👽 ## Harjutus - ehita Flaski rakendus Nüüd saad ehitada Flaski rakenduse, et kutsuda oma mudelit ja tagastada sarnaseid tulemusi, kuid visuaalselt meeldivamal viisil. 1. Alusta kausta **web-app** loomisega _notebook.ipynb_ faili kõrvale, kus asub sinu _ufo-model.pkl_ fail. 1. Loo sellesse kausta veel kolm kausta: **static**, mille sees on kaust **css**, ja **templates**. Sul peaks nüüd olema järgmised failid ja kataloogid: ```output web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl ``` ✅ Vaata lahenduse kausta, et näha valmis rakenduse vaadet 1. Esimene fail, mida _web-app_ kaustas luua, on **requirements.txt** fail. Nagu _package.json_ JavaScripti rakenduses, loetleb see fail rakenduse jaoks vajalikud sõltuvused. Lisa **requirements.txt** faili read: ```text scikit-learn pandas numpy flask ``` 1. Nüüd käivita see fail, liikudes _web-app_ kausta: ```bash cd web-app ``` 1. Oma terminalis kirjuta `pip install`, et installida _requirements.txt_ failis loetletud teegid: ```bash pip install -r requirements.txt ``` 1. Nüüd oled valmis looma veel kolm faili, et rakendus lõpetada: 1. Loo **app.py** juurkausta. 2. Loo **index.html** _templates_ kataloogi. 3. Loo **styles.css** _static/css_ kataloogi. 1. Täienda _styles.css_ faili mõne stiiliga: ```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. Järgmisena täienda _index.html_ faili: ```html
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
{{ prediction_text }}