# Rakenna ruokasuositusverkkosovellus
Tässä oppitunnissa rakennat luokittelumallin käyttäen joitakin aiemmissa oppitunneissa opittuja tekniikoita sekä herkullista ruokadatasettiä, jota on käytetty läpi tämän sarjan. Lisäksi rakennat pienen verkkosovelluksen, joka hyödyntää tallennettua mallia Onnxin verkkokäyttöliittymän avulla.
Yksi koneoppimisen hyödyllisimmistä käytännön sovelluksista on suositusjärjestelmien rakentaminen, ja voit ottaa ensimmäisen askeleen siihen suuntaan jo tänään!
[](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 Klikkaa yllä olevaa kuvaa nähdäksesi videon: Jen Looper rakentaa verkkosovelluksen luokitellun ruokadatan avulla
## [Ennakkokysely](https://ff-quizzes.netlify.app/en/ml/)
Tässä oppitunnissa opit:
- Kuinka rakentaa malli ja tallentaa se Onnx-muodossa
- Kuinka käyttää Netronia mallin tarkasteluun
- Kuinka käyttää malliasi verkkosovelluksessa ennustamiseen
## Rakenna mallisi
Soveltuvien koneoppimisjärjestelmien rakentaminen on tärkeä osa näiden teknologioiden hyödyntämistä liiketoimintajärjestelmissäsi. Voit käyttää malleja verkkosovelluksissasi (ja siten käyttää niitä myös offline-tilassa tarvittaessa) Onnxin avulla.
[Edellisessä oppitunnissa](../../3-Web-App/1-Web-App/README.md) rakensit regressiomallin UFO-havainnoista, "picklasit" sen ja käytit sitä Flask-sovelluksessa. Vaikka tämä arkkitehtuuri on erittäin hyödyllinen, se on täysimittainen Python-sovellus, ja vaatimuksesi saattavat sisältää JavaScript-sovelluksen käytön.
Tässä oppitunnissa voit rakentaa yksinkertaisen JavaScript-pohjaisen järjestelmän ennustamista varten. Ensin sinun täytyy kuitenkin kouluttaa malli ja muuntaa se Onnxin käyttöön.
## Harjoitus - kouluta luokittelumalli
Ensiksi kouluta luokittelumalli käyttäen puhdistettua ruokadatasettiä, jota olemme käyttäneet.
1. Aloita tuomalla hyödylliset kirjastot:
```python
!pip install skl2onnx
import pandas as pd
```
Tarvitset '[skl2onnx](https://onnx.ai/sklearn-onnx/)'-kirjaston, joka auttaa muuntamaan Scikit-learn-mallisi Onnx-muotoon.
1. Työskentele datasi kanssa samalla tavalla kuin aiemmissa oppitunneissa, lukemalla CSV-tiedosto `read_csv()`-funktiolla:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. Poista kaksi ensimmäistä tarpeetonta saraketta ja tallenna jäljelle jäävä data nimellä 'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. Tallenna etiketit nimellä 'y':
```python
y = data[['cuisine']]
y.head()
```
### Aloita koulutusrutiini
Käytämme 'SVC'-kirjastoa, joka tarjoaa hyvän tarkkuuden.
1. Tuo tarvittavat kirjastot Scikit-learnista:
```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. Jaa data koulutus- ja testijoukkoihin:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. Rakenna SVC-luokittelumalli kuten teit edellisessä oppitunnissa:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. Testaa malliasi kutsumalla `predict()`:
```python
y_pred = model.predict(X_test)
```
1. Tulosta luokitteluraportti tarkistaaksesi mallin laadun:
```python
print(classification_report(y_test,y_pred))
```
Kuten aiemmin näimme, tarkkuus on hyvä:
```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
```
### Muunna mallisi Onnx-muotoon
Varmista, että muunnat mallin oikealla tensorimäärällä. Tässä datasetissä on 380 ainesosaa, joten sinun täytyy merkitä tämä määrä `FloatTensorType`-parametriin:
1. Muunna käyttäen tensorimäärää 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. Luo onx-tiedosto ja tallenna se nimellä **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> Huomaa, että voit välittää [asetuksia](https://onnx.ai/sklearn-onnx/parameterized.html) muunnosskriptiisi. Tässä tapauksessa välitimme 'nocl'-asetuksen arvoksi True ja 'zipmap'-asetuksen arvoksi False. Koska tämä on luokittelumalli, sinulla on mahdollisuus poistaa ZipMap, joka tuottaa listan sanakirjoja (ei tarpeellinen). `nocl` viittaa luokkainformaation sisällyttämiseen malliin. Pienennä mallisi kokoa asettamalla `nocl` arvoksi 'True'.
Kun suoritat koko notebookin, se rakentaa Onnx-mallin ja tallentaa sen tähän kansioon.
## Tarkastele malliasi
Onnx-mallit eivät ole kovin näkyviä Visual Studio Codessa, mutta on olemassa erittäin hyvä ilmainen ohjelmisto, jota monet tutkijat käyttävät mallien visualisointiin varmistaakseen, että ne on rakennettu oikein. Lataa [Netron](https://github.com/lutzroeder/Netron) ja avaa model.onnx-tiedostosi. Voit nähdä yksinkertaisen mallisi visualisoituna, jossa on 380 syötettä ja luokittelija listattuna:

Netron on hyödyllinen työkalu mallien tarkasteluun.
Nyt olet valmis käyttämään tätä siistiä mallia verkkosovelluksessa. Rakennetaan sovellus, joka on kätevä, kun katsot jääkaappiasi ja yrität selvittää, mitä yhdistelmää jäljellä olevista ainesosista voit käyttää tietyn keittiön ruokalajin valmistamiseen mallisi perusteella.
## Rakenna suositusverkkosovellus
Voit käyttää malliasi suoraan verkkosovelluksessa. Tämä arkkitehtuuri mahdollistaa sen käytön paikallisesti ja jopa offline-tilassa tarvittaessa. Aloita luomalla `index.html`-tiedosto samaan kansioon, jossa tallensit `model.onnx`-tiedostosi.
1. Lisää tähän tiedostoon _index.html_ seuraava merkintä:
```html