# Sukurkite virtuvės rekomendacijų žiniatinklio programą
Šioje pamokoje sukursite klasifikavimo modelį, naudodami kai kurias technikas, kurias išmokote ankstesnėse pamokose, ir skanų virtuvės duomenų rinkinį, naudotą visoje šioje serijoje. Be to, sukursite nedidelę žiniatinklio programą, kuri naudos išsaugotą modelį, pasitelkdama Onnx žiniatinklio vykdymo aplinką.
Vienas iš naudingiausių praktinių mašininio mokymosi pritaikymų yra rekomendacijų sistemų kūrimas, ir šiandien galite žengti pirmąjį žingsnį šia kryptimi!
[](https://youtu.be/17wdM9AHMfg "Taikomas ML")
> 🎥 Spustelėkite aukščiau esančią nuotrauką, kad peržiūrėtumėte vaizdo įrašą: Jen Looper kuria žiniatinklio programą, naudodama klasifikuotus virtuvės duomenis
## [Prieš pamoką - testas](https://ff-quizzes.netlify.app/en/ml/)
Šioje pamokoje išmoksite:
- Kaip sukurti modelį ir išsaugoti jį kaip Onnx modelį
- Kaip naudoti Netron modelio peržiūrai
- Kaip naudoti savo modelį žiniatinklio programoje prognozėms
## Sukurkite savo modelį
Taikomosios ML sistemos kūrimas yra svarbi šių technologijų pritaikymo jūsų verslo sistemoms dalis. Modelius galite naudoti savo žiniatinklio programose (taigi, jei reikia, juos galima naudoti ir neprisijungus) pasitelkdami Onnx.
[Ankstesnėje pamokoje](../../3-Web-App/1-Web-App/README.md) sukūrėte regresijos modelį apie NSO stebėjimus, „marinuotą“ jį ir panaudojote Flask programoje. Nors ši architektūra yra labai naudinga, tai yra pilnos apimties Python programa, o jūsų reikalavimai gali apimti JavaScript programos naudojimą.
Šioje pamokoje galite sukurti pagrindinę JavaScript pagrįstą sistemą prognozėms. Tačiau pirmiausia turite išmokyti modelį ir konvertuoti jį naudoti su Onnx.
## Užduotis - išmokykite klasifikavimo modelį
Pirmiausia išmokykite klasifikavimo modelį, naudodami išvalytą virtuvės duomenų rinkinį, kurį naudojome.
1. Pradėkite importuodami naudingas bibliotekas:
```python
!pip install skl2onnx
import pandas as pd
```
Jums reikės '[skl2onnx](https://onnx.ai/sklearn-onnx/)', kad padėtų konvertuoti jūsų Scikit-learn modelį į Onnx formatą.
1. Tada dirbkite su savo duomenimis taip, kaip darėte ankstesnėse pamokose, skaitydami CSV failą naudodami `read_csv()`:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. Pašalinkite pirmas dvi nereikalingas stulpelius ir išsaugokite likusius duomenis kaip 'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. Išsaugokite etiketes kaip 'y':
```python
y = data[['cuisine']]
y.head()
```
### Pradėkite mokymo procesą
Naudosime 'SVC' biblioteką, kuri pasižymi geru tikslumu.
1. Importuokite tinkamas bibliotekas iš 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. Atskirkite mokymo ir testavimo rinkinius:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. Sukurkite SVC klasifikavimo modelį, kaip darėte ankstesnėje pamokoje:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. Dabar išbandykite savo modelį, iškviesdami `predict()`:
```python
y_pred = model.predict(X_test)
```
1. Išveskite klasifikavimo ataskaitą, kad patikrintumėte modelio kokybę:
```python
print(classification_report(y_test,y_pred))
```
Kaip matėme anksčiau, tikslumas yra geras:
```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
```
### Konvertuokite savo modelį į Onnx
Įsitikinkite, kad konvertavimas atliekamas su tinkamu tensorių skaičiumi. Šiame duomenų rinkinyje yra 380 ingredientų, todėl turite nurodyti šį skaičių `FloatTensorType`:
1. Konvertuokite, naudodami tensorių skaičių 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. Sukurkite onx ir išsaugokite kaip failą **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> Pastaba: galite perduoti [parinktis](https://onnx.ai/sklearn-onnx/parameterized.html) savo konvertavimo skripte. Šiuo atveju mes nustatėme 'nocl' kaip True ir 'zipmap' kaip False. Kadangi tai yra klasifikavimo modelis, turite galimybę pašalinti ZipMap, kuris sukuria žodynų sąrašą (nereikalinga). `nocl` reiškia, kad klasės informacija įtraukta į modelį. Sumažinkite savo modelio dydį, nustatydami `nocl` kaip 'True'.
Vykdydami visą užrašų knygelę dabar sukursite Onnx modelį ir išsaugosite jį šiame aplanke.
## Peržiūrėkite savo modelį
Onnx modeliai nėra labai matomi Visual Studio Code, tačiau yra labai gera nemokama programinė įranga, kurią daugelis tyrėjų naudoja modelio vizualizavimui, kad įsitikintų, jog jis tinkamai sukurtas. Atsisiųskite [Netron](https://github.com/lutzroeder/Netron) ir atidarykite savo model.onnx failą. Galite pamatyti savo paprastą modelį, vizualizuotą su 380 įvestimis ir klasifikatoriumi:

Netron yra naudingas įrankis modelių peržiūrai.
Dabar esate pasiruošę naudoti šį puikų modelį žiniatinklio programoje. Sukurkime programą, kuri bus naudinga, kai žiūrėsite į savo šaldytuvą ir bandysite suprasti, kokią kombinaciją likusių ingredientų galite naudoti, kad pagamintumėte tam tikrą virtuvės patiekalą, kaip nustatyta jūsų modeliu.
## Sukurkite rekomendacijų žiniatinklio programą
Galite tiesiogiai naudoti savo modelį žiniatinklio programoje. Ši architektūra taip pat leidžia ją paleisti vietoje ir net neprisijungus, jei reikia. Pradėkite kurdami `index.html` failą tame pačiame aplanke, kuriame išsaugojote savo `model.onnx` failą.
1. Šiame faile _index.html_ pridėkite šį žymėjimą:
```html