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

21 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 — "Synthetic Minority Over-sampling Technique" — для їх балансування.

  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. Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.