# Erstellen einer Web-App zur Empfehlung von Küchen
In dieser Lektion wirst du ein Klassifikationsmodell erstellen, indem du einige der Techniken anwendest, die du in den vorherigen Lektionen gelernt hast, und mit dem köstlichen Küchendatensatz arbeitest, der in dieser Serie verwendet wurde. Außerdem wirst du eine kleine Web-App entwickeln, um ein gespeichertes Modell zu nutzen, indem du die Web-Laufzeit von Onnx einsetzt.
Eine der nützlichsten praktischen Anwendungen des maschinellen Lernens ist der Aufbau von Empfehlungssystemen, und du kannst heute den ersten Schritt in diese Richtung machen!
[](https://youtu.be/17wdM9AHMfg "Angewandtes ML")
> 🎥 Klicke auf das Bild oben für ein Video: Jen Looper erstellt eine Web-App mit klassifizierten Küchendaten
## [Quiz vor der Lektion](https://ff-quizzes.netlify.app/en/ml/)
In dieser Lektion wirst du lernen:
- Wie man ein Modell erstellt und es als Onnx-Modell speichert
- Wie man Netron verwendet, um das Modell zu inspizieren
- Wie man das Modell in einer Web-App für Inferenz verwendet
## Erstelle dein Modell
Der Aufbau angewandter ML-Systeme ist ein wichtiger Teil der Nutzung dieser Technologien für Geschäftssysteme. Du kannst Modelle innerhalb deiner Webanwendungen verwenden (und sie somit bei Bedarf offline nutzen), indem du Onnx einsetzt.
In einer [vorherigen Lektion](../../3-Web-App/1-Web-App/README.md) hast du ein Regressionsmodell über UFO-Sichtungen erstellt, es "eingemacht" und in einer Flask-App verwendet. Obwohl diese Architektur sehr nützlich ist, handelt es sich um eine vollständige Python-App, und deine Anforderungen könnten die Nutzung einer JavaScript-Anwendung umfassen.
In dieser Lektion kannst du ein einfaches JavaScript-basiertes System für Inferenz erstellen. Zunächst musst du jedoch ein Modell trainieren und es für die Verwendung mit Onnx konvertieren.
## Übung - Klassifikationsmodell trainieren
Trainiere zunächst ein Klassifikationsmodell mit dem bereinigten Küchendatensatz, den wir verwendet haben.
1. Beginne mit dem Import nützlicher Bibliotheken:
```python
!pip install skl2onnx
import pandas as pd
```
Du benötigst '[skl2onnx](https://onnx.ai/sklearn-onnx/)', um dein Scikit-learn-Modell in das Onnx-Format zu konvertieren.
1. Arbeite dann mit deinen Daten wie in den vorherigen Lektionen, indem du eine CSV-Datei mit `read_csv()` liest:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. Entferne die ersten beiden unnötigen Spalten und speichere die verbleibenden Daten als 'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. Speichere die Labels als 'y':
```python
y = data[['cuisine']]
y.head()
```
### Beginne die Trainingsroutine
Wir werden die 'SVC'-Bibliothek verwenden, die eine gute Genauigkeit bietet.
1. Importiere die entsprechenden Bibliotheken aus 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. Teile die Trainings- und Testdaten:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. Erstelle ein SVC-Klassifikationsmodell wie in der vorherigen Lektion:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. Teste nun dein Modell, indem du `predict()` aufrufst:
```python
y_pred = model.predict(X_test)
```
1. Gib einen Klassifikationsbericht aus, um die Qualität des Modells zu überprüfen:
```python
print(classification_report(y_test,y_pred))
```
Wie wir zuvor gesehen haben, ist die Genauigkeit gut:
```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
```
### Konvertiere dein Modell in Onnx
Stelle sicher, dass die Konvertierung mit der richtigen Tensor-Anzahl erfolgt. Dieser Datensatz enthält 380 aufgelistete Zutaten, daher musst du diese Zahl in `FloatTensorType` angeben:
1. Konvertiere mit einer Tensor-Anzahl von 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. Erstelle die Onnx-Datei und speichere sie als **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> Hinweis: Du kannst [Optionen](https://onnx.ai/sklearn-onnx/parameterized.html) in deinem Konvertierungsskript übergeben. In diesem Fall haben wir 'nocl' auf True und 'zipmap' auf False gesetzt. Da es sich um ein Klassifikationsmodell handelt, hast du die Möglichkeit, ZipMap zu entfernen, das eine Liste von Wörterbüchern erzeugt (nicht erforderlich). `nocl` bezieht sich darauf, ob Klasseninformationen im Modell enthalten sind. Reduziere die Größe deines Modells, indem du `nocl` auf 'True' setzt.
Wenn du das gesamte Notebook ausführst, wird ein Onnx-Modell erstellt und in diesem Ordner gespeichert.
## Betrachte dein Modell
Onnx-Modelle sind in Visual Studio Code nicht sehr sichtbar, aber es gibt eine sehr gute kostenlose Software, die viele Forscher verwenden, um das Modell zu visualisieren und sicherzustellen, dass es korrekt erstellt wurde. Lade [Netron](https://github.com/lutzroeder/Netron) herunter und öffne deine model.onnx-Datei. Du kannst dein einfaches Modell visualisiert sehen, mit seinen 380 Eingaben und dem Klassifikator:

Netron ist ein hilfreiches Tool, um deine Modelle zu betrachten.
Jetzt bist du bereit, dieses praktische Modell in einer Web-App zu verwenden. Lass uns eine App erstellen, die nützlich ist, wenn du in deinen Kühlschrank schaust und herausfinden möchtest, welche Kombination deiner übrig gebliebenen Zutaten du verwenden kannst, um eine bestimmte Küche zu kochen, wie von deinem Modell bestimmt.
## Erstelle eine Empfehlungs-Webanwendung
Du kannst dein Modell direkt in einer Web-App verwenden. Diese Architektur ermöglicht es dir auch, sie lokal und sogar offline auszuführen, falls erforderlich. Beginne mit der Erstellung einer `index.html`-Datei im selben Ordner, in dem du deine `model.onnx`-Datei gespeichert hast.
1. Füge in dieser Datei _index.html_ das folgende Markup hinzu:
```html