21 KiB
Увод у класификацију
У овим четири лекције, истражићете основни аспект класичног машинског учења - класификацију. Проћи ћемо кроз употребу различитих алгоритама класификације са скупом података о свим сјајним кухињама Азије и Индије. Надамо се да сте гладни!
Прославите паназијске кухиње у овим лекцијама! Слика: Џен Лупер
Класификација је облик надгледаног учења који има много заједничког са техникама регресије. Ако је машинско учење усмерено на предвиђање вредности или имена ствари користећи скупове података, онда класификација генерално спада у две групе: бинарна класификација и вишекласна класификација.
🎥 Кликните на слику изнад за видео: Џон Гуттаг са МИТ-а представља класификацију
Запамтите:
- Линеарна регресија вам је помогла да предвидите односе између променљивих и направите тачна предвиђања о томе где ће нова тачка података пасти у односу на ту линију. На пример, могли сте да предвидите која ће цена бундеве бити у септембру у односу на децембар.
- Логистичка регресија вам је помогла да откријете "бинарне категорије": на овом ценовном нивоу, да ли је ова бундева наранџаста или није?
Класификација користи различите алгоритме за одређивање других начина за утврђивање етикете или класе тачке података. Радимо са овим подацима о кухињама да бисмо видели да ли, посматрајући групу састојака, можемо утврдити њихово порекло.
Квиз пре предавања
Ова лекција је доступна на R!
Увод
Класификација је једна од основних активности истраживача машинског учења и научника за податке. Од основне класификације бинарне вредности ("да ли је овај имејл спам или није?"), до сложене класификације слика и сегментације користећи компјутерски вид, увек је корисно бити у могућности да сортирате податке у класе и постављате питања о њима.
Научно речено, ваш метод класификације креира предиктивни модел који вам омогућава да мапирате однос између улазних променљивих и излазних променљивих.
Бинарни и вишекласни проблеми за алгоритме класификације. Инфографика: Џен Лупер
Пре него што започнемо процес чишћења наших података, њихове визуализације и припреме за задатке машинског учења, научимо мало о различитим начинима на које машинско учење може бити коришћено за класификацију података.
Изведена из статистике, класификација користећи класично машинско учење користи карактеристике, као што су пушач
, тежина
и године
да би утврдила вероватноћу развоја X болести. Као техника надгледаног учења слична вежбама регресије које сте раније радили, ваши подаци су означени, а алгоритми машинског учења користе те ознаке да класификују и предвиђају класе (или 'карактеристике') скупа података и додељују их групи или исходу.
✅ Замислите скуп података о кухињама. Шта би модел вишекласне класификације могао да одговори? Шта би модел бинарне класификације могао да одговори? Шта ако желите да утврдите да ли је одређена кухиња вероватно користила пискавицу? Шта ако желите да видите да ли, уз поклон торбе пуне звезданог аниса, артичока, карфиола и рена, можете направити типично индијско јело?
🎥 Кликните на слику изнад за видео. Цела премиса емисије 'Chopped' је 'мистериозна корпа' где кувари морају да направе јело од насумичног избора састојака. Сигурно би модел машинског учења помогао!
Здраво 'класификаторе'
Питање које желимо да поставимо о овом скупу података о кухињама је заправо вишекласно питање, јер имамо неколико потенцијалних националних кухиња са којима радимо. Узимајући групу састојака, којој од ових многих класа ће подаци припадати?
Scikit-learn нуди неколико различитих алгоритама за класификацију података, у зависности од врсте проблема који желите да решите. У наредне две лекције, научићете о неколико ових алгоритама.
Вежба - очистите и избалансирајте своје податке
Први задатак, пре него што започнете овај пројекат, је да очистите и избалансирате своје податке како бисте добили боље резултате. Почните са празним notebook.ipynb фајлом у корену овог директоријума.
Прва ствар коју треба инсталирати је imblearn. Ово је Scikit-learn пакет који ће вам омогућити боље балансирање података (о овом задатку ћете научити више за тренутак).
-
Да бисте инсталирали
imblearn
, покренитеpip install
, овако:pip install imblearn
-
Увезите пакете који су вам потребни за увоз ваших података и њихову визуализацију, такође увезите
SMOTE
изimblearn
.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
Сада сте спремни да увезете податке.
-
Следећи задатак је да увезете податке:
df = pd.read_csv('../data/cuisines.csv')
Коришћење
read_csv()
ће прочитати садржај csv фајла cusines.csv и поставити га у променљивуdf
. -
Проверите облик података:
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 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Добијте информације о овим подацима позивајући
info()
:df.info()
Ваш излаз изгледа овако:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2+ MB
Вежба - учење о кухињама
Сада рад постаје занимљивији. Хајде да откријемо расподелу података по кухињама.
-
Прикажите податке као траке позивајући
barh()
:df.cuisine.value_counts().plot.barh()
Постоји ограничен број кухиња, али расподела података је неравномерна. Можете то поправити! Пре него што то урадите, истражите мало више.
-
Сазнајте колико података је доступно по кухињи и испишите их:
thai_df = df[(df.cuisine == "thai")] japanese_df = df[(df.cuisine == "japanese")] chinese_df = df[(df.cuisine == "chinese")] indian_df = df[(df.cuisine == "indian")] korean_df = df[(df.cuisine == "korean")] print(f'thai df: {thai_df.shape}') print(f'japanese df: {japanese_df.shape}') print(f'chinese df: {chinese_df.shape}') print(f'indian df: {indian_df.shape}') print(f'korean df: {korean_df.shape}')
излаз изгледа овако:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Откривање састојака
Сада можете дубље истражити податке и сазнати који су типични састојци по кухињи. Требало би да очистите поновљене податке који стварају конфузију између кухиња, па хајде да научимо о овом проблему.
-
Направите функцију
create_ingredient()
у Python-у за креирање dataframe-а састојака. Ова функција ће започети уклањањем некорисне колоне и сортирањем састојака по њиховом броју:def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df
Сада можете користити ту функцију да добијете идеју о десет најпопуларнијих састојака по кухињи.
-
Позовите
create_ingredient()
и прикажите резултате позивајућиbarh()
:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Урадите исто за јапанске податке:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Сада за кинеске састојке:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Прикажите индијске састојке:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
На крају, прикажите корејске састојке:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Сада уклоните најчешће састојке који стварају конфузију између различитих кухиња, позивајући
drop()
:Сви воле пиринач, бели лук и ђумбир!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Балансирање скупа података
Сада када сте очистили податке, користите SMOTE - "Техника синтетичког прекомерног узорковања мањинских класа" - да их избалансирате.
-
Позовите
fit_resample()
, ова стратегија генерише нове узорке интерполацијом.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
Балансирањем ваших података, добићете боље резултате приликом класификације. Размислите о бинарној класификацији. Ако је већина ваших података једна класа, модел машинског учења ће чешће предвиђати ту класу, само зато што има више података за њу. Балансирање података уклања ову неравнотежу.
-
Сада можете проверити број ознака по састојку:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Ваш излаз изгледа овако:
new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64
Подаци су лепи, чисти, избалансирани и веома укусни!
-
Последњи корак је да сачувате ваше избалансиране податке, укључујући ознаке и карактеристике, у нови dataframe који можете извозити у фајл:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Можете још једном погледати податке користећи
transformed_df.head()
иtransformed_df.info()
. Сачувајте копију ових података за употребу у будућим лекцијама:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Овај свеж CSV сада се може наћи у коренском директоријуму података.
🚀Изазов
Овај курикулум садржи неколико занимљивих скупова података. Претражите директоријуме data
и видите да ли неки садрже скупове података који би били погодни за бинарну или вишекласну класификацију? Која питања бисте поставили о овом скупу података?
Квиз после предавања
Преглед и самостално учење
Истражите SMOTE API. За које случајеве употребе је најбоље коришћен? Које проблеме решава?
Задатак
Истражите методе класификације
Одрицање од одговорности:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције Co-op Translator. Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.