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/2-Classifiers-1/README.md

20 KiB

Класифікатори кухонь 1

У цьому уроці ви будете використовувати набір даних, який ви зберегли з попереднього уроку, наповнений збалансованими та очищеними даними про кухні.

Ви будете використовувати цей набір даних із різними класифікаторами, щоб передбачити національну кухню на основі групи інгредієнтів. Під час цього ви дізнаєтеся більше про способи використання алгоритмів для задач класифікації.

Тест перед лекцією

Підготовка

Якщо ви завершили Урок 1, переконайтеся, що файл cleaned_cuisines.csv знаходиться в кореневій папці /data для цих чотирьох уроків.

Вправа - передбачення національної кухні

  1. Працюючи в папці notebook.ipynb цього уроку, імпортуйте цей файл разом із бібліотекою Pandas:

    import pandas as pd
    cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
    cuisines_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 0 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 indian 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 2 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 3 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 4 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0
  1. Тепер імпортуйте ще кілька бібліотек:

    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import train_test_split, cross_val_score
    from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
    from sklearn.svm import SVC
    import numpy as np
    
  2. Розділіть координати X та y на два датафрейми для тренування. cuisine може бути датафреймом міток:

    cuisines_label_df = cuisines_df['cuisine']
    cuisines_label_df.head()
    

    Це виглядатиме так:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. Видаліть стовпці Unnamed: 0 та cuisine, використовуючи drop(). Збережіть решту даних як тренувальні ознаки:

    cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
    cuisines_feature_df.head()
    

    Ваші ознаки виглядають так:

almond angelica anise anise_seed apple apple_brandy apricot armagnac artemisia artichoke ... whiskey white_bread white_wine whole_grain_wheat_flour wine wood yam yeast yogurt zucchini
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0

Тепер ви готові тренувати вашу модель!

Вибір класифікатора

Тепер, коли ваші дані очищені та готові до тренування, вам потрібно вирішити, який алгоритм використовувати для задачі.

Scikit-learn групує класифікацію під Навчання з учителем, і в цій категорії ви знайдете багато способів класифікації. Різноманіття може здатися приголомшливим на перший погляд. Наступні методи включають техніки класифікації:

  • Лінійні моделі
  • Машини опорних векторів
  • Стохастичний градієнтний спуск
  • Найближчі сусіди
  • Гауссові процеси
  • Дерева рішень
  • Ансамблеві методи (голосуючий класифікатор)
  • Алгоритми для багатокласових і багатовихідних задач (багатокласова і багатоміткова класифікація, багатокласова-багатовихідна класифікація)

Ви також можете використовувати нейронні мережі для класифікації даних, але це виходить за рамки цього уроку.

Який класифікатор обрати?

Отже, який класифікатор слід обрати? Часто тестування кількох класифікаторів і пошук найкращого результату є способом перевірки. Scikit-learn пропонує порівняння на створеному наборі даних, порівнюючи KNeighbors, SVC двома способами, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB і QuadraticDiscriminationAnalysis, показуючи результати візуалізованими:

порівняння класифікаторів

Графіки, створені на документації Scikit-learn

AutoML вирішує цю проблему, виконуючи ці порівняння в хмарі, дозволяючи вам обрати найкращий алгоритм для ваших даних. Спробуйте тут

Кращий підхід

Кращий спосіб, ніж просто здогадуватися, — це слідувати ідеям із цього завантажуваного ML Cheat sheet. Тут ми дізнаємося, що для нашої багатокласової задачі у нас є кілька варіантів:

шпаргалка для багатокласових задач

Частина шпаргалки Microsoft Algorithm Cheat Sheet, що описує варіанти багатокласової класифікації

Завантажте цю шпаргалку, роздрукуйте її та повісьте на стіну!

Міркування

Давайте спробуємо розібратися в різних підходах, враховуючи наші обмеження:

  • Нейронні мережі занадто важкі. З огляду на наш очищений, але мінімальний набір даних, і той факт, що ми запускаємо тренування локально через ноутбуки, нейронні мережі занадто важкі для цього завдання.
  • Не використовуємо класифікатор для двох класів. Ми не використовуємо класифікатор для двох класів, тому це виключає one-vs-all.
  • Дерева рішень або логістична регресія можуть підійти. Дерева рішень можуть підійти, або логістична регресія для багатокласових даних.
  • Багатокласові Boosted Decision Trees вирішують іншу задачу. Багатокласове Boosted Decision Tree найбільш підходить для непараметричних задач, наприклад, задач, спрямованих на створення рейтингів, тому це нам не підходить.

