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

22 KiB

Введение в классификацию

В этих четырех уроках вы изучите один из основных аспектов классического машинного обучения — классификацию. Мы рассмотрим использование различных алгоритмов классификации с набором данных о всех замечательных кухнях Азии и Индии. Надеюсь, вы проголодались!

щепотка!

Отпразднуйте паназиатские кухни в этих уроках! Изображение от Jen Looper

Классификация — это форма обучения с учителем, которая имеет много общего с методами регрессии. Если машинное обучение заключается в прогнозировании значений или имен объектов с использованием наборов данных, то классификация обычно делится на две группы: бинарная классификация и многоклассовая классификация.

Введение в классификацию

🎥 Нажмите на изображение выше, чтобы посмотреть видео: Джон Гуттаг из MIT представляет классификацию

Запомните:

  • Линейная регрессия помогала вам предсказывать отношения между переменными и делать точные прогнозы о том, где новый элемент данных окажется относительно этой линии. Например, вы могли предсказать, какая цена будет у тыквы в сентябре по сравнению с декабрем.
  • Логистическая регрессия помогала вам обнаруживать "бинарные категории": при данной цене, оранжевая ли тыква или не оранжевая?

Классификация использует различные алгоритмы для определения других способов присвоения метки или класса элементу данных. Давайте поработаем с этими данными о кухнях, чтобы выяснить, можем ли мы, наблюдая за группой ингредиентов, определить их происхождение.

Тест перед лекцией

Этот урок доступен на R!

Введение

Классификация — это одна из основных задач исследователя машинного обучения и специалиста по данным. От простой классификации бинарного значения ("является ли это письмо спамом или нет?") до сложной классификации изображений и сегментации с использованием компьютерного зрения — всегда полезно уметь сортировать данные по классам и задавать им вопросы.

Если выразить процесс более научным языком, ваш метод классификации создает предсказательную модель, которая позволяет вам сопоставить отношения между входными переменными и выходными переменными.

бинарная vs. многоклассовая классификация

Бинарные и многоклассовые задачи для обработки алгоритмами классификации. Инфографика от Jen Looper

Прежде чем начать процесс очистки данных, их визуализации и подготовки к задачам машинного обучения, давайте немного узнаем о различных способах использования машинного обучения для классификации данных.

Происходя из статистики, классификация с использованием классического машинного обучения использует признаки, такие как smoker, weight и age, чтобы определить вероятность развития X заболевания. Как техника обучения с учителем, похожая на выполненные вами ранее упражнения по регрессии, ваши данные имеют метки, и алгоритмы машинного обучения используют эти метки для классификации и прогнозирования классов (или 'признаков') набора данных и присваивания их группе или результату.

Представьте себе набор данных о кухнях. На какие вопросы мог бы ответить многоклассовый модель? А бинарный? Что если вы захотите определить, использует ли данная кухня пажитник? А если вы захотите узнать, сможете ли вы, получив в подарок пакет с продуктами, содержащий бадьян, артишоки, цветную капусту и хрен, приготовить типичное индийское блюдо?

Сумасшедшие корзины с загадками

🎥 Нажмите на изображение выше, чтобы посмотреть видео. Вся идея шоу 'Chopped' заключается в "загадочной корзине", где шеф-повара должны приготовить блюдо из случайного набора ингредиентов. Конечно, модель машинного обучения могла бы помочь!

Знакомство с "классификатором"

Вопрос, который мы хотим задать этому набору данных о кухнях, на самом деле является многоклассовым вопросом, так как у нас есть несколько потенциальных национальных кухонь для работы. Учитывая набор ингредиентов, к какому из этих множества классов будут относиться данные?

Scikit-learn предлагает несколько различных алгоритмов для классификации данных, в зависимости от типа задачи, которую вы хотите решить. В следующих двух уроках вы узнаете о нескольких из этих алгоритмов.

Упражнение — очистка и балансировка данных

Первая задача, которую нужно выполнить перед началом проекта, — это очистить и сбалансировать данные, чтобы получить лучшие результаты. Начните с пустого файла notebook.ipynb в корневой папке.

