# Izgradnja web aplikacije za korištenje ML modela U ovoj lekciji, trenirat ćete ML model na skupu podataka koji je doslovno van ovog svijeta: _viđenja NLO-a tijekom prošlog stoljeća_, preuzetih iz NUFORC baze podataka. Naučit ćete: - Kako 'pickle-ati' trenirani model - Kako koristiti taj model u Flask aplikaciji Nastavit ćemo koristiti bilježnice za čišćenje podataka i treniranje modela, ali možete napraviti korak dalje istražujući kako koristiti model "u divljini", da tako kažemo: u web aplikaciji. Da biste to učinili, trebate izgraditi web aplikaciju koristeći Flask. ## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) ## Izgradnja aplikacije Postoji nekoliko načina za izgradnju web aplikacija koje koriste modele strojnog učenja. Vaša web arhitektura može utjecati na način na koji je model treniran. Zamislite da radite u tvrtki gdje je tim za podatkovnu znanost trenirao model koji žele da koristite u aplikaciji. ### Razmatranja Postoji mnogo pitanja koja trebate postaviti: - **Je li to web aplikacija ili mobilna aplikacija?** Ako gradite mobilnu aplikaciju ili trebate koristiti model u IoT kontekstu, možete koristiti [TensorFlow Lite](https://www.tensorflow.org/lite/) i koristiti model u Android ili iOS aplikaciji. - **Gdje će model biti smješten?** U oblaku ili lokalno? - **Podrška za offline rad.** Mora li aplikacija raditi offline? - **Koja tehnologija je korištena za treniranje modela?** Odabrana tehnologija može utjecati na alate koje trebate koristiti. - **Korištenje TensorFlow-a.** Ako trenirate model koristeći TensorFlow, na primjer, taj ekosustav omogućuje konverziju TensorFlow modela za korištenje u web aplikaciji pomoću [TensorFlow.js](https://www.tensorflow.org/js/). - **Korištenje PyTorch-a.** Ako gradite model koristeći biblioteku poput [PyTorch](https://pytorch.org/), imate opciju izvesti ga u [ONNX](https://onnx.ai/) (Open Neural Network Exchange) formatu za korištenje u JavaScript web aplikacijama koje mogu koristiti [Onnx Runtime](https://www.onnxruntime.ai/). Ova opcija će biti istražena u budućoj lekciji za model treniran pomoću Scikit-learn. - **Korištenje Lobe.ai ili Azure Custom Vision.** Ako koristite ML SaaS (Software as a Service) sustav poput [Lobe.ai](https://lobe.ai/) ili [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) za treniranje modela, ovaj tip softvera pruža načine za izvoz modela za mnoge platforme, uključujući izgradnju prilagođenog API-ja koji se može upitati u oblaku putem vaše online aplikacije. Također imate priliku izgraditi cijelu Flask web aplikaciju koja bi mogla trenirati model unutar web preglednika. To se također može učiniti koristeći TensorFlow.js u JavaScript kontekstu. Za naše potrebe, budući da radimo s bilježnicama temeljenim na Pythonu, istražimo korake koje trebate poduzeti kako biste izvezli trenirani model iz takve bilježnice u format čitljiv Python-izgrađenoj web aplikaciji. ## Alat Za ovaj zadatak trebate dva alata: Flask i Pickle, oba se pokreću na Pythonu. ✅ Što je [Flask](https://palletsprojects.com/p/flask/)? Definiran kao 'mikro-okvir' od strane svojih kreatora, Flask pruža osnovne značajke web okvira koristeći Python i motor za predloške za izgradnju web stranica. Pogledajte [ovaj modul za učenje](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) kako biste vježbali izgradnju s Flaskom. ✅ Što je [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 je Python modul koji serijalizira i de-serijalizira strukturu Python objekta. Kada 'pickle-ate' model, serijalizirate ili "spljoštavate" njegovu strukturu za korištenje na webu. Budite oprezni: pickle nije inherentno siguran, pa budite oprezni ako vas se potiče da 'un-pickle-ate' datoteku. Pickle-ana datoteka ima sufiks `.pkl`. ## Vježba - očistite svoje podatke U ovoj lekciji koristit ćete podatke iz 80.000 viđenja NLO-a, prikupljenih od strane [NUFORC](https://nuforc.org) (Nacionalni centar za prijavu NLO-a). Ovi podaci imaju zanimljive opise viđenja NLO-a, na primjer: - **Dugi opis primjera.** "Čovjek izlazi iz zrake svjetlosti koja obasjava travnato polje noću i trči prema parkiralištu Texas Instrumentsa". - **Kratki opis primjera.** "svjetla su nas progonila". [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) proračunska tablica uključuje stupce o `grad`, `država` i `zemlja` gdje se viđenje dogodilo, oblik objekta (`shape`) te njegovu `širinu` i `dužinu`. U praznoj [bilježnici](../../../../3-Web-App/1-Web-App/notebook.ipynb) uključene u ovu lekciju: 1. importirajte `pandas`, `matplotlib` i `numpy` kao što ste to učinili u prethodnim lekcijama i importirajte proračunsku tablicu ufos. Možete pogledati uzorak skupa podataka: ```python import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` 1. Pretvorite podatke ufos u mali dataframe sa svježim naslovima. Provjerite jedinstvene vrijednosti u polju `Country`. ```python ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique() ``` 1. Sada možete smanjiti količinu podataka s kojima trebamo raditi tako da odbacite sve null vrijednosti i uvezete samo viđenja između 1-60 sekundi: ```python ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info() ``` 1. Importirajte Scikit-learnovu biblioteku `LabelEncoder` za pretvaranje tekstualnih vrijednosti za zemlje u broj: ✅ LabelEncoder kodira podatke abecedno ```python from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head() ``` Vaši podaci trebali bi izgledati ovako: ```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 ``` ## Vježba - izgradite svoj model Sada se možete pripremiti za treniranje modela dijeljenjem podataka u skup za treniranje i testiranje. 1. Odaberite tri značajke na kojima želite trenirati kao svoj X vektor, a y vektor će biti `Country`. Želite moći unijeti `Seconds`, `Latitude` i `Longitude` i dobiti ID zemlje kao rezultat. ```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. Trenirajte svoj model koristeći logističku regresiju: ```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)) ``` Točnost nije loša **(oko 95%)**, što nije iznenađujuće, jer `Country` i `Latitude/Longitude` koreliraju. Model koji ste kreirali nije baš revolucionaran jer biste trebali moći zaključiti `Country` iz njegovih `Latitude` i `Longitude`, ali ovo je dobra vježba za pokušaj treniranja od sirovih podataka koje ste očistili, izvezli, a zatim koristili ovaj model u web aplikaciji. ## Vježba - 'pickle-ajte' svoj model Sada je vrijeme da _pickle-ate_ svoj model! To možete učiniti u nekoliko linija koda. Jednom kada je _pickle-an_, učitajte svoj pickle-ani model i testirajte ga na uzorku podataka koji sadrži vrijednosti za sekunde, širinu i dužinu. ```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]])) ``` Model vraća **'3'**, što je kod zemlje za UK. Nevjerojatno! 👽 ## Vježba - izgradite Flask aplikaciju Sada možete izgraditi Flask aplikaciju koja poziva vaš model i vraća slične rezultate, ali na vizualno privlačniji način. 1. Započnite stvaranjem mape nazvane **web-app** pored datoteke _notebook.ipynb_ gdje se nalazi vaša datoteka _ufo-model.pkl_. 1. U toj mapi stvorite još tri mape: **static**, s mapom **css** unutar nje, i **templates**. Sada biste trebali imati sljedeće datoteke i direktorije: ```output web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl ``` ✅ Pogledajte mapu rješenja za pregled gotove aplikacije 1. Prva datoteka koju treba stvoriti u mapi _web-app_ je datoteka **requirements.txt**. Kao _package.json_ u JavaScript aplikaciji, ova datoteka navodi ovisnosti potrebne za aplikaciju. U **requirements.txt** dodajte linije: ```text scikit-learn pandas numpy flask ``` 1. Sada pokrenite ovu datoteku navigacijom do _web-app_: ```bash cd web-app ``` 1. U svom terminalu upišite `pip install`, kako biste instalirali biblioteke navedene u _requirements.txt_: ```bash pip install -r requirements.txt ``` 1. Sada ste spremni stvoriti još tri datoteke za dovršetak aplikacije: 1. Stvorite **app.py** u korijenu. 2. Stvorite **index.html** u direktoriju _templates_. 3. Stvorite **styles.css** u direktoriju _static/css_. 1. Izgradite datoteku _styles.css_ s nekoliko stilova: ```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. Zatim izgradite datoteku _index.html_: ```html
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
{{ prediction_text }}