# Введение в классификацию В этих четырех уроках вы изучите один из основных аспектов классического машинного обучения — _классификацию_. Мы рассмотрим использование различных алгоритмов классификации с набором данных о всех замечательных кухнях Азии и Индии. Надеюсь, вы проголодались! ![щепотка!](../../../../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 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). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.