You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/sr/4-Classification/1-Introduction/README.md

313 lines
21 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
"translation_date": "2025-09-05T13:16:59+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "sr"
}
-->
# Увод у класификацију
У овим четири лекције, истражићете основни аспект класичног машинског учења - _класификацију_. Проћи ћемо кроз употребу различитих алгоритама класификације са скупом података о свим сјајним кухињама Азије и Индије. Надамо се да сте гладни!
![само мало!](../../../../4-Classification/1-Introduction/images/pinch.png)
> Прославите паназијске кухиње у овим лекцијама! Слика: [Џен Лупер](https://twitter.com/jenlooper)
Класификација је облик [надгледаног учења](https://wikipedia.org/wiki/Supervised_learning) који има много заједничког са техникама регресије. Ако је машинско учење усмерено на предвиђање вредности или имена ствари користећи скупове података, онда класификација генерално спада у две групе: _бинарна класификација_ и _вишекласна класификација_.
[![Увод у класификацију](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Увод у класификацију")
> 🎥 Кликните на слику изнад за видео: Џон Гуттаг са МИТ-а представља класификацију
Запамтите:
- **Линеарна регресија** вам је помогла да предвидите односе између променљивих и направите тачна предвиђања о томе где ће нова тачка података пасти у односу на ту линију. На пример, могли сте да предвидите оја ће цена бундеве бити у септембру у односу на децембар_.
- **Логистичка регресија** вам је помогла да откријете "бинарне категорије": на овом ценовном нивоу, а ли је ова бундева наранџаста или није_?
Класификација користи различите алгоритме за одређивање других начина за утврђивање етикете или класе тачке података. Радимо са овим подацима о кухињама да бисмо видели да ли, посматрајући групу састојака, можемо утврдити њихово порекло.
## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/)
> ### [Ова лекција је доступна на R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### Увод
Класификација је једна од основних активности истраживача машинског учења и научника за податке. Од основне класификације бинарне вредности ("да ли је овај имејл спам или није?"), до сложене класификације слика и сегментације користећи компјутерски вид, увек је корисно бити у могућности да сортирате податке у класе и постављате питања о њима.
Научно речено, ваш метод класификације креира предиктивни модел који вам омогућава да мапирате однос између улазних променљивих и излазних променљивих.
![бинарна vs. вишекласна класификација](../../../../4-Classification/1-Introduction/images/binary-multiclass.png)
> Бинарни и вишекласни проблеми за алгоритме класификације. Инфографика: [Џен Лупер](https://twitter.com/jenlooper)
Пре него што започнемо процес чишћења наших података, њихове визуализације и припреме за задатке машинског учења, научимо мало о различитим начинима на које машинско учење може бити коришћено за класификацију података.
Изведена из [статистике](https://wikipedia.org/wiki/Statistical_classification), класификација користећи класично машинско учење користи карактеристике, као што су `пушач`, `тежина` и `године` да би утврдила ероватноћу развоја X болести_. Као техника надгледаног учења слична вежбама регресије које сте раније радили, ваши подаци су означени, а алгоритми машинског учења користе те ознаке да класификују и предвиђају класе (или 'карактеристике') скупа података и додељују их групи или исходу.
✅ Замислите скуп података о кухињама. Шта би модел вишекласне класификације могао да одговори? Шта би модел бинарне класификације могао да одговори? Шта ако желите да утврдите да ли је одређена кухиња вероватно користила пискавицу? Шта ако желите да видите да ли, уз поклон торбе пуне звезданог аниса, артичока, карфиола и рена, можете направити типично индијско јело?
[![Луде мистериозне корпе](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Луде мистериозне корпе")
> 🎥 Кликните на слику изнад за видео. Цела премиса емисије 'Chopped' је 'мистериозна корпа' где кувари морају да направе јело од насумичног избора састојака. Сигурно би модел машинског учења помогао!
## Здраво 'класификаторе'
Питање које желимо да поставимо о овом скупу података о кухињама је заправо **вишекласно питање**, јер имамо неколико потенцијалних националних кухиња са којима радимо. Узимајући групу састојака, којој од ових многих класа ће подаци припадати?
Scikit-learn нуди неколико различитих алгоритама за класификацију података, у зависности од врсте проблема који желите да решите. У наредне две лекције, научићете о неколико ових алгоритама.
## Вежба - очистите и избалансирајте своје податке
Први задатак, пре него што започнете овај пројекат, је да очистите и **избалансирате** своје податке како бисте добили боље резултате. Почните са празним _notebook.ipynb_ фајлом у корену овог директоријума.
Прва ствар коју треба инсталирати је [imblearn](https://imbalanced-learn.org/stable/). Ово је Scikit-learn пакет који ће вам омогућити боље балансирање података (о овом задатку ћете научити више за тренутак).
1. Да бисте инсталирали `imblearn`, покрените `pip install`, овако:
```python
pip install imblearn
```
1. Увезите пакете који су вам потребни за увоз ваших података и њихову визуализацију, такође увезите `SMOTE` из `imblearn`.
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
```
Сада сте спремни да увезете податке.
1. Следећи задатак је да увезете податке:
```python
df = pd.read_csv('../data/cuisines.csv')
```
Коришћење `read_csv()` ће прочитати садржај csv фајла _cusines.csv_ и поставити га у променљиву `df`.
1. Проверите облик података:
```python
df.head()
```
Првих пет редова изгледа овако:
```output
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
```
1. Добијте информације о овим подацима позивајући `info()`:
```python
df.info()
```
Ваш излаз изгледа овако:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Columns: 385 entries, Unnamed: 0 to zucchini
dtypes: int64(384), object(1)
memory usage: 7.2+ MB
```
## Вежба - учење о кухињама
Сада рад постаје занимљивији. Хајде да откријемо расподелу података по кухињама.
1. Прикажите податке као траке позивајући `barh()`:
```python
df.cuisine.value_counts().plot.barh()
```
![расподела података о кухињама](../../../../4-Classification/1-Introduction/images/cuisine-dist.png)
Постоји ограничен број кухиња, али расподела података је неравномерна. Можете то поправити! Пре него што то урадите, истражите мало више.
1. Сазнајте колико података је доступно по кухињи и испишите их:
```python
thai_df = df[(df.cuisine == "thai")]
japanese_df = df[(df.cuisine == "japanese")]
chinese_df = df[(df.cuisine == "chinese")]
indian_df = df[(df.cuisine == "indian")]
korean_df = df[(df.cuisine == "korean")]
print(f'thai df: {thai_df.shape}')
print(f'japanese df: {japanese_df.shape}')
print(f'chinese df: {chinese_df.shape}')
print(f'indian df: {indian_df.shape}')
print(f'korean df: {korean_df.shape}')
```
излаз изгледа овако:
```output
thai df: (289, 385)
japanese df: (320, 385)
chinese df: (442, 385)
indian df: (598, 385)
korean df: (799, 385)
```
## Откривање састојака
Сада можете дубље истражити податке и сазнати који су типични састојци по кухињи. Требало би да очистите поновљене податке који стварају конфузију између кухиња, па хајде да научимо о овом проблему.
1. Направите функцију `create_ingredient()` у Python-у за креирање dataframe-а састојака. Ова функција ће започети уклањањем некорисне колоне и сортирањем састојака по њиховом броју:
```python
def create_ingredient_df(df):
ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
inplace=False)
return ingredient_df
```
Сада можете користити ту функцију да добијете идеју о десет најпопуларнијих састојака по кухињи.
1. Позовите `create_ingredient()` и прикажите резултате позивајући `barh()`:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![тајландска](../../../../4-Classification/1-Introduction/images/thai.png)
1. Урадите исто за јапанске податке:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![јапанска](../../../../4-Classification/1-Introduction/images/japanese.png)
1. Сада за кинеске састојке:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![кинеска](../../../../4-Classification/1-Introduction/images/chinese.png)
1. Прикажите индијске састојке:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![индијска](../../../../4-Classification/1-Introduction/images/indian.png)
1. На крају, прикажите корејске састојке:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![корејска](../../../../4-Classification/1-Introduction/images/korean.png)
1. Сада уклоните најчешће састојке који стварају конфузију између различитих кухиња, позивајући `drop()`:
Сви воле пиринач, бели лук и ђумбир!
```python
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()
```
## Балансирање скупа података
Сада када сте очистили податке, користите [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Техника синтетичког прекомерног узорковања мањинских класа" - да их избалансирате.
1. Позовите `fit_resample()`, ова стратегија генерише нове узорке интерполацијом.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
Балансирањем ваших података, добићете боље резултате приликом класификације. Размислите о бинарној класификацији. Ако је већина ваших података једна класа, модел машинског учења ће чешће предвиђати ту класу, само зато што има више података за њу. Балансирање података уклања ову неравнотежу.
1. Сада можете проверити број ознака по састојку:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
Ваш излаз изгледа овако:
```output
new label count: korean 799
chinese 799
indian 799
japanese 799
thai 799
Name: cuisine, dtype: int64
old label count: korean 799
indian 598
chinese 442
japanese 320
thai 289
Name: cuisine, dtype: int64
```
Подаци су лепи, чисти, избалансирани и веома укусни!
1. Последњи корак је да сачувате ваше избалансиране податке, укључујући ознаке и карактеристике, у нови dataframe који можете извозити у фајл:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. Можете још једном погледати податке користећи `transformed_df.head()` и `transformed_df.info()`. Сачувајте копију ових података за употребу у будућим лекцијама:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
Овај свеж CSV сада се може наћи у коренском директоријуму података.
---
## 🚀Изазов
Овај курикулум садржи неколико занимљивих скупова података. Претражите директоријуме `data` и видите да ли неки садрже скупове података који би били погодни за бинарну или вишекласну класификацију? Која питања бисте поставили о овом скупу података?
## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостално учење
Истражите SMOTE API. За које случајеве употребе је најбоље коришћен? Које проблеме решава?
## Задатак
[Истражите методе класификације](assignment.md)
---
**Одрицање од одговорности**:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.