23 KiB
Изградња веб апликације за коришћење ML модела
У овој лекцији, обучићете ML модел на скупу података који је ван овог света: УФО виђења у последњем веку, преузетих из базе података NUFORC-а.
Научићете:
- Како да „пиклујете“ обучени модел
- Како да користите тај модел у Flask апликацији
Наставићемо да користимо бележнице за чишћење података и обуку модела, али можете отићи корак даље и истражити како да користите модел „у природи“, односно у веб апликацији.
Да бисте то урадили, потребно је да изградите веб апликацију користећи 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 контексту.
За наше потребе, пошто смо радили са бележницама заснованим на Python-у, хајде да истражимо кораке које треба предузети да бисмо извезли обучени модел из такве бележнице у формат који је читљив за Python веб апликацију.
Алат
За овај задатак потребна су вам два алата: Flask и Pickle, оба која раде на Python-у.
✅ Шта је Flask? Flask је дефинисан као „микро-оквир“ од стране својих креатора и пружа основне функције веб оквира користећи Python и механизам за шаблонирање за изградњу веб страница. Погледајте овај модул за учење да бисте вежбали изградњу са Flask-ом.
✅ Шта је Pickle? Pickle 🥒 је Python модул који серијализује и десеријализује структуру Python објеката. Када „пиклујете“ модел, серијализујете или спљоштите његову структуру за употребу на вебу. Будите опрезни: Pickle није инхерентно безбедан, па будите пажљиви ако вам се предложи да „распакујете“ датотеку. Pickle датотека има наставак .pkl
.
Вежба - очистите своје податке
У овој лекцији користићете податке из 80.000 УФО виђења, прикупљених од стране NUFORC (Национални центар за пријаву УФО-а). Ови подаци садрже занимљиве описе УФО виђења, на пример:
- Дуг опис примера. „Човек излази из зрака светлости који обасјава травнато поље ноћу и трчи према паркингу Texas Instruments-а“.
- Кратак опис примера. „Светла су нас јурила“.
ufos.csv табела укључује колоне о граду
, држави
и земљи
где се виђење догодило, облику објекта (shape
) и његовој географској ширини
и дужини
.
У празној бележници која је укључена у ову лекцију:
-
Увезите
pandas
,matplotlib
иnumpy
као што сте радили у претходним лекцијама и увезите табелу са УФО подацима. Можете погледати пример скупа података:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
Претворите УФО податке у мањи dataframe са новим насловима. Проверите јединствене вредности у пољу
Country
.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Сада можете смањити количину података са којима треба да радимо тако што ћете избацити све вредности које недостају и увезти само виђења у трајању од 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
и добијете ID земље као резултат.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
, али је добра вежба покушати обучити модел од сирових података које сте очистили, извезли и затим користили у веб апликацији.
Вежба - „пиклујте“ свој модел
Сада је време да пиклујете свој модел! То можете урадити у неколико линија кода. Када је модел пиклован, учитајте га и тестирајте на пример подацима који садрже вредности за секунде, географску ширину и дужину.
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 у корену.
- Креирајте 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>
Погледајте шаблонирање у овој датотеци. Приметите „mustache“ синтаксу око променљивих које ће бити обезбеђене од стране апликације, као што је текст предвиђања:
{{}}
. Такође постоји форма која шаље предвиђање на руту/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-ом и пиклованим моделом, је релативно једноставно. Најтежа ствар је разумети у ком облику подаци морају бити послати моделу да би се добило предвиђање. То све зависи од тога како је модел обучен. Овај модел захтева три тачке података за унос како би се добило предвиђање.
У професионалном окружењу, можете видети колико је добра комуникација неопходна између људи који обучавају модел и оних који га користе у веб или мобилној апликацији. У нашем случају, то је само једна особа - ви!
🚀 Изазов
Уместо рада у бележници и увоза модела у Flask апликацију, могли бисте обучити модел директно у Flask апликацији! Покушајте да конвертујете свој Python код из бележнице, можда након што очистите податке, како бисте обучили модел директно у апликацији на рути под називом train
. Које су предности и мане овог приступа?
Квиз након предавања
Преглед и самостално учење
Постоји много начина за изградњу веб апликације која користи ML моделе. Направите списак начина на које бисте могли користити JavaScript или Python за изградњу веб апликације која користи машинско учење. Размотрите архитектуру: да ли модел треба да остане у апликацији или да буде у облаку? Ако је у облаку, како бисте му приступили? Нацртајте архитектонски модел за примену ML решења у веб апликацији.
Задатак
Одрицање од одговорности:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције Co-op Translator. Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.