Використання Scikit-learn

Ми будемо використовувати Scikit-learn для аналізу наших даних. Однак існує багато способів використання логістичної регресії в Scikit-learn. Ознайомтеся з параметрами для передачі.

Фактично, є два важливі параметри - multi_class і solver - які нам потрібно вказати, коли ми просимо Scikit-learn виконати логістичну регресію. Значення multi_class визначає певну поведінку. Значення solver визначає, який алгоритм використовувати. Не всі solvers можна поєднувати з усіма значеннями multi_class.

Згідно з документацією, у випадку багатокласової задачі, алгоритм навчання:

  • Використовує схему one-vs-rest (OvR), якщо параметр multi_class встановлено як ovr
  • Використовує функцію втрат крос-ентропії, якщо параметр multi_class встановлено як multinomial. (На даний момент опція multinomial підтримується лише solvers: lbfgs, sag, saga і newton-cg.)

🎓 "Схема" тут може бути або 'ovr' (one-vs-rest), або 'multinomial'. Оскільки логістична регресія насправді призначена для підтримки бінарної класифікації, ці схеми дозволяють їй краще справлятися з багатокласовими задачами класифікації. джерело

🎓 "Solver" визначається як "алгоритм, який використовується для вирішення задачі оптимізації". джерело.

Scikit-learn пропонує цю таблицю, щоб пояснити, як solvers справляються з різними викликами, представленими різними типами структур даних:

solvers

Вправа - розділіть дані

Ми можемо зосередитися на логістичній регресії для нашого першого тренувального випробування, оскільки ви нещодавно вивчали її на попередньому уроці. Розділіть ваші дані на тренувальні та тестові групи, викликавши train_test_split():

X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)

Вправа - застосуйте логістичну регресію

Оскільки ви використовуєте багатокласовий випадок, вам потрібно вибрати, яку схему використовувати і який solver встановити. Використовуйте LogisticRegression із багатокласовим налаштуванням і liblinear solver для тренування.

  1. Створіть логістичну регресію з multi_class, встановленим як ovr, і solver, встановленим як liblinear:

    lr = LogisticRegression(multi_class='ovr',solver='liblinear')
    model = lr.fit(X_train, np.ravel(y_train))
    
    accuracy = model.score(X_test, y_test)
    print ("Accuracy is {}".format(accuracy))
    

    Спробуйте інший solver, наприклад lbfgs, який часто встановлюється за замовчуванням.

Зверніть увагу, використовуйте функцію Pandas ravel для згладжування ваших даних, коли це необхідно. Точність становить понад 80%!

  1. Ви можете побачити, як ця модель працює, протестувавши один рядок даних (#50):

    print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
    print(f'cuisine: {y_test.iloc[50]}')
    

    Результат виводиться:

    ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
    cuisine: indian
    

    Спробуйте інший номер рядка та перевірте результати.

  2. Заглиблюючись, ви можете перевірити точність цього прогнозу:

    test= X_test.iloc[50].values.reshape(-1, 1).T
    proba = model.predict_proba(test)
    classes = model.classes_
    resultdf = pd.DataFrame(data=proba, columns=classes)
    
    topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
    topPrediction.head()
    

    Результат виводиться - індійська кухня є найкращим припущенням моделі з високою ймовірністю:

    0
    indian 0.715851
    chinese 0.229475
    japanese 0.029763
    korean 0.017277
    thai 0.007634

    Чи можете ви пояснити, чому модель досить впевнена, що це індійська кухня?

  3. Отримайте більше деталей, вивівши звіт про класифікацію, як ви робили в уроках регресії:

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    precision recall f1-score support
    chinese 0.73 0.71 0.72 229
    indian 0.91 0.93 0.92 254
    japanese 0.70 0.75 0.72 220
    korean 0.86 0.76 0.81 242
    thai 0.79 0.85 0.82 254
    accuracy 0.80 1199
    macro avg 0.80 0.80 0.80 1199
    weighted avg 0.80 0.80 0.80 1199

🚀Виклик

У цьому уроці ви використали очищені дані для створення моделі машинного навчання, яка може передбачати національну кухню на основі серії інгредієнтів. Приділіть час, щоб ознайомитися з багатьма варіантами, які Scikit-learn пропонує для класифікації даних. Заглибтеся в концепцію 'solver', щоб зрозуміти, що відбувається за лаштунками.

Тест після лекції

Огляд і самостійне навчання

Заглибтеся трохи більше в математику логістичної регресії в цьому уроці

Завдання

Вивчіть solvers


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