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/ru/4-Classification/1-Introduction/README.md

313 lines
22 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-06T08:35:36+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "ru"
}
-->
# Введение в классификацию
В этих четырех уроках вы изучите один из основных аспектов классического машинного обучения — _классификацию_. Мы рассмотрим использование различных алгоритмов классификации с набором данных о всех замечательных кухнях Азии и Индии. Надеюсь, вы проголодались!
![щепотка!](../../../../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) — "Техника синтетического увеличения меньшинства" — чтобы сбалансировать их.
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). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.