|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 2 weeks ago |
README.md
Въведение в класификацията
В тези четири урока ще разгледате основен аспект на класическото машинно обучение - класификация. Ще преминем през използването на различни алгоритми за класификация с набор от данни за всички невероятни кухни на Азия и Индия. Надяваме се, че сте гладни!
Празнувайте паназиатските кухни в тези уроци! Изображение от Jen Looper
Класификацията е форма на контролирано обучение, която има много общо с техниките за регресия. Ако машинното обучение е свързано с предсказване на стойности или имена на неща чрез използване на набори от данни, тогава класификацията обикновено се разделя на две групи: бинарна класификация и многокласова класификация.
🎥 Кликнете върху изображението по-горе за видео: Джон Гуттаг от MIT представя класификацията
Запомнете:
- Линейната регресия ви помогна да предскажете връзките между променливите и да направите точни прогнози за това къде нова точка от данни би попаднала спрямо тази линия. Например, можете да предскажете каква ще бъде цената на тиква през септември спрямо декември.
- Логистичната регресия ви помогна да откриете "бинарни категории": при тази ценова точка, тиквата оранжева ли е или не е оранжева?
Класификацията използва различни алгоритми, за да определи други начини за определяне на етикета или класа на дадена точка от данни. Нека работим с тези данни за кухни, за да видим дали, наблюдавайки група от съставки, можем да определим произхода на кухнята.
Тест преди лекцията
Този урок е наличен на R!
Въведение
Класификацията е една от основните дейности на изследователя в областта на машинното обучение и на специалиста по данни. От основна класификация на бинарна стойност ("този имейл спам ли е или не?") до сложна класификация на изображения и сегментация с помощта на компютърно зрение, винаги е полезно да можете да сортирате данни в класове и да задавате въпроси за тях.
За да опишем процеса по-научно, вашият метод за класификация създава предсказателен модел, който ви позволява да картографирате връзката между входните променливи и изходните променливи.
Бинарни срещу многокласови проблеми, които алгоритмите за класификация трябва да решат. Инфографика от Jen Looper
Преди да започнем процеса на почистване на данните, визуализирането им и подготовката им за нашите задачи по машинно обучение, нека научим малко повече за различните начини, по които машинното обучение може да се използва за класифициране на данни.
Произлизаща от статистиката, класификацията с помощта на класическо машинно обучение използва характеристики като smoker
, weight
и age
, за да определи вероятността за развитие на дадено заболяване. Като техника за контролирано обучение, подобна на упражненията за регресия, които извършихте по-рано, вашите данни са етикетирани, а алгоритмите за машинно обучение използват тези етикети, за да класифицират и предсказват класове (или 'характеристики') на набор от данни и да ги присвояват към група или резултат.
✅ Отделете момент, за да си представите набор от данни за кухни. Какво би могъл да отговори многокласов модел? Какво би могъл да отговори бинарен модел? Какво ако искате да определите дали дадена кухня вероятно използва сминдух? А какво ако искате да видите дали, при наличието на торба с хранителни продукти, съдържаща звезден анасон, артишок, карфиол и хрян, можете да създадете типично индийско ястие?
🎥 Кликнете върху изображението по-горе за видео. Цялата идея на шоуто '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
и вижте дали някои от тях съдържат набори от данни, които биха били подходящи за бинарна или многокласова класификация? Какви въпроси бихте задали на този набор от данни?
Тест след лекцията
Преглед и самостоятелно обучение
Разгледайте API на SMOTE. За какви случаи на употреба е най-подходящ? Какви проблеми решава?
Задание
Изследвайте методи за класификация
Отказ от отговорност:
Този документ е преведен с помощта на AI услуга за превод Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.