Первое, что нужно установить, это imblearn. Это пакет Scikit-learn, который позволит вам лучше сбалансировать данные (вы узнаете больше об этой задаче через минуту).

  1. Чтобы установить imblearn, выполните команду pip install, как показано ниже:

    pip install imblearn
    
  2. Импортируйте пакеты, необходимые для импорта данных и их визуализации, также импортируйте SMOTE из imblearn.

    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import numpy as np
    from imblearn.over_sampling import SMOTE
    

    Теперь вы готовы к следующему шагу — импорту данных.

  3. Следующая задача — импортировать данные:

    df  = pd.read_csv('../data/cuisines.csv')
    

    Использование read_csv() позволит прочитать содержимое файла csv cusines.csv и поместить его в переменную df.

  4. Проверьте форму данных:

    df.head()
    

    Первые пять строк выглядят так:

    |     | 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        |
    
  5. Получите информацию об этих данных, вызвав info():

    df.info()
    

    Ваш вывод будет похож на:

    <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():

    df.cuisine.value_counts().plot.barh()
    

    распределение данных о кухнях

    Существует ограниченное количество кухонь, но распределение данных неравномерное. Вы можете это исправить! Прежде чем это сделать, исследуйте немного больше.

  2. Узнайте, сколько данных доступно для каждой кухни, и выведите их:

    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}')
    

    вывод выглядит так:

    thai df: (289, 385)
    japanese df: (320, 385)
    chinese df: (442, 385)
    indian df: (598, 385)
    korean df: (799, 385)
    

Изучение ингредиентов

Теперь вы можете углубиться в данные и узнать, какие ингредиенты типичны для каждой кухни. Вам следует очистить повторяющиеся данные, которые создают путаницу между кухнями, поэтому давайте изучим эту проблему.

  1. Создайте функцию create_ingredient() на 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
    

    Теперь вы можете использовать эту функцию, чтобы получить представление о десяти самых популярных ингредиентах для каждой кухни.

  2. Вызовите create_ingredient() и постройте график, вызвав barh():

    thai_ingredient_df = create_ingredient_df(thai_df)
    thai_ingredient_df.head(10).plot.barh()
    

    тайская кухня

  3. Сделайте то же самое для японских данных:

    japanese_ingredient_df = create_ingredient_df(japanese_df)
    japanese_ingredient_df.head(10).plot.barh()
    

    японская кухня

  4. Теперь для китайских ингредиентов:

    chinese_ingredient_df = create_ingredient_df(chinese_df)
    chinese_ingredient_df.head(10).plot.barh()
    

    китайская кухня

  5. Постройте график индийских ингредиентов:

    indian_ingredient_df = create_ingredient_df(indian_df)
    indian_ingredient_df.head(10).plot.barh()
    

    индийская кухня

  6. Наконец, постройте график корейских ингредиентов:

    korean_ingredient_df = create_ingredient_df(korean_df)
    korean_ingredient_df.head(10).plot.barh()
    

    корейская кухня

  7. Теперь удалите самые распространенные ингредиенты, которые создают путаницу между различными кухнями, вызвав drop():

    Все любят рис, чеснок и имбирь!

    feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
    labels_df = df.cuisine #.unique()
    feature_df.head()
    

Балансировка набора данных

Теперь, когда вы очистили данные, используйте SMOTE — "Техника синтетического увеличения меньшинства" — чтобы сбалансировать их.

  1. Вызовите fit_resample(), эта стратегия генерирует новые образцы путем интерполяции.

    oversample = SMOTE()
    transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
    

    Балансируя данные, вы получите лучшие результаты при их классификации. Подумайте о бинарной классификации. Если большинство ваших данных относится к одному классу, модель машинного обучения будет чаще предсказывать этот класс, просто потому что для него больше данных. Балансировка данных устраняет этот дисбаланс.

  2. Теперь вы можете проверить количество меток на ингредиент:

    print(f'new label count: {transformed_label_df.value_counts()}')
    print(f'old label count: {df.cuisine.value_counts()}')
    

    Ваш вывод будет похож на:

    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
    

    Данные теперь чистые, сбалансированные и очень аппетитные!

  3. Последний шаг — сохранить сбалансированные данные, включая метки и признаки, в новый датафрейм, который можно экспортировать в файл:

    transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
    
  4. Вы можете еще раз взглянуть на данные, используя transformed_df.head() и transformed_df.info(). Сохраните копию этих данных для использования в будущих уроках:

    transformed_df.head()
    transformed_df.info()
    transformed_df.to_csv("../data/cleaned_cuisines.csv")
    

    Этот свежий CSV теперь можно найти в корневой папке данных.


🚀Задача

Этот курс содержит несколько интересных наборов данных. Просмотрите папки data и посмотрите, есть ли в них наборы данных, которые подходят для бинарной или многоклассовой классификации? Какие вопросы вы могли бы задать этим данным?

Тест после лекции

Обзор и самостоятельное изучение

Изучите API SMOTE. Для каких случаев его лучше всего использовать? Какие проблемы он решает?

Задание

Изучите методы классификации


Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.