# بناء تطبيق ويب لتوصية المأكولات
في هذه الدرس، ستقوم ببناء نموذج تصنيف باستخدام بعض التقنيات التي تعلمتها في الدروس السابقة ومع مجموعة بيانات المأكولات الشهية التي تم استخدامها طوال هذه السلسلة. بالإضافة إلى ذلك، ستقوم ببناء تطبيق ويب صغير لاستخدام النموذج المحفوظ، مستفيدًا من تشغيل الويب الخاص بـ Onnx.
واحدة من أكثر الاستخدامات العملية المفيدة لتعلم الآلة هي بناء أنظمة التوصية، ويمكنك اتخاذ الخطوة الأولى في هذا الاتجاه اليوم!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: جين لوبر تبني تطبيق ويب باستخدام بيانات المأكولات المصنفة
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
في هذا الدرس ستتعلم:
- كيفية بناء نموذج وحفظه كـ Onnx model
- كيفية استخدام Netron لفحص النموذج
- كيفية استخدام النموذج الخاص بك في تطبيق ويب للاستنتاج
## بناء النموذج الخاص بك
بناء أنظمة تعلم الآلة التطبيقية هو جزء مهم من الاستفادة من هذه التقنيات في أنظمة الأعمال الخاصة بك. يمكنك استخدام النماذج داخل تطبيقات الويب الخاصة بك (وبالتالي استخدامها في سياق غير متصل إذا لزم الأمر) باستخدام Onnx.
في [درس سابق](../../3-Web-App/1-Web-App/README.md)، قمت ببناء نموذج انحدار حول مشاهدات UFO، وقمت بـ "تخزينه"، واستخدمته في تطبيق 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
تأكد من إجراء التحويل باستخدام الرقم الصحيح للتنسور. تحتوي هذه المجموعة من البيانات على 380 مكونًا مدرجًا، لذا تحتاج إلى تدوين هذا الرقم في `FloatTensorType`:
1. قم بالتحويل باستخدام رقم تنسور 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())
```
> ملاحظة، يمكنك تمرير [خيارات](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