# 建立一個美食推薦網頁應用程式
在這節課中,你將使用之前課程中學到的一些技術,並利用這個系列中使用的美味美食數據集,來建立一個分類模型。此外,你還將建立一個小型網頁應用程式,使用已保存的模型,並利用 Onnx 的網頁運行時環境。
機器學習最實用的應用之一就是建立推薦系統,而今天你可以邁出這個方向的第一步!
[](https://youtu.be/17wdM9AHMfg "應用機器學習")
> 🎥 點擊上方圖片觀看影片:Jen Looper 使用分類的美食數據建立了一個網頁應用程式
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
在這節課中,你將學到:
- 如何建立模型並將其保存為 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 格式
確保使用正確的張量數進行轉換。這個數據集列出了 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 是一個查看模型的有用工具。
現在你已經準備好在網頁應用程式中使用這個簡單的模型了。讓我們建立一個應用程式,當你查看冰箱並試圖找出哪些剩餘食材可以用來烹飪某種美食時,這個應用程式會派上用場。
## 建立推薦網頁應用程式
你可以直接在網頁應用程式中使用你的模型。這種架構還允許你在本地甚至離線運行它。首先,在存儲 `model.onnx` 文件的同一文件夾中創建一個 `index.html` 文件。
1. 在這個文件 _index.html_ 中,添加以下標記:
```html