|
|
# Класификатори кухиња 2
|
|
|
|
|
|
У овом другом часу о класификацији, истражићете више начина за класификацију нумеричких података. Такође ћете научити које су последице избора једног класификатора уместо другог.
|
|
|
|
|
|
## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
### Предуслови
|
|
|
|
|
|
Претпоставка је да сте завршили претходне лекције и да имате очишћени скуп података у вашем фолдеру `data` под именом _cleaned_cuisines.csv_ у корену овог фолдера са 4 лекције.
|
|
|
|
|
|
### Припрема
|
|
|
|
|
|
Учитао сам ваш фајл _notebook.ipynb_ са очишћеним скупом података и поделио га у X и y dataframe-ове, спремне за процес прављења модела.
|
|
|
|
|
|
## Мапа класификације
|
|
|
|
|
|
Претходно сте учили о разним опцијама при класификацији података помоћу Microsoft-овог сажетка. Scikit-learn нуди сличан, али детаљнији сажетак који даље помаже да се сузи избор естиматора (други израз за класификаторе):
|
|
|
|
|
|

|
|
|
> Савет: [посетите ову мапу онлајн](https://scikit-learn.org/stable/tutorial/machine_learning_map/) и кликните на пут да бисте прочитали документацију.
|
|
|
|
|
|
### План
|
|
|
|
|
|
Ова мапа је веома корисна када имате јасан увид у своје податке, јер можете „ходати“ по њеним стазама до одлуке:
|
|
|
|
|
|
- Имамо >50 узорака
|
|
|
- Желимо да предвидимо категорију
|
|
|
- Имамо означене податке
|
|
|
- Имамо мање од 100K узорака
|
|
|
- ✨ Можемо изабрати Linear SVC
|
|
|
- Ако то не функционише, пошто имамо нумеричке податке
|
|
|
- Можемо пробати ✨ KNeighbors класификатор
|
|
|
- Ако то не ради, пробајте ✨ SVC и ✨ Ensemble класификаторе
|
|
|
|
|
|
Ово је врло користан пут који треба следити.
|
|
|
|
|
|
## Вежба - подели податке
|
|
|
|
|
|
Пратећи овај пут, требало би да почнемо тако што ћемо импортовати неке библиотеке за коришћење.
|
|
|
|
|
|
1. Импортујте потребне библиотеке:
|
|
|
|
|
|
```python
|
|
|
from sklearn.neighbors import KNeighborsClassifier
|
|
|
from sklearn.linear_model import LogisticRegression
|
|
|
from sklearn.svm import SVC
|
|
|
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
|
|
|
from sklearn.model_selection import train_test_split, cross_val_score
|
|
|
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
|
|
|
import numpy as np
|
|
|
```
|
|
|
|
|
|
1. Поделите своје тренирајуће и тест податке:
|
|
|
|
|
|
```python
|
|
|
X_train, X_test, y_train, y_test = train_test_split(cuisines_features_df, cuisines_label_df, test_size=0.3)
|
|
|
```
|
|
|
|
|
|
## Linear SVC класификатор
|
|
|
|
|
|
Support-Vector clustering (SVC) припада породици Support-Vector машина за машинско учење (сазнајте више о њима испод). У овој методи можете одабрати „кернел“ да бисте одлучили како да кластерирате етикете. Параметар „C“ односи се на „регуларизацију“ која регулише утицај параметара. Кернел може бити један од [више](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); овде смо га подесили на „linear“ да бисмо искористили линеарни SVC. Веројатност је подразумевано „false“; овде смо је подесили на „true“ да бисмо сакупили процене вероватноће. Случајно стање подешено је на '0' како бисмо „мешали“ податке да добијемо вероватноће.
|
|
|
|
|
|
### Вежба - примени линеарни SVC
|
|
|
|
|
|
Почните тако што ћете креирати низ класификатора. Постепено ћете додавати у овај низ како тестирањем будемо напредовали.
|
|
|
|
|
|
1. Почните са Linear SVC:
|
|
|
|
|
|
```python
|
|
|
C = 10
|
|
|
# Направите различите класификаторе.
|
|
|
classifiers = {
|
|
|
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
2. Тренирајте свој модел користећи Linear SVC и испишите извештај:
|
|
|
|
|
|
```python
|
|
|
n_classifiers = len(classifiers)
|
|
|
|
|
|
for index, (name, classifier) in enumerate(classifiers.items()):
|
|
|
classifier.fit(X_train, np.ravel(y_train))
|
|
|
|
|
|
y_pred = classifier.predict(X_test)
|
|
|
accuracy = accuracy_score(y_test, y_pred)
|
|
|
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
|
|
|
print(classification_report(y_test,y_pred))
|
|
|
```
|
|
|
|
|
|
Резултат је прилично добар:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for Linear SVC: 78.6%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.71 0.67 0.69 242
|
|
|
indian 0.88 0.86 0.87 234
|
|
|
japanese 0.79 0.74 0.76 254
|
|
|
korean 0.85 0.81 0.83 242
|
|
|
thai 0.71 0.86 0.78 227
|
|
|
|
|
|
accuracy 0.79 1199
|
|
|
macro avg 0.79 0.79 0.79 1199
|
|
|
weighted avg 0.79 0.79 0.79 1199
|
|
|
```
|
|
|
|
|
|
## K-Neighbors класификатор
|
|
|
|
|
|
K-Neighbors припада породици „neighbors“ метода машинског учења, које се могу користити и за надгледано и за ненадгледано учење. У овој методи, дефинисан број тачака се креира и подаци се прикупљају око тих тачака тако да се могу предвидети генерализоване ознаке за податке.
|
|
|
|
|
|
### Вежба - примени K-Neighbors класификатор
|
|
|
|
|
|
Претходни класификатор је био добар и добро је радио са подацима, али можда можемо добити бољу прецизност. Испробајте K-Neighbors класификатор.
|
|
|
|
|
|
1. Додајте један ред у свој низ класификатора (додајте зарез након Linear SVC ставке):
|
|
|
|
|
|
```python
|
|
|
'KNN classifier': KNeighborsClassifier(C),
|
|
|
```
|
|
|
|
|
|
Резултат је нешто лошији:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for KNN classifier: 73.8%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.64 0.67 0.66 242
|
|
|
indian 0.86 0.78 0.82 234
|
|
|
japanese 0.66 0.83 0.74 254
|
|
|
korean 0.94 0.58 0.72 242
|
|
|
thai 0.71 0.82 0.76 227
|
|
|
|
|
|
accuracy 0.74 1199
|
|
|
macro avg 0.76 0.74 0.74 1199
|
|
|
weighted avg 0.76 0.74 0.74 1199
|
|
|
```
|
|
|
|
|
|
✅ Сазнајте о [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
|
|
|
|
|
|
## Support Vector класификатор
|
|
|
|
|
|
Support-Vector класификатори припадају породици [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) машинског учења која се користи за задатке класификације и регресије. SVM-ови „пројектују тренинг примере у простор“ како би максимизовали растојање између две категорије. Накнадни подаци се пројектују у овај простор тако да се може предвидети њихова категорија.
|
|
|
|
|
|
### Вежба - примени Support Vector класификатор
|
|
|
|
|
|
Хајде да пробамо мало бољу прецизност са Support Vector класификатором.
|
|
|
|
|
|
1. Додајте зарез након K-Neighbors ставке, а затим додајте овај ред:
|
|
|
|
|
|
```python
|
|
|
'SVC': SVC(),
|
|
|
```
|
|
|
|
|
|
Резултат је веома добар!
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for SVC: 83.2%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.79 0.74 0.76 242
|
|
|
indian 0.88 0.90 0.89 234
|
|
|
japanese 0.87 0.81 0.84 254
|
|
|
korean 0.91 0.82 0.86 242
|
|
|
thai 0.74 0.90 0.81 227
|
|
|
|
|
|
accuracy 0.83 1199
|
|
|
macro avg 0.84 0.83 0.83 1199
|
|
|
weighted avg 0.84 0.83 0.83 1199
|
|
|
```
|
|
|
|
|
|
✅ Сазнајте о [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm)
|
|
|
|
|
|
## Ensemble класификатори
|
|
|
|
|
|
Хајде да пратимо пут до самог краја, иако је претходни тест био врло добар. Испробајмо неке 'Ensemble класификаторе', конкретно Random Forest и AdaBoost:
|
|
|
|
|
|
```python
|
|
|
'RFST': RandomForestClassifier(n_estimators=100),
|
|
|
'ADA': AdaBoostClassifier(n_estimators=100)
|
|
|
```
|
|
|
|
|
|
Резултат је врло добар, посебно за Random Forest:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for RFST: 84.5%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.80 0.77 0.78 242
|
|
|
indian 0.89 0.92 0.90 234
|
|
|
japanese 0.86 0.84 0.85 254
|
|
|
korean 0.88 0.83 0.85 242
|
|
|
thai 0.80 0.87 0.83 227
|
|
|
|
|
|
accuracy 0.84 1199
|
|
|
macro avg 0.85 0.85 0.84 1199
|
|
|
weighted avg 0.85 0.84 0.84 1199
|
|
|
|
|
|
Accuracy (train) for ADA: 72.4%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.64 0.49 0.56 242
|
|
|
indian 0.91 0.83 0.87 234
|
|
|
japanese 0.68 0.69 0.69 254
|
|
|
korean 0.73 0.79 0.76 242
|
|
|
thai 0.67 0.83 0.74 227
|
|
|
|
|
|
accuracy 0.72 1199
|
|
|
macro avg 0.73 0.73 0.72 1199
|
|
|
weighted avg 0.73 0.72 0.72 1199
|
|
|
```
|
|
|
|
|
|
✅ Сазнајте о [Ensemble класификаторима](https://scikit-learn.org/stable/modules/ensemble.html)
|
|
|
|
|
|
Ова метода машинског учења „спаја предвиђања неколико базних естиматора“ да побољша квалитет модела. У нашем примеру користили смо Random Trees и AdaBoost.
|
|
|
|
|
|
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), метода просека, гради „шуму“ „одлучујућих стабала“ која су утицана случајношћу како би се избегло претеривање. Параметар n_estimators подешен је на број стабала.
|
|
|
|
|
|
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) прилагођава класификатор скупу података, а затим прилагођава копије тог класификатора на исти скуп података. Фокусира се на тежине неправилно класификованих предмета и подешава прилагођавање за следећи класификатор да исправи грешке.
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀Изазов
|
|
|
|
|
|
Свака од ових техника има велики број параметара које можете подешавати. Истражите подразумеване параметре сваке и размислите шта би подешавање тих параметара значило за квалитет модела.
|
|
|
|
|
|
## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
## Преглед и самостално учење
|
|
|
|
|
|
У овим лекцијама има доста терминологије, зато одвојите минут да прегледате [овој списак](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) корисних појмова!
|
|
|
|
|
|
## Домашћи задатак
|
|
|
|
|
|
[Играње са параметрима](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
|
**Одрицање од одговорности**:
|
|
|
Овај документ је преведен коришћењем сервиса за превођење уз помоћ вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да превод буде што прецизнији, молимо имајте у виду да аутоматизовани преводи могу садржати грешке или нетачности. Изворни документ на његовом оригиналном језику треба сматрати коначним и ауторитативним извором. За критичне информације препоручује се стручно људско превођење. Не преузимамо одговорност за било какве неспоразуме или нетачне интерпретације настале употребом овог превода.
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |