# 料理推薦ウェブアプリを作成する
このレッスンでは、これまでのレッスンで学んだ技術を活用し、美味しい料理データセットを使用して分類モデルを構築します。また、保存したモデルを使用する小さなウェブアプリを作成し、Onnxのウェブランタイムを活用します。
機械学習の最も実用的な用途の1つは推薦システムの構築です。今日はその第一歩を踏み出しましょう!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 上の画像をクリックすると動画が再生されます: Jen Looperが分類された料理データを使用してウェブアプリを構築します
## [講義前クイズ](https://ff-quizzes.netlify.app/en/ml/)
このレッスンで学ぶこと:
- モデルを構築し、Onnxモデルとして保存する方法
- 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
```
Scikit-learnモデルをOnnx形式に変換するために、'[skl2onnx](https://onnx.ai/sklearn-onnx/)'が必要です。
1. 前のレッスンと同様に、`read_csv()`を使用してCSVファイルを読み込みます:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. 最初の2つの不要な列を削除し、残りのデータを「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はモデルを確認するための便利なツールです。
これで、この便利なモデルをウェブアプリで使用する準備が整いました。冷蔵庫を見て、残り物の材料の組み合わせでどの料理を作れるかをモデルで判断するアプリを作りましょう。
## 推薦ウェブアプリを構築する
モデルを直接ウェブアプリで使用できます。このアーキテクチャにより、ローカルで実行したり、必要に応じてオフラインでも使用できます。`model.onnx`ファイルを保存したのと同じフォルダに`index.html`ファイルを作成することから始めます。
1. このファイル _index.html_ に以下のマークアップを追加します:
```html