# ML မော်ဒယ်ကို အသုံးပြုရန် Web App တည်ဆောက်ခြင်း ဒီသင်ခန်းစာမှာ သင်သည် _နောက်ဆုံးရာစုအတွင်း UFO တွေ့ရှိမှုများ_ ဆိုတဲ့ အထူးအဆန်းသော ဒေတာစနစ်ပေါ်မှာ ML မော်ဒယ်ကို လေ့ကျင့်ပါမည်။ ဒေတာများကို NUFORC ရဲ့ ဒေတာဘေ့စ်မှ ရယူထားသည်။ သင်လေ့လာရမည့်အရာများမှာ: - လေ့ကျင့်ပြီးသော မော်ဒယ်ကို 'pickle' လုပ်နည်း - Flask app မှာ မော်ဒယ်ကို အသုံးပြုနည်း ကျွန်တော်တို့သည် ဒေတာကို သန့်စင်ခြင်းနှင့် မော်ဒယ်ကို လေ့ကျင့်ခြင်းအတွက် notebook များကို ဆက်လက်အသုံးပြုမည်ဖြစ်ပြီး၊ သင်သည် မော်ဒယ်ကို 'အပြင်မှာ' အသုံးပြုခြင်းကို စူးစမ်းခြင်းဖြင့် တစ်ဆင့်အဆင့်တက်နိုင်ပါသည်။ ဒါကိုလုပ်ဖို့ Flask ကို အသုံးပြုပြီး web app တစ်ခုကို တည်ဆောက်ရပါမည်။ ## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) ## App တစ်ခုတည်ဆောက်ခြင်း Machine learning မော်ဒယ်များကို အသုံးပြုရန် web app များတည်ဆောက်ရန် နည်းလမ်းများစွာရှိသည်။ သင့် web architecture သည် မော်ဒယ်ကို လေ့ကျင့်ပုံကို သက်ရောက်စေနိုင်သည်။ သင်သည် data science group မှ လေ့ကျင့်ထားသော မော်ဒယ်ကို app မှာ အသုံးပြုရန်လိုအပ်သော စီးပွားရေးလုပ်ငန်းတွင် အလုပ်လုပ်နေသည်ဟု စဉ်းစားပါ။ ### စဉ်းစားရန်အချက်များ သင်မေးရမည့်မေးခွန်းများစွာရှိသည်: - **Web app လား mobile app လား?** သင် mobile app တစ်ခုတည်ဆောက်နေသည်၊ ဒါမှမဟုတ် IoT context မှာ မော်ဒယ်ကို အသုံးပြုရန်လိုအပ်ပါက [TensorFlow Lite](https://www.tensorflow.org/lite/) ကို အသုံးပြုပြီး Android သို့မဟုတ် iOS app မှာ မော်ဒယ်ကို အသုံးပြုနိုင်ပါသည်။ - **မော်ဒယ်ကို ဘယ်မှာထားမလဲ?** Cloud မှာလား ဒေသတွင်းမှာလား? - **Offline support.** App သည် offline မှာ အလုပ်လုပ်ရမလား? - **မော်ဒယ်ကို လေ့ကျင့်ရန် ဘယ်နည်းပညာကို အသုံးပြုခဲ့သလဲ?** ရွေးချယ်ထားသော နည်းပညာသည် သင်အသုံးပြုရမည့် tooling ကို သက်ရောက်စေပါမည်။ - **TensorFlow ကို အသုံးပြုခြင်း။** TensorFlow ကို အသုံးပြု၍ မော်ဒယ်ကို လေ့ကျင့်နေပါက [TensorFlow.js](https://www.tensorflow.org/js/) ကို အသုံးပြု၍ web app မှာ အသုံးပြုရန် TensorFlow မော်ဒယ်ကို ပြောင်းနိုင်စွမ်းပေးသည်။ - **PyTorch ကို အသုံးပြုခြင်း။** [PyTorch](https://pytorch.org/) ကဲ့သို့သော library ကို အသုံးပြု၍ မော်ဒယ်တစ်ခုကို တည်ဆောက်နေပါက [ONNX](https://onnx.ai/) (Open Neural Network Exchange) format ကို JavaScript web app များတွင် အသုံးပြုနိုင်ရန် [Onnx Runtime](https://www.onnxruntime.ai/) ကို အသုံးပြုနိုင်သည်။ ဒီ option ကို Scikit-learn-trained မော်ဒယ်အတွက် နောက်ဆုံးသင်ခန်းစာမှာ စူးစမ်းပါမည်။ - **Lobe.ai သို့မဟုတ် Azure Custom Vision ကို အသုံးပြုခြင်း။** [Lobe.ai](https://lobe.ai/) သို့မဟုတ် [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) ကဲ့သို့သော ML SaaS (Software as a Service) စနစ်ကို အသုံးပြု၍ မော်ဒယ်ကို လေ့ကျင့်နေပါက၊ ဒီ software များသည် မော်ဒယ်ကို အမျိုးမျိုးသော platform များအတွက် export လုပ်ရန် နည်းလမ်းများပေးသည်။ Cloud မှာ query လုပ်နိုင်သော bespoke API တစ်ခုတည်ဆောက်ရန်လည်း ရနိုင်သည်။ သင်သည် web browser မှာ မော်ဒယ်ကို ကိုယ်တိုင်လေ့ကျင့်နိုင်သော Flask web app တစ်ခုလုံးကို တည်ဆောက်နိုင်သည်။ JavaScript context မှာ TensorFlow.js ကို အသုံးပြု၍လည်း လုပ်နိုင်ပါသည်။ ကျွန်တော်တို့ရဲ့ ရည်ရွယ်ချက်အရ၊ Python-based notebooks များကို အသုံးပြုနေသောကြောင့် notebook မှ trained မော်ဒယ်ကို Python-built web app မှာ ဖတ်နိုင်သော format သို့ export လုပ်ရန် လိုအပ်သော အဆင့်များကို စူးစမ်းကြည့်ပါမည်။ ## Tool ဒီ task အတွက် သင်သည် Flask နှင့် Pickle ဆိုသော Python မှ run လုပ်သော tool နှစ်ခုလိုအပ်ပါမည်။ ✅ [Flask](https://palletsprojects.com/p/flask/) ဆိုတာဘာလဲ? Flask ကို 'micro-framework' ဟု ဖန်တီးသူများက ဖော်ပြထားပြီး Python ကို အသုံးပြု၍ web frameworks ရဲ့ အခြေခံ features များနှင့် web pages တည်ဆောက်ရန် templating engine ကို ပေးသည်။ Flask ကို အသုံးပြု၍ AI web app တစ်ခုတည်ဆောက်ရန် [ဒီ Learn module](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) ကို ကြည့်ပါ။ ✅ [Pickle](https://docs.python.org/3/library/pickle.html) ဆိုတာဘာလဲ? Pickle 🥒 သည် Python module တစ်ခုဖြစ်ပြီး Python object structure ကို serialize နှင့် de-serialize လုပ်ပေးသည်။ မော်ဒယ်ကို 'pickle' လုပ်သည်ဆိုတာ မော်ဒယ်ရဲ့ structure ကို web မှာ အသုံးပြုရန် serialize သို့မဟုတ် flatten လုပ်ခြင်းဖြစ်သည်။ သတိထားပါ: pickle သည် intrinsic security မရှိသောကြောင့် 'un-pickle' လုပ်ရန် prompt လုပ်ပါက သတိထားပါ။ Pickled file တွင် `.pkl` suffix ပါသည်။ ## လေ့ကျင့်ခန်း - သင့်ဒေတာကို သန့်စင်ပါ ဒီသင်ခန်းစာမှာ သင်သည် [NUFORC](https://nuforc.org) (The National UFO Reporting Center) မှ စုဆောင်းထားသော 80,000 UFO တွေ့ရှိမှုများ၏ ဒေတာကို အသုံးပြုပါမည်။ ဒီဒေတာမှာ UFO တွေ့ရှိမှုများ၏ စိတ်ဝင်စားဖွယ်ဖော်ပြချက်များပါဝင်သည်၊ ဥပမာ: - **ရှည်လျားသော ဖော်ပြချက်။** "အလင်းတန်းတစ်ခုက ညဘက် မြက်ခင်းပေါ်ကို ထွန်းလင်းနေပြီး အလင်းတန်းထဲက လူတစ်ယောက် ထွက်လာပြီး Texas Instruments parking lot ကို ပြေးသွားသည်။" - **တိုတောင်းသော ဖော်ပြချက်။** "အလင်းတွေက ကျွန်တော်တို့ကို လိုက်ခဲ့တယ်။" [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) spreadsheet တွင် `city`, `state`, `country` (တွေ့ရှိမှုဖြစ်ပွားသောနေရာ), object's `shape`, `latitude` နှင့် `longitude` column များပါဝင်သည်။ ဒီသင်ခန်းစာတွင် ပါဝင်သော [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) မှာ: 1. `pandas`, `matplotlib`, နှင့် `numpy` ကို ယခင်သင်ခန်းစာများတွင်လုပ်ခဲ့သလို import လုပ်ပြီး ufos spreadsheet ကို import လုပ်ပါ။ ဒေတာစနစ်တစ်ခုကို ကြည့်နိုင်သည်: ```python import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` 1. ufos ဒေတာကို fresh titles ပါသော dataframe သေးငယ်တစ်ခုသို့ ပြောင်းပါ။ `Country` field ရဲ့ unique values များကို စစ်ဆေးပါ။ ```python ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique() ``` 1. အခုတော့ null values များကို drop လုပ်ပြီး 1-60 seconds ကြားမှာ ဖြစ်ပွားသော တွေ့ရှိမှုများကိုသာ import လုပ်ခြင်းဖြင့် ကျွန်တော်တို့ကိုလိုအပ်သော ဒေတာပမာဏကို လျှော့ချနိုင်ပါသည်: ```python ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info() ``` 1. Scikit-learn ရဲ့ `LabelEncoder` library ကို import လုပ်ပြီး text values များကို number သို့ ပြောင်းပါ: ✅ LabelEncoder သည် ဒေတာကို အက္ခရာစဉ်အတိုင်း encode လုပ်သည် ```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. သင်လေ့ကျင့်လိုသော feature သုံးခုကို X vector အဖြစ် ရွေးချယ်ပါ၊ y vector သည် `Country` ဖြစ်ပါမည်။ သင်သည် `Seconds`, `Latitude` နှင့် `Longitude` ကို input လုပ်ပြီး country id ကို return လုပ်နိုင်ရန်လိုအပ်သည်။ ```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. Logistic regression ကို အသုံးပြု၍ မော်ဒယ်ကို လေ့ကျင့်ပါ: ```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)) ``` Accuracy သည် **(95% ခန့်)** မဆိုးပါဘူး၊ အံ့မခန်းပဲ၊ `Country` နှင့် `Latitude/Longitude` သည် correlation ရှိသောကြောင့်ဖြစ်သည်။ သင်ဖန်တီးထားသော မော်ဒယ်သည် `Latitude` နှင့် `Longitude` မှ `Country` ကို အတိအကျသုံးသပ်နိုင်သည့်အတွက် အလွန်ထူးခြားသော မော်ဒယ်မဟုတ်ပါ၊ ဒါပေမယ့် crude ဒေတာကို သန့်စင်ပြီး export လုပ်ကာ web app မှာ မော်ဒယ်ကို အသုံးပြုရန် လေ့ကျင့်ခြင်းကို လေ့ကျင့်ရန်ကောင်းသော လေ့ကျင့်ခန်းဖြစ်သည်။ ## လေ့ကျင့်ခန်း - မော်ဒယ်ကို 'pickle' လုပ်ပါ အခုတော့ သင့်မော်ဒယ်ကို _pickle_ လုပ်ရန် အချိန်ရောက်ပါပြီ! ```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'** ကို return လုပ်သည်၊ UK ရဲ့ country code ဖြစ်သည်။ အံ့မခန်း! 👽 ## လေ့ကျင့်ခန်း - Flask app တစ်ခုတည်ဆောက်ပါ အခုတော့ သင့်မော်ဒယ်ကို ခေါ်ပြီး ရလဒ်များကို ပိုမိုကြည့်လို့ကောင်းသောပုံစံဖြင့် ပြသနိုင်သော Flask app တစ်ခုကို တည်ဆောက်နိုင်ပါပြီ။ 1. **web-app** folder တစ်ခုကို _notebook.ipynb_ ဖိုင်နှင့် _ufo-model.pkl_ ဖိုင်ရှိရာနေရာအနီးတွင် ဖန်တီးပါ။ 1. အဲဒီ folder မှာ **static** folder တစ်ခု (အတွင်းမှာ **css** folder ပါ) နှင့် **templates** folder တစ်ခု ဖန်တီးပါ။ သင့်တွင် အောက်ပါဖိုင်များနှင့် directories ရှိသင့်သည်: ```output web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl ``` ✅ အပြီးသတ် app ရဲ့ solution folder ကို ကြည့်ပါ 1. _web-app_ folder မှာ ဖန်တီးရမည့် ပထမဆုံးဖိုင်မှာ **requirements.txt** ဖြစ်သည်။ JavaScript app ရဲ့ _package.json_ ကဲ့သို့ requirements.txt ဖိုင်သည် app မှာလိုအပ်သော dependencies များကို ဖော်ပြသည်။ **requirements.txt** မှာ အောက်ပါလိုင်းများထည့်ပါ: ```text scikit-learn pandas numpy flask ``` 1. အခုတော့ _web-app_ folder ကို navigate လုပ်ပြီး ဒီဖိုင်ကို run လုပ်ပါ: ```bash cd web-app ``` 1. Terminal မှာ `pip install` ကို ရိုက်ပါ၊ _requirements.txt_ မှာ ဖော်ပြထားသော libraries များကို install လုပ်ရန်: ```bash pip install -r requirements.txt ``` 1. အခုတော့ app ကို အပြီးသတ်ရန် ဖိုင်သုံးခုကို ဖန်တီးရန် ပြင်ဆင်ထားပါ: 1. **app.py** ကို root မှာ ဖန်တီးပါ။ 2. **index.html** ကို _templates_ directory မှာ ဖန်တီးပါ။ 3. **styles.css** ကို _static/css_ directory မှာ ဖန်တီးပါ။ 1. _styles.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; } ``` 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 }}