# ساخت یک اپلیکیشن وب توصیهگر غذا
در این درس، شما یک مدل دستهبندی با استفاده از تکنیکهایی که در درسهای قبلی یاد گرفتهاید و با استفاده از دیتاست خوشمزه غذاها که در این سری استفاده شده است، خواهید ساخت. علاوه بر این، یک اپلیکیشن وب کوچک برای استفاده از مدل ذخیرهشده خواهید ساخت که از محیط اجرایی وب Onnx بهره میبرد.
یکی از کاربردهای عملی بسیار مفید یادگیری ماشین، ساخت سیستمهای توصیهگر است، و شما امروز میتوانید اولین قدم در این مسیر را بردارید!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 روی تصویر بالا کلیک کنید تا ویدئو را ببینید: جن لوپر یک اپلیکیشن وب با استفاده از دادههای دستهبندیشده غذاها میسازد
## [پیشزمینه درس](https://ff-quizzes.netlify.app/en/ml/)
در این درس یاد خواهید گرفت:
- چگونه یک مدل بسازید و آن را به عنوان مدل Onnx ذخیره کنید
- چگونه از Netron برای بررسی مدل استفاده کنید
- چگونه از مدل خود در یک اپلیکیشن وب برای استنتاج استفاده کنید
## ساخت مدل
ساخت سیستمهای کاربردی یادگیری ماشین بخش مهمی از استفاده از این تکنولوژیها در سیستمهای کسبوکار شماست. شما میتوانید مدلها را در اپلیکیشنهای وب خود استفاده کنید (و در صورت نیاز حتی در حالت آفلاین از آنها بهره ببرید) با استفاده از Onnx.
در یک [درس قبلی](../../3-Web-App/1-Web-App/README.md)، شما یک مدل رگرسیون درباره مشاهدههای UFO ساختید، آن را "pickle" کردید و در یک اپلیکیشن Flask استفاده کردید. در حالی که این معماری بسیار مفید است، یک اپلیکیشن کامل پایتون است و ممکن است نیازهای شما شامل استفاده از یک اپلیکیشن جاوااسکریپت باشد.
در این درس، شما میتوانید یک سیستم پایه جاوااسکریپت برای استنتاج بسازید. اما ابتدا باید یک مدل آموزش دهید و آن را برای استفاده با 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. مدل را ایجاد کنید و به عنوان فایل **model.onnx** ذخیره کنید:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> توجه داشته باشید که میتوانید [گزینهها](https://onnx.ai/sklearn-onnx/parameterized.html) را در اسکریپت تبدیل خود وارد کنید. در این مورد، ما 'nocl' را به True و 'zipmap' را به False تنظیم کردیم. از آنجا که این یک مدل دستهبندی است، شما گزینه حذف ZipMap را دارید که لیستی از دیکشنریها تولید میکند (ضروری نیست). `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