# အစားအစာအမျိုးအစား အကြံပေးဝက်ဘ်အက်ပ် တည်ဆောက်ခြင်း
ဒီသင်ခန်းစာမှာ သင်ဟာ အတိတ်သင်ခန်းစာတွေမှာ သင်ယူခဲ့တဲ့နည်းလမ်းတွေကို အသုံးပြုပြီး အစားအစာအမျိုးအစားဒေတာစနစ်ကို အသုံးပြုကာ အမျိုးအစားခွဲခြားမော်ဒယ်တစ်ခု တည်ဆောက်ပါမယ်။ ထို့အပြင် Onnx ရဲ့ web runtime ကို အသုံးပြုကာ သိမ်းဆည်းထားတဲ့မော်ဒယ်ကို အသုံးပြုနိုင်တဲ့ ဝက်ဘ်အက်ပ်လေးတစ်ခုကိုလည်း တည်ဆောက်ပါမယ်။
Machine Learning ရဲ့ အကျိုးရှိတဲ့ လက်တွေ့အသုံးချမှုတစ်ခုက အကြံပေးစနစ်တွေ တည်ဆောက်ခြင်းဖြစ်ပြီး ဒီနေ့မှာ သင်အဲဒီလမ်းကြောင်းကို စတင်နိုင်ပါပြီ!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 အပေါ်ကပုံကို နှိပ်ပြီး ဗီဒီယိုကြည့်ပါ: Jen Looper က အစားအစာအမျိုးအစားဒေတာကို အသုံးပြုကာ ဝက်ဘ်အက်ပ်တစ်ခု တည်ဆောက်နေသည်
## [သင်ခန်းစာမတိုင်မီ မေးခွန်း](https://ff-quizzes.netlify.app/en/ml/)
ဒီသင်ခန်းစာမှာ သင်လေ့လာရမယ့်အရာတွေက:
- မော်ဒယ်တစ်ခုကို တည်ဆောက်ပြီး Onnx မော်ဒယ်အဖြစ် သိမ်းဆည်းနည်း
- Netron ကို အသုံးပြုကာ မော်ဒယ်ကို စစ်ဆေးနည်း
- မော်ဒယ်ကို ဝက်ဘ်အက်ပ်မှာ အသုံးပြုကာ အတိအကျခန့်မှန်းနည်း
## မော်ဒယ်ကို တည်ဆောက်ပါ
Applied ML စနစ်တွေကို တည်ဆောက်ခြင်းဟာ ဒီနည်းပညာတွေကို သင့်လုပ်ငန်းစနစ်တွေမှာ အသုံးချဖို့ အရေးကြီးတဲ့အပိုင်းတစ်ခုဖြစ်ပါတယ်။ Onnx ကို အသုံးပြုကာ သင့်ဝက်ဘ်အက်ပ်တွေမှာ မော်ဒယ်တွေကို အသုံးပြုနိုင်ပါတယ် (လိုအပ်ပါက offline context မှာလည်း အသုံးပြုနိုင်ပါတယ်)။
[အတိတ်သင်ခန်းစာ](../../3-Web-App/1-Web-App/README.md) မှာ သင်ဟာ UFO တွေကို ရှာဖွေတဲ့ Regression မော်ဒယ်တစ်ခုကို တည်ဆောက်ပြီး "pickle" လုပ်ကာ Flask app မှာ အသုံးပြုခဲ့ပါတယ်။ ဒီ architecture ဟာ သိထားသင့်တဲ့ အသုံးဝင်တဲ့နည်းလမ်းတစ်ခုဖြစ်ပေမယ့် Python အပြည့်အစုံ stack app ဖြစ်ပြီး သင့်လိုအပ်ချက်တွေမှာ JavaScript application ကို အသုံးပြုဖို့လိုအပ်နိုင်ပါတယ်။
ဒီသင်ခန်းစာမှာ JavaScript-based စနစ်တစ်ခုကို အတိအကျခန့်မှန်းဖို့ တည်ဆောက်နိုင်ပါတယ်။ ဒါပေမယ့် အရင်ဆုံး မော်ဒယ်တစ်ခုကို လေ့ကျင့်ပြီး Onnx နဲ့ အသုံးပြုနိုင်ဖို့ ပြောင်းလဲရပါမယ်။
## လေ့ကျင့်မှု - အမျိုးအစားခွဲခြားမော်ဒယ်ကို လေ့ကျင့်ပါ
အရင်ဆုံး သင်အသုံးပြုခဲ့တဲ့ အစားအစာအမျိုးအစားဒေတာစနစ်ကို အသုံးပြုကာ အမျိုးအစားခွဲခြားမော်ဒယ်တစ်ခုကို လေ့ကျင့်ပါ။
1. အသုံးဝင်တဲ့ library တွေကို အရင် Import လုပ်ပါ:
```python
!pip install skl2onnx
import pandas as pd
```
'[skl2onnx](https://onnx.ai/sklearn-onnx/)' ကို သင့် Scikit-learn မော်ဒယ်ကို Onnx format ပြောင်းဖို့ အထောက်အကူပြုပါမယ်။
1. အတိတ်သင်ခန်းစာတွေမှာ လုပ်ခဲ့သလို `read_csv()` ကို အသုံးပြုကာ သင့်ဒေတာကို အလုပ်လုပ်ပါ:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. မလိုအပ်တဲ့ အတန်းနှစ်ခုကို ဖယ်ရှားပြီး ကျန်ရှိတဲ့ဒေတာကို 'X' အဖြစ် သိမ်းဆည်းပါ:
```python
X = data.iloc[:,2:]
X.head()
```
1. Label တွေကို 'y' အဖြစ် သိမ်းဆည်းပါ:
```python
y = data[['cuisine']]
y.head()
```
### လေ့ကျင့်မှုစနစ်ကို စတင်ပါ
'SVC' library ကို အသုံးပြုပါမယ်၊ accuracy ကောင်းပါတယ်။
1. Scikit-learn မှ သင့် library တွေကို Import လုပ်ပါ:
```python
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
```
1. လေ့ကျင့်မှုနှင့် စမ်းသပ်မှု set တွေကို ခွဲခြားပါ:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. အတိတ်သင်ခန်းစာမှာ လုပ်ခဲ့သလို SVC Classification မော်ဒယ်တစ်ခုကို တည်ဆောက်ပါ:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. အခုတော့ သင့်မော်ဒယ်ကို စမ်းသပ်ပြီး `predict()` ကို ခေါ်ပါ:
```python
y_pred = model.predict(X_test)
```
1. Classification report ကို print ထုတ်ပြီး မော်ဒယ်ရဲ့ အရည်အသွေးကို စစ်ဆေးပါ:
```python
print(classification_report(y_test,y_pred))
```
အရင်မြင်ခဲ့သလို accuracy ကောင်းပါတယ်:
```output
precision recall f1-score support
chinese 0.72 0.69 0.70 257
indian 0.91 0.87 0.89 243
japanese 0.79 0.77 0.78 239
korean 0.83 0.79 0.81 236
thai 0.72 0.84 0.78 224
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
### သင့်မော်ဒယ်ကို Onnx format ပြောင်းပါ
Tensor နံပါတ်ကို သင့်တော်အောင် ပြောင်းလဲပါ။ ဒီဒေတာစနစ်မှာ 380 ခုသော အစားအစာပါဝင်ပြီး `FloatTensorType` မှာ အဲဒီနံပါတ်ကို မှတ်သားရပါမယ်။
1. Tensor နံပါတ် 380 ကို အသုံးပြုကာ ပြောင်းပါ:
```python
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('float_input', FloatTensorType([None, 380]))]
options = {id(model): {'nocl': True, 'zipmap': False}}
```
1. **model.onnx** အဖြစ် ဖိုင်အနေနဲ့ သိမ်းဆည်းပါ:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> မှတ်ချက် - သင့် conversion script မှာ [options](https://onnx.ai/sklearn-onnx/parameterized.html) တွေကို pass လုပ်နိုင်ပါတယ်။ ဒီအခါမှာ 'nocl' ကို True အဖြစ်၊ 'zipmap' ကို False အဖြစ် pass လုပ်ထားပါတယ်။ Classification မော်ဒယ်ဖြစ်တဲ့အတွက် ZipMap ကို ဖယ်ရှားနိုင်ပါတယ် (မလိုအပ်ပါဘူး)။ `nocl` ဟာ မော်ဒယ်မှာ class အချက်အလက်ကို ထည့်သွင်းခြင်းကို ရည်ညွှန်းပါတယ်။ `nocl` ကို 'True' အဖြစ် သတ်မှတ်ခြင်းအားဖြင့် မော်ဒယ်ရဲ့အရွယ်အစားကို လျှော့ချနိုင်ပါတယ်။
Notebook အားလုံးကို run လုပ်ပြီး Onnx မော်ဒယ်တစ်ခုကို တည်ဆောက်ကာ ဒီ folder မှာ သိမ်းဆည်းပါ။
## သင့်မော်ဒယ်ကို ကြည့်ပါ
Onnx မော်ဒယ်တွေဟာ Visual Studio Code မှာ မမြင်နိုင်ပါဘူး၊ ဒါပေမယ့် မော်ဒယ်တစ်ခုကို visualization လုပ်ဖို့ အခမဲ့ software ကောင်းတစ်ခုရှိပါတယ်။ [Netron](https://github.com/lutzroeder/Netron) ကို download လုပ်ပြီး သင့် model.onnx ဖိုင်ကို ဖွင့်ပါ။ 380 inputs နဲ့ classifier ပါဝင်တဲ့ သင့်မော်ဒယ်ကို ရိုးရှင်းစွာ visualization လုပ်နိုင်ပါတယ်:

Netron ဟာ သင့်မော်ဒယ်တွေကို ကြည့်ရှုဖို့ အထောက်အကူပြုတဲ့ tool တစ်ခုဖြစ်ပါတယ်။
## အကြံပေးဝက်ဘ်အက်ပ် တည်ဆောက်ပါ
သင့်မော်ဒယ်ကို ဝက်ဘ်အက်ပ်မှာ တိုက်ရိုက်အသုံးပြုနိုင်ပါတယ်။ ဒီ architecture ဟာ local မှာ run လုပ်နိုင်ပြီး offline မှာလည်း အသုံးပြုနိုင်ပါတယ်။ သင့် `model.onnx` ဖိုင်ကို သိမ်းဆည်းထားတဲ့ folder မှာ `index.html` ဖိုင်တစ်ခုကို စတင်ဖန်တီးပါ။
1. ဒီဖိုင် _index.html_ မှာ အောက်ပါ markup ကို ထည့်ပါ:
```html