23 KiB
Създаване на уеб приложение за използване на ML модел
В този урок ще обучите ML модел върху набор от данни, който е извън този свят: забелязвания на НЛО през последния век, взети от базата данни на NUFORC.
Ще научите:
- Как да „pickle“-нете обучен модел
- Как да използвате този модел в Flask приложение
Ще продължим да използваме notebooks за почистване на данни и обучение на модела, но можете да направите процеса още една стъпка напред, като изследвате използването на модел „в дивата природа“, така да се каже: в уеб приложение.
За да направите това, трябва да изградите уеб приложение с Flask.
Тест преди лекцията
Създаване на приложение
Има няколко начина за създаване на уеб приложения, които да използват машинно обучени модели. Вашата уеб архитектура може да повлияе на начина, по който моделът ви е обучен. Представете си, че работите в бизнес, където групата за анализ на данни е обучила модел, който искат да използвате в приложение.
Съображения
Има много въпроси, които трябва да зададете:
- Уеб приложение или мобилно приложение? Ако създавате мобилно приложение или трябва да използвате модела в IoT контекст, можете да използвате TensorFlow Lite и да използвате модела в Android или iOS приложение.
- Къде ще се намира моделът? В облака или локално?
- Поддръжка офлайн. Трябва ли приложението да работи офлайн?
- Каква технология е използвана за обучение на модела? Избраната технология може да повлияе на инструментите, които трябва да използвате.
- Използване на TensorFlow. Ако обучавате модел с TensorFlow, например, тази екосистема предоставя възможност за конвертиране на TensorFlow модел за използване в уеб приложение чрез TensorFlow.js.
- Използване на PyTorch. Ако изграждате модел с библиотека като PyTorch, имате опция да го експортирате във формат ONNX (Open Neural Network Exchange) за използване в JavaScript уеб приложения, които могат да използват Onnx Runtime. Тази опция ще бъде разгледана в бъдещ урок за модел, обучен със Scikit-learn.
- Използване на Lobe.ai или Azure Custom Vision. Ако използвате ML SaaS (Software as a Service) система като Lobe.ai или Azure Custom Vision за обучение на модел, този тип софтуер предоставя начини за експортиране на модела за много платформи, включително изграждане на персонализиран API, който да бъде запитван в облака от вашето онлайн приложение.
Имате също така възможност да изградите цялостно Flask уеб приложение, което би могло да обучава модела директно в уеб браузър. Това може да се направи и с TensorFlow.js в JavaScript контекст.
За нашите цели, тъй като работим с notebooks, базирани на Python, нека разгледаме стъпките, които трябва да предприемете, за да експортирате обучен модел от такъв notebook във формат, четим от уеб приложение, изградено с Python.
Инструмент
За тази задача ви трябват два инструмента: Flask и Pickle, и двата работещи на Python.
✅ Какво е Flask? Определен като „микро-фреймуърк“ от своите създатели, Flask предоставя основните функции на уеб фреймуъркове, използвайки Python и шаблонен двигател за изграждане на уеб страници. Разгледайте този модул за обучение, за да практикувате изграждане с Flask.
✅ Какво е Pickle? Pickle 🥒 е Python модул, който сериализира и десериализира структурата на Python обект. Когато „pickle“-нете модел, вие сериализирате или „сплесквате“ неговата структура за използване в уеб. Бъдете внимателни: pickle не е по същество сигурен, така че бъдете внимателни, ако бъдете подканени да „un-pickle“-нете файл. Pickle файл има суфикс .pkl
.
Упражнение - почистете данните си
В този урок ще използвате данни от 80,000 забелязвания на НЛО, събрани от NUFORC (Националния център за докладване на НЛО). Тези данни съдържат интересни описания на забелязвания на НЛО, например:
- Дълго описание. "Мъж излиза от лъч светлина, който осветява тревисто поле през нощта, и той тича към паркинга на Texas Instruments".
- Кратко описание. "светлините ни преследваха".
Електронната таблица ufos.csv включва колони за city
, state
и country
, където е настъпило забелязването, формата на обекта shape
и неговите latitude
и longitude
.
В празния notebook, включен в този урок:
-
Импортирайте
pandas
,matplotlib
иnumpy
, както направихте в предишните уроци, и импортирайте електронната таблица ufos. Можете да разгледате примерен набор от данни:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
Конвертирайте данните за ufos в малък dataframe с нови заглавия. Проверете уникалните стойности в полето
Country
.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Сега можете да намалите количеството данни, с които трябва да работите, като премахнете всички null стойности и импортирате само забелязвания между 1-60 секунди:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
Импортирайте библиотеката
LabelEncoder
на Scikit-learn, за да конвертирате текстовите стойности за страните в числа:✅ LabelEncoder кодира данни по азбучен ред
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
Вашите данни трябва да изглеждат така:
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
Упражнение - изградете модела си
Сега можете да се подготвите за обучение на модел, като разделите данните на групи за обучение и тестване.
-
Изберете трите характеристики, върху които искате да обучите модела, като ваш X вектор, а y векторът ще бъде
Country
. Искате да можете да въведетеSeconds
,Latitude
иLongitude
и да получите идентификатор на страна за връщане.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)
-
Обучете модела си, използвайки логистична регресия:
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 модел и го тествайте срещу примерен масив от данни, съдържащ стойности за секунди, ширина и дължина.
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 приложение, което да извиква вашия модел и да връща подобни резултати, но по-визуално приятен начин.
-
Започнете, като създадете папка, наречена web-app, до файла notebook.ipynb, където се намира вашият ufo-model.pkl файл.
-
В тази папка създайте още три папки: static, с папка css вътре, и templates. Сега трябва да имате следните файлове и директории:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl
✅ Вижте папката с решението за изглед на завършеното приложение
-
Първият файл, който трябва да създадете в папката web-app, е файлът requirements.txt. Подобно на package.json в JavaScript приложение, този файл изброява зависимостите, необходими за приложението. В requirements.txt добавете редовете:
scikit-learn pandas numpy flask
-
Сега изпълнете този файл, като навигирате до web-app:
cd web-app
-
В терминала си напишете
pip install
, за да инсталирате библиотеките, изброени в requirements.txt:pip install -r requirements.txt
-
Сега сте готови да създадете още три файла, за да завършите приложението:
- Създайте app.py в root директорията.
- Създайте index.html в директорията templates.
- Създайте styles.css в директорията static/css.
-
Изградете файла styles.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; }
-
След това изградете файла index.html:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>🛸 UFO Appearance Prediction! 👽</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body> <div class="grid"> <div class="box"> <p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p> <form action="{{ url_for('predict')}}" method="post"> <input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" /> <input type="text" name="latitude" placeholder="Latitude" required="required" /> <input type="text" name="longitude" placeholder="Longitude" required="required" /> <button type="submit" class="btn">Predict country where the UFO is seen</button> </form> <p>{{ prediction_text }}</p> </div> </div> </body> </html>
Разгледайте шаблонирането в този файл. Забележете синтаксиса „мустачки“ около променливите, които ще бъдат предоставени от приложението, като текста на предсказанието:
{{}}
. Има и форма, която изпраща предсказание към маршрута/predict
.Накрая сте готови да изградите Python файла, който управлява използването на модела и показването на предсказанията:
-
В
app.py
добавете:import numpy as np from flask import Flask, request, render_template import pickle app = Flask(__name__) model = pickle.load(open("./ufo-model.pkl", "rb")) @app.route("/") def home(): return render_template("index.html") @app.route("/predict", methods=["POST"]) def predict(): int_features = [int(x) for x in request.form.values()] final_features = [np.array(int_features)] prediction = model.predict(final_features) output = prediction[0] countries = ["Australia", "Canada", "Germany", "UK", "US"] return render_template( "index.html", prediction_text="Likely country: {}".format(countries[output]) ) if __name__ == "__main__": app.run(debug=True)
💡 Съвет: когато добавите
debug=True
, докато изпълнявате уеб приложението с Flask, всяка промяна, която направите в приложението, ще се отрази незабавно, без да е необходимо да рестартирате сървъра. Внимавайте! Не активирайте този режим в продукционно приложение.
Ако изпълните python app.py
или python3 app.py
- вашият уеб сървър стартира локално и можете да попълните кратка форма, за да получите отговор на вашия горещ въпрос за това къде са били забелязани НЛО!
Преди да направите това, разгледайте частите на app.py
:
- Първо, зависимостите се зареждат и приложението стартира.
- След това моделът се импортира.
- След това
index.html
се рендерира на началния маршрут.
На маршрута /predict
се случват няколко неща, когато формата се изпрати:
- Променливите от формата се събират и конвертират в numpy масив. След това те се изпращат към модела и се връща предсказание.
- Страните, които искаме да се показват, се рендерират отново като четим текст от техния предсказан код на страна, и тази стойност се връща към
index.html
, за да бъде рендерирана в шаблона.
Използването на модел по този начин, с Flask и pickled модел, е сравнително лесно. Най-трудното е да разберете каква форма трябва да има данните, които трябва да бъдат изпратени към модела, за да получите предсказание. Това зависи изцяло от начина, по който моделът е обучен. Този има три точки данни, които трябва да бъдат въведени, за да се получи предсказание.
В професионална среда можете да видите колко е важно добрата комуникация между хората, които обучават модела, и тези, които го използват в уеб или мобилно приложение. В нашия случай, това е само един човек - вие!
🚀 Предизвикателство
Вместо да работите в notebook и да импортирате модела в Flask приложението, можете да обучите модела директно в Flask приложението! Опитайте да конвертирате вашия Python код в notebook, може би след като данните ви са почистени, за да обучите модела директно в приложението на маршрут, наречен train
. Какви са плюсовете и минусите на този метод?
Тест след лекцията
Преглед и самостоятелно обучение
Има много начини за създаване на уеб приложение, което да използва ML модели. Направете списък с начините, по които можете да използвате JavaScript или Python за изграждане на уеб приложение, което използва машинно обучение. Помислете за архитектурата: трябва ли моделът да остане в приложението или да живее в облака? Ако е второто, как бихте го достъпили? Начертайте архитектурен модел за приложено ML уеб решение.
Задание
Отказ от отговорност:
Този документ е преведен с помощта на AI услуга за превод Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.