# Створення веб-додатку для рекомендацій кухні
У цьому уроці ви створите модель класифікації, використовуючи деякі техніки, які ви вивчили в попередніх уроках, а також смачний набір даних про кухні, який використовувався протягом цієї серії. Крім того, ви створите невеликий веб-додаток для використання збереженої моделі, використовуючи веб-рантайм 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) ви створили модель регресії про спостереження НЛО, "запакували" її та використали у додатку 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. Створіть файл **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