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

April 20, 2026 · View on GitHub

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

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

Передлекційний тест

Підготовка

Припускаючи, що ви виконали Урок 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: 0cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnac...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00indian00000000...0000000000
11indian10000000...0000000000
22indian00000000...0000000000
33indian00000000...0000000000
44indian00000000...0000000010
  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()
    

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

almondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisiaartichoke...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00000000000...0000000000
11000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000010

Тепер ви готові навчати свою модель!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обґрунтування

Подивимося, чи можемо ми логічно підходити до вибору підходів з урахуванням наших обмежень:

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

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

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

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

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

  • Використовує схему Один проти решти (OvR), якщо параметр multi_class встановлено в ovr
  • Використовує крос-ентропійне відхилення, якщо параметр multi_class встановлено в multinomial. (Зараз опція multinomial підтримується лише solver-ами 'lbfgs', 'sag', 'saga' і 'newton-cg')."

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

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

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

solver-и

Вправа – розділення даних

Ми можемо зосередитись на логістичній регресії для нашої першої спроби навчання, оскільки ви нещодавно вивчили її у попередньому уроці. Розділіть свої дані на тренувальну і тестову групи, викликавши 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 з параметром multi_class і solver-ом liblinear для навчання.

  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%!

  2. Ви можете побачити цю модель у дії, протестувавши один рядок даних (#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
    

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

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

    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
    indian0.715851
    chinese0.229475
    japanese0.029763
    korean0.017277
    thai0.007634

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

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

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    precisionrecallf1-scoresupport
    chinese0.730.710.72229
    indian0.910.930.92254
    japanese0.700.750.72220
    korean0.860.760.81242
    thai0.790.850.82254
    accuracy0.801199
    macro avg0.800.800.801199
    weighted avg0.800.800.801199

🚀Виклик

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

Пост-лекційний тест

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

Заглибтеся в математику за логістичною регресією у цьому уроці

Завдання

Вивчіть solvers


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