# Създаване на уеб приложение за използване на ML модел В този урок ще обучите ML модел върху набор от данни, който е извън този свят: _забелязвания на НЛО през последния век_, взети от базата данни на NUFORC. Ще научите: - Как да „pickle“-нете обучен модел - Как да използвате този модел в Flask приложение Ще продължим да използваме notebooks за почистване на данни и обучение на модела, но можете да направите процеса още една стъпка напред, като изследвате използването на модел „в дивата природа“, така да се каже: в уеб приложение. За да направите това, трябва да изградите уеб приложение с Flask. ## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/) ## Създаване на приложение Има няколко начина за създаване на уеб приложения, които да използват машинно обучени модели. Вашата уеб архитектура може да повлияе на начина, по който моделът ви е обучен. Представете си, че работите в бизнес, където групата за анализ на данни е обучила модел, който искат да използвате в приложение. ### Съображения Има много въпроси, които трябва да зададете: - **Уеб приложение или мобилно приложение?** Ако създавате мобилно приложение или трябва да използвате модела в IoT контекст, можете да използвате [TensorFlow Lite](https://www.tensorflow.org/lite/) и да използвате модела в Android или iOS приложение. - **Къде ще се намира моделът?** В облака или локално? - **Поддръжка офлайн.** Трябва ли приложението да работи офлайн? - **Каква технология е използвана за обучение на модела?** Избраната технология може да повлияе на инструментите, които трябва да използвате. - **Използване на TensorFlow.** Ако обучавате модел с TensorFlow, например, тази екосистема предоставя възможност за конвертиране на TensorFlow модел за използване в уеб приложение чрез [TensorFlow.js](https://www.tensorflow.org/js/). - **Използване на PyTorch.** Ако изграждате модел с библиотека като [PyTorch](https://pytorch.org/), имате опция да го експортирате във формат [ONNX](https://onnx.ai/) (Open Neural Network Exchange) за използване в JavaScript уеб приложения, които могат да използват [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, който да бъде запитван в облака от вашето онлайн приложение. Имате също така възможност да изградите цялостно Flask уеб приложение, което би могло да обучава модела директно в уеб браузър. Това може да се направи и с TensorFlow.js в JavaScript контекст. За нашите цели, тъй като работим с notebooks, базирани на Python, нека разгледаме стъпките, които трябва да предприемете, за да експортирате обучен модел от такъв notebook във формат, четим от уеб приложение, изградено с Python. ## Инструмент За тази задача ви трябват два инструмента: Flask и Pickle, и двата работещи на Python. ✅ Какво е [Flask](https://palletsprojects.com/p/flask/)? Определен като „микро-фреймуърк“ от своите създатели, Flask предоставя основните функции на уеб фреймуъркове, използвайки Python и шаблонен двигател за изграждане на уеб страници. Разгледайте [този модул за обучение](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 модул, който сериализира и десериализира структурата на Python обект. Когато „pickle“-нете модел, вие сериализирате или „сплесквате“ неговата структура за използване в уеб. Бъдете внимателни: pickle не е по същество сигурен, така че бъдете внимателни, ако бъдете подканени да „un-pickle“-нете файл. Pickle файл има суфикс `.pkl`. ## Упражнение - почистете данните си В този урок ще използвате данни от 80,000 забелязвания на НЛО, събрани от [NUFORC](https://nuforc.org) (Националния център за докладване на НЛО). Тези данни съдържат интересни описания на забелязвания на НЛО, например: - **Дълго описание.** "Мъж излиза от лъч светлина, който осветява тревисто поле през нощта, и той тича към паркинга на Texas Instruments". - **Кратко описание.** "светлините ни преследваха". Електронната таблица [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) включва колони за `city`, `state` и `country`, където е настъпило забелязването, формата на обекта `shape` и неговите `latitude` и `longitude`. В празния [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. Сега можете да намалите количеството данни, с които трябва да работите, като премахнете всички null стойности и импортирате само забелязвания между 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 вектор, а y векторът ще бъде `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. Обучете модела си, използвайки логистична регресия: ```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`, но това е добра практика за обучение от сурови данни, които сте почистили, експортирали и след това използвали този модел в уеб приложение. ## Упражнение - „pickle“-нете модела си Сега е време да _pickle_-нете модела си! Можете да направите това с няколко реда код. След като е _pickled_, заредете вашия pickled модел и го тествайте срещу примерен масив от данни, съдържащ стойности за секунди, ширина и дължина. ```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** в root директорията. 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 }}