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 и QuadraticDiscrinationAnalysis, приказујући резултате визуализоване:
Графикони генерисани у документацији Scikit-learn-а
AutoML решава овај проблем елегантно тако што врши ова поређења у облаку, омогућавајући вам да изаберете најбољи алгоритам за ваше податке. Пробајте овде
Бољи приступ
Бољи начин од насумичног погађања је да следите идеје из овог преузимљивог ML Cheat sheet. Овде откривамо да, за наш проблем са више класа, имамо неке опције:
Део Microsoft-ове чит листе алгоритама, који детаљно описује опције класификације више класа
✅ Преузмите ову чит листу, одштампајте је и окачите на зид!
Размишљање
Хајде да видимо да ли можемо да размишљамо о различитим приступима с обзиром на ограничења која имамо:
- Неуронске мреже су превише захтевне. С обзиром на наш чист, али минималан скуп података, и чињеницу да тренинг изводимо локално преко нотебука, неуронске мреже су превише захтевне за овај задатак.
- Нема класификатора за две класе. Не користимо класификатор за две класе, тако да то искључује one-vs-all.
- Дрво одлука или логистичка регресија би могли да раде. Дрво одлука би могло да ради, или логистичка регресија за податке са више класа.
- Побољшана дрва одлука за више класа решавају другачији проблем. Побољшано дрво одлука за више класа је најпогодније за непараметарске задатке, нпр. задатке дизајниране за креирање рангирања, тако да нам није корисно.
Коришћење Scikit-learn-а
Користићемо Scikit-learn за анализу наших података. Међутим, постоји много начина за коришћење логистичке регресије у Scikit-learn-у. Погледајте параметре за прослеђивање.
У суштини, постоје два важна параметра - multi_class
и solver
- које треба да наведемо када тражимо од Scikit-learn-а да изврши логистичку регресију. Вредност multi_class
примењује одређено понашање. Вредност solver-а је алгоритам који се користи. Не могу се сви solver-и упарити са свим вредностима multi_class
.
Према документацији, у случају више класа, алгоритам за тренинг:
- Користи шему one-vs-rest (OvR), ако је опција
multi_class
постављена наovr
- Користи губитак унакрсне ентропије, ако је опција
multi_class
постављена наmultinomial
. (Тренутно је опцијаmultinomial
подржана само од стране solver-а ‘lbfgs’, ‘sag’, ‘saga’ и ‘newton-cg’.)"
🎓 'Шема' овде може бити 'ovr' (one-vs-rest) или '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 са подешавањем више класа и 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))
прецизност одзив f1-резултат подршка 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 тачност 0.80 1199 макро просек 0.80 0.80 0.80 1199 пондерисан просек 0.80 0.80 0.80 1199
🚀Изазов
У овој лекцији, користили сте очишћене податке за изградњу модела машинског учења који може предвидети националну кухињу на основу серије састојака. Одвојите време да прочитате многе опције које Scikit-learn пружа за класификацију података. Истражите дубље концепт 'solver'-а да бисте разумели шта се дешава иза сцене.
Квиз након предавања
Преглед и самостално учење
Истражите мало више математику иза логистичке регресије у овој лекцији
Задатак
Одрицање од одговорности:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције Co-op Translator. Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.