# Zgradite spletno aplikacijo za uporabo modela strojnega učenja V tej lekciji boste trenirali model strojnega učenja na podatkovnem naboru, ki je resnično izjemen: _opazovanja NLP-jev v zadnjem stoletju_, pridobljenih iz baze podatkov NUFORC. Naučili se boste: - Kako 'shraniti' treniran model - Kako uporabiti ta model v aplikaciji Flask Še naprej bomo uporabljali beležke za čiščenje podatkov in treniranje modela, vendar lahko proces nadgradite tako, da raziščete uporabo modela 'v divjini', če lahko tako rečemo: v spletni aplikaciji. Za to morate zgraditi spletno aplikacijo z uporabo Flask. ## [Predlekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) ## Gradnja aplikacije Obstaja več načinov za gradnjo spletnih aplikacij, ki uporabljajo modele strojnega učenja. Vaša spletna arhitektura lahko vpliva na način, kako je model treniran. Predstavljajte si, da delate v podjetju, kjer je skupina za podatkovno znanost trenirala model, ki ga želite uporabiti v aplikaciji. ### Premisleki Obstaja veliko vprašanj, ki jih morate zastaviti: - **Ali gre za spletno ali mobilno aplikacijo?** Če gradite mobilno aplikacijo ali morate model uporabiti v kontekstu IoT, lahko uporabite [TensorFlow Lite](https://www.tensorflow.org/lite/) in model uporabite v aplikaciji za Android ali iOS. - **Kje bo model shranjen?** V oblaku ali lokalno? - **Podpora brez povezave.** Ali mora aplikacija delovati brez povezave? - **Katera tehnologija je bila uporabljena za treniranje modela?** Izbrana tehnologija lahko vpliva na orodja, ki jih morate uporabiti. - **Uporaba TensorFlow.** Če trenirate model z uporabo TensorFlow, na primer, ta ekosistem omogoča pretvorbo modela TensorFlow za uporabo v spletni aplikaciji z uporabo [TensorFlow.js](https://www.tensorflow.org/js/). - **Uporaba PyTorch.** Če gradite model z uporabo knjižnice, kot je [PyTorch](https://pytorch.org/), imate možnost, da ga izvozite v format [ONNX](https://onnx.ai/) (Open Neural Network Exchange) za uporabo v JavaScript spletnih aplikacijah, ki lahko uporabljajo [Onnx Runtime](https://www.onnxruntime.ai/). To možnost bomo raziskali v prihodnji lekciji za model, treniran s Scikit-learn. - **Uporaba Lobe.ai ali Azure Custom Vision.** Če uporabljate sistem ML SaaS (Software as a Service), kot sta [Lobe.ai](https://lobe.ai/) ali [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) za treniranje modela, ta vrsta programske opreme omogoča načine za izvoz modela za številne platforme, vključno z gradnjo prilagojenega API-ja, ki ga vaša spletna aplikacija lahko poizveduje v oblaku. Imate tudi možnost zgraditi celotno spletno aplikacijo Flask, ki bi lahko trenirala model kar v spletnem brskalniku. To je mogoče storiti tudi z uporabo TensorFlow.js v kontekstu JavaScript. Za naše namene, ker smo delali z beležkami, ki temeljijo na Pythonu, raziščimo korake, ki jih morate narediti, da izvozite treniran model iz takšne beležke v format, ki ga lahko bere spletna aplikacija, zgrajena v Pythonu. ## Orodje Za to nalogo potrebujete dve orodji: Flask in Pickle, oba delujeta na Pythonu. ✅ Kaj je [Flask](https://palletsprojects.com/p/flask/)? Flask, opisan kot 'mikro-okvir' s strani njegovih ustvarjalcev, ponuja osnovne funkcije spletnih okvirov z uporabo Pythona in predloge za gradnjo spletnih strani. Oglejte si [ta modul za učenje](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott), da vadite gradnjo s Flask. ✅ Kaj je [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 je Python modul, ki serializira in de-serializira strukturo Python objektov. Ko 'shranite' model, serializirate ali sploščite njegovo strukturo za uporabo na spletu. Bodite previdni: pickle ni sam po sebi varen, zato bodite previdni, če vas pozove k 'odshranjevanju' datoteke. Shranjena datoteka ima pripono `.pkl`. ## Naloga - očistite svoje podatke V tej lekciji boste uporabili podatke iz 80.000 opazovanj NLP-jev, zbranih s strani [NUFORC](https://nuforc.org) (Nacionalni center za poročanje o NLP-jih). Ti podatki vsebujejo zanimive opise opazovanj NLP-jev, na primer: - **Dolgi opis primera.** "Moški se pojavi iz svetlobnega žarka, ki sveti na travnato polje ponoči, in teče proti parkirišču Texas Instruments." - **Kratki opis primera.** "luči so nas lovile." Preglednica [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) vključuje stolpce o `mestu`, `državi` in `državi`, kjer se je opazovanje zgodilo, obliki objekta (`shape`) ter njegovi `zemljepisni širini` in `zemljepisni dolžini`. V prazni [beležki](../../../../3-Web-App/1-Web-App/notebook.ipynb), ki je vključena v to lekcijo: 1. uvozite `pandas`, `matplotlib` in `numpy`, kot ste to storili v prejšnjih lekcijah, ter uvozite preglednico NLP-jev. Lahko si ogledate vzorčni podatkovni nabor: ```python import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` 1. Pretvorite podatke NLP-jev v majhen podatkovni okvir z novimi naslovi. Preverite unikatne vrednosti v polju `Country`. ```python ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique() ``` 1. Zdaj lahko zmanjšate količino podatkov, s katerimi se morate ukvarjati, tako da odstranite vse vrednosti null in uvozite samo opazovanja med 1-60 sekundami: ```python ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info() ``` 1. Uvozite knjižnico Scikit-learn `LabelEncoder`, da pretvorite besedilne vrednosti za države v številke: ✅ LabelEncoder kodira podatke po abecedi ```python from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head() ``` Vaši podatki bi morali izgledati takole: ```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 ``` ## Naloga - zgradite svoj model Zdaj se lahko pripravite na treniranje modela tako, da podatke razdelite v skupino za treniranje in testiranje. 1. Izberite tri značilnosti, na katerih želite trenirati, kot vaš X vektor, medtem ko bo y vektor `Country`. Želite vnesti `Seconds`, `Latitude` in `Longitude` ter dobiti ID države kot 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 z uporabo logistične regresije: ```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)) ``` Natančnost ni slaba **(približno 95%)**, kar ni presenetljivo, saj se `Country` in `Latitude/Longitude` korelirata. Model, ki ste ga ustvarili, ni zelo revolucionaren, saj bi morali biti sposobni sklepati `Country` iz njegovih `Latitude` in `Longitude`, vendar je to dobra vaja za treniranje iz surovih podatkov, ki ste jih očistili, izvozili in nato uporabili ta model v spletni aplikaciji. ## Naloga - 'shranite' svoj model Zdaj je čas, da _shranite_ svoj model! To lahko storite v nekaj vrsticah kode. Ko je _shranjen_, naložite shranjeni model in ga preizkusite na vzorčnem podatkovnem nizu, ki vsebuje vrednosti za sekunde, zemljepisno širino in dolžino. ```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 vrne **'3'**, kar je koda države za Združeno kraljestvo. Neverjetno! 👽 ## Naloga - zgradite aplikacijo Flask Zdaj lahko zgradite aplikacijo Flask, ki bo klicala vaš model in vračala podobne rezultate, vendar na bolj vizualno privlačen način. 1. Začnite z ustvarjanjem mape **web-app** poleg datoteke _notebook.ipynb_, kjer se nahaja vaša datoteka _ufo-model.pkl_. 1. V tej mapi ustvarite še tri mape: **static**, z mapo **css** znotraj nje, in **templates**. Zdaj bi morali imeti naslednje datoteke in direktorije: ```output web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl ``` ✅ Oglejte si mapo z rešitvami za pogled na končano aplikacijo 1. Prva datoteka, ki jo ustvarite v mapi _web-app_, je datoteka **requirements.txt**. Kot _package.json_ v aplikaciji JavaScript, ta datoteka navaja odvisnosti, ki jih aplikacija potrebuje. V **requirements.txt** dodajte vrstice: ```text scikit-learn pandas numpy flask ``` 1. Zdaj zaženite to datoteko tako, da se premaknete v _web-app_: ```bash cd web-app ``` 1. V terminalu vnesite `pip install`, da namestite knjižnice, navedene v _requirements.txt_: ```bash pip install -r requirements.txt ``` 1. Zdaj ste pripravljeni ustvariti še tri datoteke za dokončanje aplikacije: 1. Ustvarite **app.py** v korenu. 2. Ustvarite **index.html** v mapi _templates_. 3. Ustvarite **styles.css** v mapi _static/css_. 1. Izdelajte datoteko _styles.css_ z nekaj slogi: ```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. Nato izdelajte datoteko _index.html_: ```html
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
{{ prediction_text }}