20 KiB
Класифікатори кухонь 1
У цьому уроці ви будете використовувати набір даних, який ви зберегли з попереднього уроку, наповнений збалансованими та очищеними даними про кухні.
Ви будете використовувати цей набір даних із різними класифікаторами, щоб передбачити національну кухню на основі групи інгредієнтів. Під час цього ви дізнаєтеся більше про способи використання алгоритмів для задач класифікації.
Тест перед лекцією
Підготовка
Якщо ви завершили Урок 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 групує класифікацію під Навчання з учителем, і в цій категорії ви знайдете багато способів класифікації. Різноманіття може здатися приголомшливим на перший погляд. Наступні методи включають техніки класифікації:
- Лінійні моделі
- Машини опорних векторів
- Стохастичний градієнтний спуск
- Найближчі сусіди
- Гауссові процеси
- Дерева рішень
- Ансамблеві методи (голосуючий класифікатор)
- Алгоритми для багатокласових і багатовихідних задач (багатокласова і багатоміткова класифікація, багатокласова-багатовихідна класифікація)
Ви також можете використовувати нейронні мережі для класифікації даних, але це виходить за рамки цього уроку.
Який класифікатор обрати?
Отже, який класифікатор слід обрати? Часто тестування кількох класифікаторів і пошук найкращого результату є способом перевірки. 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 справляються з різними викликами, представленими різними типами структур даних:
Вправа - розділіть дані
Ми можемо зосередитися на логістичній регресії для нашого першого тренувального випробування, оскільки ви нещодавно вивчали її на попередньому уроці.
Розділіть ваші дані на тренувальні та тестові групи, викликавши 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 для тренування.
-
Створіть логістичну регресію з 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. Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.