# 建立一個美食推薦網頁應用程式
在本課程中,您將使用之前課程中學到的一些技術,並結合本系列中使用的美食數據集,建立一個分類模型。此外,您還將建立一個小型網頁應用程式,使用已保存的模型,並利用 Onnx 的網頁運行時進行推論。
機器學習最實用的應用之一就是建立推薦系統,而今天您可以邁出這個方向的第一步!
[](https://youtu.be/17wdM9AHMfg "應用機器學習")
> 🎥 點擊上方圖片觀看影片:Jen Looper 使用分類的美食數據建立了一個網頁應用程式
## [課前測驗](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/25/)
在本課程中,您將學到:
- 如何建立模型並將其保存為 Onnx 模型
- 如何使用 Netron 檢視模型
- 如何在網頁應用程式中使用您的模型進行推論
## 建立您的模型
建立應用型機器學習系統是將這些技術應用於業務系統的重要部分。通過使用 Onnx,您可以在網頁應用程式中使用模型(因此在需要時也可以在離線環境中使用)。
在[之前的課程](../../3-Web-App/1-Web-App/README.md)中,您建立了一個關於 UFO 目擊事件的回歸模型,將其“pickle”保存,並在 Flask 應用程式中使用。雖然這種架構非常有用,但它是一個全棧的 Python 應用程式,而您的需求可能包括使用 JavaScript 應用程式。
在本課程中,您可以建立一個基於 JavaScript 的基本推論系統。不過,首先您需要訓練一個模型並將其轉換為 Onnx 格式。
## 練習 - 訓練分類模型
首先,使用我們之前使用的清理過的美食數據集訓練一個分類模型。
1. 首先匯入有用的函式庫:
```python
!pip install skl2onnx
import pandas as pd
```
您需要使用 '[skl2onnx](https://onnx.ai/sklearn-onnx/)' 來幫助將 Scikit-learn 模型轉換為 Onnx 格式。
1. 然後,像之前課程中一樣,使用 `read_csv()` 讀取 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. 使用 380 的 Tensor 數進行轉換。
```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',可以減小模型的大小。
執行整個 notebook 現在將建立一個 Onnx 模型並將其保存到此文件夾中。
## 檢視您的模型
Onnx 模型在 Visual Studio Code 中不太容易檢視,但有一個非常好的免費軟體,許多研究人員用來可視化模型以確保其正確構建。下載 [Netron](https://github.com/lutzroeder/Netron) 並打開您的 model.onnx 文件。您可以看到您的簡單模型被可視化,包含其 380 個輸入和分類器:

Netron 是一個檢視模型的有用工具。
現在,您已準備好在網頁應用程式中使用這個有趣的模型。讓我們建立一個應用程式,當您查看冰箱並試圖弄清楚可以用哪些剩餘食材來烹飪某種美食時,這個應用程式將派上用場。
## 建立推薦網頁應用程式
您可以直接在網頁應用程式中使用您的模型。這種架構還允許您在本地甚至離線運行它。首先,在您存儲 `model.onnx` 文件的同一文件夾中創建一個 `index.html` 文件。
1. 在此文件 _index.html_ 中,添加以下標記:
```html