Класификатори кухиња 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()
    

    Подaци изгледају овако:

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 групише класификацију под Надзирано учење, и у тој категорији ћете пронаћи много начина да се врши класификација. Разноврсност је на први поглед прилично збуњујућа. Следеће методе укључују технике класификације:

  • Линеарни модели
  • Support Vector Machines (Супротне вредносне машине)
  • Стохастички градијентни спуст
  • Најближи суседи
  • Гаусови процеси
  • Одлучивачка стабла
  • Методе ансамбла (гласачки класификатор)
  • Мултикласа и мултиаутпут алгоритми (мултикласа и мултилеијбл класификација, мултикласа-мултиаутпут класификација)

Можете такође користити неуронске мреже за класификацију података, али то је изван опсега ове лекције.

Који класификатор одабрати?

Дакле, који класификатор изабрати? Често, пробајући неколико и тражећи добар резултат је начин да се тестира. Scikit-learn нуди упоредну табелу на направљеном скупу података, поредећи KNeighbors, SVC на два начина, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB и QuadraticDiscrinationAnalysis, показујући резултате визуализоване:

поређење класификатора

Графикони генерисани у документацији Scikit-learn

AutoML решава овај проблем елегантно покретањем ових поређења у облаку, омогућавајући вам да изаберете најбољи алгоритам за ваше податке. Испробајте овде

Бољи приступ

Бољи начин од насумичног погађања је да пратите идеје са овог склопивог ML Cheat sheet. Овде откривамо да за наш мултикласа проблем имамо неке изборе:

читава листа за мултикласа проблеме

Одељак Microsoft-овог листа са преваром алгоритама, који детаљно описује опције мултикласа класификације

✅ Преузмите овај лист, одштампајте га и обесите на зид!

Рaзлози

Погледајмо да ли можемо разложити различите приступе узимајући у обзир ограничења која имамо:

  • Неуронске мреже су превише захтевне. Имајући у виду наш чист, али минималан скуп података и чињеницу да изводимо обуку локално преко нотебоока, неуронске мреже су пречесто за овај задатак.
  • Нема класификатора са два класа. Не користимо двокласни класификатор, што искључује 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' да бисте разумели шта се дешава иза сцене.

Квиз након предавања

Преглед и Самостално учење

Истражите мало више математику иза логистичке регресије у овом часу

Задатак

Проучите solver-е


Изјава о одрицању одговорности: Овај документ је преведен коришћењем AI услуге за превођење Co-op Translator. Иако се трудимо да превод буде прецизан, имајте у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитетом. За критичне информације препоручује се професионални превод од стране људског преводиоца. Нисмо одговорни за било каква неразумевања или погрешне интерпретације које могу настати коришћењем овог превода.