# สร้างเว็บแอปแนะนำเมนูอาหาร
ในบทเรียนนี้ คุณจะสร้างโมเดลการจำแนกประเภทโดยใช้เทคนิคที่คุณได้เรียนรู้ในบทเรียนก่อนหน้า พร้อมกับชุดข้อมูลเมนูอาหารที่น่ารับประทานซึ่งใช้ตลอดซีรีส์นี้ นอกจากนี้ คุณจะสร้างเว็บแอปเล็กๆ เพื่อใช้งานโมเดลที่บันทึกไว้ โดยใช้ Onnx Web Runtime
หนึ่งในประโยชน์ที่สำคัญของการเรียนรู้ด้วยเครื่องคือการสร้างระบบแนะนำ และวันนี้คุณสามารถเริ่มต้นในเส้นทางนั้นได้!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: Jen Looper สร้างเว็บแอปโดยใช้ข้อมูลเมนูอาหารที่จำแนกไว้
## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/)
ในบทเรียนนี้คุณจะได้เรียนรู้:
- วิธีสร้างโมเดลและบันทึกเป็นโมเดล Onnx
- วิธีใช้ Netron เพื่อตรวจสอบโมเดล
- วิธีใช้โมเดลในเว็บแอปเพื่อการคาดการณ์
## สร้างโมเดลของคุณ
การสร้างระบบ ML ที่ใช้งานได้จริงเป็นส่วนสำคัญในการนำเทคโนโลยีเหล่านี้มาใช้ในระบบธุรกิจของคุณ คุณสามารถใช้โมเดลในแอปพลิเคชันเว็บของคุณ (และใช้งานในบริบทออฟไลน์หากจำเป็น) โดยใช้ Onnx
ใน [บทเรียนก่อนหน้า](../../3-Web-App/1-Web-App/README.md) คุณได้สร้างโมเดล Regression เกี่ยวกับการพบเห็น UFO และ "pickled" โมเดลนั้นเพื่อใช้งานในแอป Flask แม้ว่าโครงสร้างนี้จะมีประโยชน์มาก แต่เป็นแอป Python แบบเต็มรูปแบบ และความต้องการของคุณอาจรวมถึงการใช้แอปพลิเคชัน JavaScript
ในบทเรียนนี้ คุณสามารถสร้างระบบพื้นฐานที่ใช้ JavaScript สำหรับการคาดการณ์ได้ แต่ก่อนอื่น คุณต้องฝึกโมเดลและแปลงมันเพื่อใช้งานกับ Onnx
## แบบฝึกหัด - ฝึกโมเดลการจำแนกประเภท
เริ่มต้นด้วยการฝึกโมเดลการจำแนกประเภทโดยใช้ชุดข้อมูลเมนูอาหารที่ทำความสะอาดแล้วที่เราใช้ก่อนหน้านี้
1. เริ่มต้นด้วยการนำเข้าห้องสมุดที่มีประโยชน์:
```python
!pip install skl2onnx
import pandas as pd
```
คุณต้องใช้ '[skl2onnx](https://onnx.ai/sklearn-onnx/)' เพื่อช่วยแปลงโมเดล Scikit-learn ของคุณเป็นรูปแบบ Onnx
1. จากนั้นทำงานกับข้อมูลในลักษณะเดียวกับที่คุณทำในบทเรียนก่อนหน้า โดยการอ่านไฟล์ CSV ด้วย `read_csv()`:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. ลบสองคอลัมน์แรกที่ไม่จำเป็นออก และบันทึกข้อมูลที่เหลือเป็น 'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. บันทึกป้ายกำกับเป็น 'y':
```python
y = data[['cuisine']]
y.head()
```
### เริ่มต้นกระบวนการฝึกโมเดล
เราจะใช้ห้องสมุด 'SVC' ซึ่งมีความแม่นยำดี
1. นำเข้าห้องสมุดที่เหมาะสมจาก Scikit-learn:
```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. แยกชุดข้อมูลการฝึกและการทดสอบ:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. สร้างโมเดลการจำแนกประเภท SVC เหมือนที่คุณทำในบทเรียนก่อนหน้า:
```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. พิมพ์รายงานการจำแนกประเภทเพื่อตรวจสอบคุณภาพของโมเดล:
```python
print(classification_report(y_test,y_pred))
```
ดังที่เราเห็นก่อนหน้านี้ ความแม่นยำดี:
```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
ตรวจสอบให้แน่ใจว่าการแปลงใช้จำนวน 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. สร้างไฟล์ onx และบันทึกเป็น **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> หมายเหตุ คุณสามารถส่ง [options](https://onnx.ai/sklearn-onnx/parameterized.html) ในสคริปต์การแปลงของคุณได้ ในกรณีนี้ เราได้ตั้งค่า 'nocl' เป็น True และ 'zipmap' เป็น False เนื่องจากนี่เป็นโมเดลการจำแนกประเภท คุณมีตัวเลือกในการลบ ZipMap ซึ่งสร้างรายการของ dictionary (ไม่จำเป็น) `nocl` หมายถึงข้อมูลคลาสที่รวมอยู่ในโมเดล ลดขนาดโมเดลของคุณโดยตั้งค่า `nocl` เป็น 'True'
การรันโน้ตบุ๊กทั้งหมดจะสร้างโมเดล Onnx และบันทึกไว้ในโฟลเดอร์นี้
## ดูโมเดลของคุณ
โมเดล Onnx ไม่สามารถมองเห็นได้ชัดเจนใน Visual Studio Code แต่มีซอฟต์แวร์ฟรีที่ดีมากที่นักวิจัยหลายคนใช้เพื่อดูโมเดลเพื่อให้แน่ใจว่าสร้างขึ้นอย่างถูกต้อง ดาวน์โหลด [Netron](https://github.com/lutzroeder/Netron) และเปิดไฟล์ model.onnx ของคุณ คุณจะเห็นโมเดลง่ายๆ ของคุณที่มี 380 อินพุตและตัวจำแนกประเภท:

Netron เป็นเครื่องมือที่มีประโยชน์ในการดูโมเดลของคุณ
ตอนนี้คุณพร้อมที่จะใช้โมเดลที่น่าสนใจนี้ในเว็บแอปแล้ว มาสร้างแอปที่มีประโยชน์เมื่อคุณมองเข้าไปในตู้เย็นและพยายามหาว่าส่วนผสมที่เหลืออยู่สามารถใช้ทำอาหารประเภทใดได้บ้างตามที่โมเดลของคุณกำหนด
## สร้างเว็บแอปแนะนำเมนูอาหาร
คุณสามารถใช้โมเดลของคุณโดยตรงในเว็บแอป โครงสร้างนี้ยังช่วยให้คุณรันมันในเครื่องและแม้กระทั่งออฟไลน์หากจำเป็น เริ่มต้นด้วยการสร้างไฟล์ `index.html` ในโฟลเดอร์เดียวกับที่คุณบันทึกไฟล์ `model.onnx`
1. ในไฟล์นี้ _index.html_ เพิ่มมาร์กอัปต่อไปนี้:
```html