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/uk/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:18:41+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "uk"
}
-->
# Вступ до класифікації
У цих чотирьох уроках ви дослідите основний аспект класичного машинного навчання — _класифікацію_. Ми розглянемо використання різних алгоритмів класифікації на основі набору даних про всі чудові кухні Азії та Індії. Сподіваємося, ви голодні!
![щіпка смаку!](../../../../4-Classification/1-Introduction/images/pinch.png)
> Святкуйте паназійські кухні в цих уроках! Зображення від [Jen Looper](https://twitter.com/jenlooper)
Класифікація — це форма [навчання з учителем](https://wikipedia.org/wiki/Supervised_learning), яка має багато спільного з техніками регресії. Якщо машинне навчання полягає у прогнозуванні значень або назв для речей за допомогою наборів даних, то класифікація зазвичай поділяється на дві групи: _бінарна класифікація_ та _багатокласова класифікація_.
[![Вступ до класифікації](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Вступ до класифікації")
> 🎥 Натисніть на зображення вище, щоб переглянути відео: Джон Гуттаг з MIT представляє класифікацію
Запам’ятайте:
- **Лінійна регресія** допомогла вам передбачити взаємозв’язки між змінними та зробити точні прогнози щодо того, де нова точка даних потрапить у відношенні до цієї лінії. Наприклад, ви могли б передбачити _яка ціна гарбуза буде у вересні проти грудня_.
- **Логістична регресія** допомогла вам виявити "бінарні категорії": за цією ціною _чи цей гарбуз помаранчевий чи не помаранчевий_?
Класифікація використовує різні алгоритми для визначення інших способів визначення мітки або класу точки даних. Давайте попрацюємо з цими даними про кухні, щоб побачити, чи можемо ми, спостерігаючи за групою інгредієнтів, визначити її кухню походження.
## [Тест перед лекцією](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)
> Бінарні та багатокласові задачі для алгоритмів класифікації. Інфографіка від [Jen Looper](https://twitter.com/jenlooper)
Перш ніж розпочати процес очищення наших даних, їх візуалізації та підготовки до завдань машинного навчання, давайте трохи дізнаємося про різні способи використання машинного навчання для класифікації даних.
Походячи з [статистики](https://wikipedia.org/wiki/Statistical_classification), класифікація за допомогою класичного машинного навчання використовує ознаки, такі як `smoker`, `weight` і `age`, щоб визначити _ймовірність розвитку 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, щоб створити датафрейм інгредієнтів. Ця функція почне з видалення непотрібного стовпця та сортування інгредієнтів за їх кількістю:
```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) — "Synthetic Minority Over-sampling Technique" — для їх балансування.
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. Останній крок — зберегти збалансовані дані, включаючи мітки та ознаки, у новий датафрейм, який можна експортувати у файл:
```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/)
## Огляд і самостійне навчання
Досліджуйте API SMOTE. Для яких випадків використання він найкраще підходить? Які проблеми він вирішує?
## Завдання
[Досліджуйте методи класифікації](assignment.md)
---
**Відмова від відповідальності**:
Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.