Класифікатори кухонь 1
April 20, 2026 · View on GitHub
У цьому уроці ви використаєте набір даних, який зберегли з попереднього уроку, повний збалансованих, чистих даних про кухні.
Ви використаєте цей набір даних із різними класифікаторами, щоб передбачити національну кухню на основі набору інгредієнтів. Під час цього ви дізнаєтеся більше про деякі способи використання алгоритмів для задач класифікації.
Передлекційний тест
Підготовка
Припускаючи, що ви виконали Урок 1, переконайтеся, що файл cleaned_cuisines.csv існує в кореневій папці /data протягом цих чотирьох уроків.
Вправа – передбачення національної кухні
-
Працюючи у папці з цим уроком 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 |
-
Тепер імпортуйте ще кілька бібліотек:
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 -
Розділіть координати 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 -
Відкиньте стовпець
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 об'єднує класифікацію під категорією Навчання з вчителем (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-и справляються з різними викликами, які виникають у різних типах структур даних:

Вправа – розділення даних
Ми можемо зосередитись на логістичній регресії для нашої першої спроби навчання, оскільки ви нещодавно вивчили її у попередньому уроці.
Розділіть свої дані на тренувальну і тестову групи, викликавши 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 для навчання.
-
Створіть логістичну регресію з 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%!
-
Ви можете побачити цю модель у дії, протестувавши один рядок даних (#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✅ Спробуйте інший номер рядка і перевірте результати
-
Заглиблюючись, ви можете перевірити точність цього передбачення:
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 ✅ Чи можете ви пояснити, чому модель досить впевнена, що це індійська кухня?
-
Отримайте більше деталей, надрукувавши звіт про класифікацію, як ви робили в уроках регресії:
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', щоб зрозуміти, що відбувається за лаштунками.
Пост-лекційний тест
Огляд та Самостійне вивчення
Заглибтеся в математику за логістичною регресією у цьому уроці
Завдання
Відмова від відповідальності: Цей документ було перекладено за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ його рідною мовою слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.