# Xây dựng ứng dụng web gợi ý món ăn
Trong bài học này, bạn sẽ xây dựng một mô hình phân loại bằng cách sử dụng một số kỹ thuật đã học trong các bài trước và với bộ dữ liệu món ăn ngon được sử dụng xuyên suốt loạt bài này. Ngoài ra, bạn sẽ xây dựng một ứng dụng web nhỏ để sử dụng mô hình đã lưu, tận dụng runtime web của Onnx.
Một trong những ứng dụng thực tiễn hữu ích nhất của học máy là xây dựng hệ thống gợi ý, và hôm nay bạn có thể bắt đầu bước đầu tiên trong hướng đi này!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 Nhấn vào hình ảnh trên để xem video: Jen Looper xây dựng một ứng dụng web sử dụng dữ liệu món ăn đã phân loại
## [Câu hỏi trước bài học](https://ff-quizzes.netlify.app/en/ml/)
Trong bài học này, bạn sẽ học:
- Cách xây dựng mô hình và lưu nó dưới dạng mô hình Onnx
- Cách sử dụng Netron để kiểm tra mô hình
- Cách sử dụng mô hình của bạn trong ứng dụng web để suy luận
## Xây dựng mô hình của bạn
Xây dựng hệ thống học máy ứng dụng là một phần quan trọng trong việc tận dụng các công nghệ này cho hệ thống kinh doanh của bạn. Bạn có thể sử dụng các mô hình trong ứng dụng web của mình (và do đó sử dụng chúng trong ngữ cảnh offline nếu cần) bằng cách sử dụng Onnx.
Trong một [bài học trước](../../3-Web-App/1-Web-App/README.md), bạn đã xây dựng một mô hình hồi quy về các lần nhìn thấy UFO, "pickled" nó, và sử dụng nó trong một ứng dụng Flask. Mặc dù kiến trúc này rất hữu ích để biết, nhưng nó là một ứng dụng Python full-stack, và yêu cầu của bạn có thể bao gồm việc sử dụng một ứng dụng JavaScript.
Trong bài học này, bạn có thể xây dựng một hệ thống cơ bản dựa trên JavaScript để suy luận. Tuy nhiên, trước tiên bạn cần huấn luyện một mô hình và chuyển đổi nó để sử dụng với Onnx.
## Bài tập - huấn luyện mô hình phân loại
Đầu tiên, huấn luyện một mô hình phân loại bằng cách sử dụng bộ dữ liệu món ăn đã được làm sạch mà chúng ta đã sử dụng.
1. Bắt đầu bằng cách nhập các thư viện hữu ích:
```python
!pip install skl2onnx
import pandas as pd
```
Bạn cần '[skl2onnx](https://onnx.ai/sklearn-onnx/)' để giúp chuyển đổi mô hình Scikit-learn của bạn sang định dạng Onnx.
1. Sau đó, làm việc với dữ liệu của bạn theo cách bạn đã làm trong các bài học trước, bằng cách đọc tệp CSV sử dụng `read_csv()`:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. Loại bỏ hai cột không cần thiết đầu tiên và lưu dữ liệu còn lại dưới dạng 'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. Lưu các nhãn dưới dạng 'y':
```python
y = data[['cuisine']]
y.head()
```
### Bắt đầu quy trình huấn luyện
Chúng ta sẽ sử dụng thư viện 'SVC' với độ chính xác tốt.
1. Nhập các thư viện phù hợp từ 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. Tách tập huấn luyện và tập kiểm tra:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. Xây dựng mô hình phân loại SVC như bạn đã làm trong bài học trước:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. Bây giờ, kiểm tra mô hình của bạn bằng cách gọi `predict()`:
```python
y_pred = model.predict(X_test)
```
1. In báo cáo phân loại để kiểm tra chất lượng mô hình:
```python
print(classification_report(y_test,y_pred))
```
Như chúng ta đã thấy trước đó, độ chính xác là tốt:
```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
```
### Chuyển đổi mô hình của bạn sang Onnx
Đảm bảo thực hiện chuyển đổi với số Tensor phù hợp. Bộ dữ liệu này có 380 nguyên liệu được liệt kê, vì vậy bạn cần ghi chú số đó trong `FloatTensorType`:
1. Chuyển đổi sử dụng số tensor là 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. Tạo tệp onx và lưu dưới dạng tệp **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> Lưu ý, bạn có thể truyền vào [tùy chọn](https://onnx.ai/sklearn-onnx/parameterized.html) trong script chuyển đổi của mình. Trong trường hợp này, chúng ta đã truyền vào 'nocl' là True và 'zipmap' là False. Vì đây là mô hình phân loại, bạn có tùy chọn loại bỏ ZipMap, thứ tạo ra danh sách các từ điển (không cần thiết). `nocl` đề cập đến thông tin lớp được bao gồm trong mô hình. Giảm kích thước mô hình của bạn bằng cách đặt `nocl` là 'True'.
Chạy toàn bộ notebook bây giờ sẽ xây dựng một mô hình Onnx và lưu nó vào thư mục này.
## Xem mô hình của bạn
Các mô hình Onnx không hiển thị rõ ràng trong Visual Studio Code, nhưng có một phần mềm miễn phí rất tốt mà nhiều nhà nghiên cứu sử dụng để trực quan hóa mô hình nhằm đảm bảo rằng nó được xây dựng đúng cách. Tải xuống [Netron](https://github.com/lutzroeder/Netron) và mở tệp model.onnx của bạn. Bạn có thể thấy mô hình đơn giản của mình được trực quan hóa, với 380 đầu vào và bộ phân loại được liệt kê:

Netron là một công cụ hữu ích để xem các mô hình của bạn.
Bây giờ bạn đã sẵn sàng sử dụng mô hình thú vị này trong một ứng dụng web. Hãy xây dựng một ứng dụng sẽ hữu ích khi bạn nhìn vào tủ lạnh của mình và cố gắng tìm ra sự kết hợp của các nguyên liệu còn lại mà bạn có thể sử dụng để nấu một món ăn cụ thể, như được xác định bởi mô hình của bạn.
## Xây dựng ứng dụng web gợi ý
Bạn có thể sử dụng mô hình của mình trực tiếp trong một ứng dụng web. Kiến trúc này cũng cho phép bạn chạy nó cục bộ và thậm chí offline nếu cần. Bắt đầu bằng cách tạo tệp `index.html` trong cùng thư mục nơi bạn lưu tệp `model.onnx`.
1. Trong tệp này _index.html_, thêm đoạn mã sau:
```html