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
leestott c7a68c1882
🌐 Update translations via Co-op Translator
11 months ago
..
solution 🌐 Update translations via Co-op Translator 11 months ago
README.md 🌐 Update translations via Co-op Translator 11 months ago
assignment.md 🌐 Update translations via Co-op Translator 11 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

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

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

щепотка!

Отпразднуйте паназиатские кухни в этих уроках! Изображение от 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. Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.