|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 7 months ago | |
| README.md | 3 months ago | |
| assignment.md | 7 months ago | |
| notebook.ipynb | 11 months ago | |
README.md
Въведение в клъстерирането
Клъстерирането е вид ненаблюдавано обучение, което предполага, че набор от данни е без етикети или че входните му данни не са съпоставени с предварително зададени изходи. То използва различни алгоритми, за да сортира неетикираните данни и да предостави групи според моделите, които разпознава в данните.
🎥 Кликнете върху снимката горе за видео. Докато изучавате машинното обучение с клъстериране, се насладете на някои нигерийски дънс хол тракове - това е високо оценена песен от 2014 г. на PSquare.
Предварителен тест преди лекцията
Въведение
Клъстерирането е много полезно за изследване на данни. Нека видим дали може да помогне да се открият тенденции и модели в начина, по който нигерийската публика консумира музика.
✅ Отделете минута, за да помислите за приложенията на клъстерирането. В реалния живот клъстерирането се случва всеки път, когато имате купчина пране и трябва да сортирате дрехите на членове на семейството си 🧦👕👖🩲. В науката за данни, клъстерирането се случва, когато се опитвате да анализирате предпочитанията на потребителя или да определите характеристиките на всеки неетиран набор от данни. Клъстерирането, по някакъв начин, помага да се внесе ред в хаоса, като в чекмедже за чорапи.
🎥 Кликнете върху снимката горе за видео: Джон Гъттаг от MIT представя клъстерирането
В професионална среда клъстерирането може да се използва за определяне на неща като сегментация на пазара, например определяне кои възрастови групи купуват кои артикули. Друга употреба би била откриването на аномалии, например за засичане на измами от набор от данни с транзакции с кредитни карти. Или може да използвате клъстериране, за да определите тумори в партида медицински сканирания.
✅ Помислете за минута как може да сте срещали клъстериране "в природата", в банкови, електронна търговия или бизнес среди.
🎓 Интересно е, че анализът на клъстери е възникнал в областите на антропологията и психологията през 30-те години на XX век. Можете ли да си представите как е могъл да се използва?
Алтернативно, може да го използвате за групиране на резултати от търсене - например по връзки за пазаруване, изображения или ревюта. Клъстерирането е полезно, когато имате голям набор от данни, който искате да намалите и върху който искате да извършите по-гранулиран анализ, така че техниката може да се използва за изучаване на данните преди изграждането на други модели.
✅ След като данните ви са организирани в клъстери, вие им присвоявате идентификатор на клъстера, и тази техника може да бъде полезна за запазване на поверителността на набора от данни; вместо да се позовавате на дадена точка чрез по-разкриващи идентифициращи данни, можете да използвате идентификатора на клъстера. Можете ли да се сетите за други причини, поради които бихте се позовали на идентификатор на клъстер, а не на други елементи от клъстера?
Задълбочете разбирането си за техники на клъстериране в този учебен модул
Започване с клъстериране
Scikit-learn предлага голям набор от методи за извършване на клъстериране. Типът, който избирате, ще зависи от конкретния ви случай. Според документацията, всеки метод има различни предимства. Ето опростена таблица на методите, поддържани от Scikit-learn и подходящите им случаи:
| Име на метода | Случай на използване |
|---|---|
| K-Means | общо предназначение, индуктивно |
| Affinity propagation | много, неравномерни клъстери, индуктивно |
| Mean-shift | много, неравномерни клъстери, индуктивно |
| Spectral clustering | малко, равномерни клъстери, транздуктивно |
| Ward hierarchical clustering | много, ограничени клъстери, транздуктивно |
| Agglomerative clustering | много, ограничени, неевклидови разстояния, транздуктивно |
| DBSCAN | нехоризонтална геометрия, неравномерни клъстери, транздуктивно |
| OPTICS | нехоризонтална геометрия, неравномерни клъстери с променлива плътност, транздуктивно |
| Gaussian mixtures | хоризонтална геометрия, индуктивно |
| BIRCH | голям набор от данни с изключения, индуктивно |
🎓 Начинът, по който създаваме клъстери, има много общо с начина, по който събираме точките в групи. Нека разгледаме някои терминологии:
🎓 'Транздуктивно' срещу 'индуктивно'
Транздуктивното извеждане се извлича от наблюдавани тренировъчни случаи, които съответстват на конкретни тестови случаи. Индуктивното извеждане се извлича от тренировъчни случаи, които съответстват на общи правила, които после се прилагат към тестовите случаи.
Пример: Представете си, че имате набор от данни, който е само частично етикиран. Някои неща са "плочи", други "cd-та", а други са празни. Вашата задача е да поставите етикети на празните. Ако изберете индуктивен подход, бихте обучили модел, който търси "плочи" и "cd-та" и ги прилага като етикети към неетираните данни. Този подход ще има проблеми с класифицирането на неща, които всъщност са "касети". От друга страна, транздуктивният подход се справя по-ефективно с тези неизвестни данни, тъй като работи за групиране на подобни елементи заедно и след това прилага етикет на групата. В този случай клъстерите може да отразяват "кръгли музикални неща" и "квадратни музикални неща".
🎓 'Нехоризонтална' срещу 'хоризонтална' геометрия
Взето от математическата терминология, нехоризонталната срещу хоризонталната геометрия се отнася до измерването на разстоянията между точки чрез "хоризонтални" (евклидови) или "нехоризонтални" (неевклидови) геометрични методи.
'Хоризонталното' тук се отнася до евклидовата геометрия (части от която се преподават като "планна" геометрия), а нехоризонталното - до неевклидовата геометрия. Какво общо има геометрията с машинното обучение? Като две области, основани на математиката, трябва да има общ начин за измерване на разстоянията между точки в клъстерите, което може да стане по "хоризонтален" или "нехоризонтален" начин, в зависимост от естеството на данните. Евклидовите разстояния се измерват като дължина на отсечка между две точки. Неевклидовите разстояния се измерват по дъга. Ако вашите данни, визуализирани, изглежда не съществуват на равнина, може да се нуждаете от специализиран алгоритъм, за да ги обработите.
Инфографика от Dasani Madipalli
Клъстерите се дефинират чрез матрица на разстоянията, например разстоянията между точките. Това разстояние може да се измерва по няколко начина. Евклидовите клъстери се дефинират чрез средната стойност на точките и съдържат “центроид” или централна точка. Разстоянията се измерват като разстояния до този центроид. Неевклидовите разстояния се отнасят до "клъстроиди", точката, най-близка до другите точки. Клъстроидите пък могат да се дефинират по различни начини.
Ограниченото клъстериране въвежда "полуненаблюдавано" обучение в този ненаблюдаван метод. Връзките между точките са маркирани като "не може да се свърже" или "трябва да се свърже", така че върху набора от данни се налагат някои правила.
Пример: Ако даден алгоритъм бъде оставен да работи свободно върху пакет неетиран или полуетикетиран набор от данни, клъстерите, които произвежда, могат да бъдат с ниско качество. В примера по-горе, клъстерите може да групират "кръгли музикални неща", "квадратни музикални неща", "триъгълни неща" и "бисквити". Ако му се зададат някои ограничения или правила за спазване ("артикулът трябва да е от пластмаса", "артикулът трябва да може да произвежда музика"), това може да помогне да се 'ограничи' алгоритъмът да прави по-добри избори.
🎓 'Плътност'
Данни, които са "шумни", се считат за "плътни". Разстоянията между точките във всеки от клъстерите им може да се окажат, след преглед, по-плътни или по-рядко наситени, или "струпани", и затова тези данни трябва да се анализират с подходящия метод на клъстериране. Тази статия демонстрира разликата между използването на K-Means клъстериране и HDBSCAN алгоритми за изследване на шумен набор от данни с неравномерна плътност на клъстерите.
Алгоритми за клъстериране
Има над 100 алгоритъма за клъстериране и тяхната употреба зависи от естеството на наличните данни. Нека обсъдим някои от основните:
-
Йерархично клъстериране. Ако обект се класифицира според близостта му до друг близък обект, а не до по-отдалечен, клъстерите се формират според разстоянията между членовете им и другите обекти. Агломеративното клъстериране на Scikit-learn е йерархично.
Инфографика от Dasani Madipalli
-
Центроидно клъстериране. Този популярен алгоритъм изисква избор на "k", или броят на клъстерите, които да се формират, след което алгоритъмът определя централната точка на клъстера и събира данни около тази точка. K-means клъстериране е популярна версия на центроидното клъстериране. Центърът се определя от най-близката средна стойност, откъдето идва и името му. Квадратното разстояние от клъстера се минимизира.
Инфографика от Dasani Madipalli
-
Клъстериране на базата на разпределение. Базирано на статистическо моделиране, клъстерирането на базата на разпределение се фокусира върху определянето на вероятността дадена точка от данни да принадлежи на клъстер и съответното ѝ присвояване. Гаусовите смесени методи спадат към този тип.
-
Клъстериране на базата на плътност. Точките от данни се присвояват към клъстери според тяхната плътност или групиране около една и съща зона. Точки от данни далеч от групата се считат за изключения или шум. DBSCAN, Mean-shift и OPTICS са примери за този тип клъстериране.
-
Клъстериране на базата на мрежа. За многомерни набори от данни се създава мрежа и данните се разделят сред клетките на мрежата, като по този начин се формират клъстери.
Упражнение - клъстерирайте вашите данни
Клъстерирането като техника се подпомага значително от правилната визуализация, затова нека започнем с визуализиране на нашите музикални данни. Това упражнение ще ни помогне да решим кой от методите за клъстериране трябва да използваме най-ефективно за естеството на тези данни.
-
Отворете файла notebook.ipynb в тази папка.
-
Импортирайте пакета
Seabornза добра визуализация на данни.!pip install seaborn -
Добавете данните за песните от nigerian-songs.csv. Заредете dataframe с някои данни за песните. Подгответе се да изследвате тези данни чрез импортиране на библиотеките и извеждане на данните:
import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("../data/nigerian-songs.csv") df.head()Проверете първите няколко реда на данните:
name album artist artist_top_genre release_date length popularity danceability acousticness energy instrumentalness liveness loudness speechiness tempo time_signature 0 Sparky Mandy & The Jungle Cruel Santino alternative r&b 2019 144000 48 0.666 0.851 0.42 0.534 0.11 -6.699 0.0829 133.015 5 1 shuga rush EVERYTHING YOU HEARD IS TRUE Odunsi (The Engine) afropop 2020 89488 30 0.71 0.0822 0.683 0.000169 0.101 -5.64 0.36 129.993 3 2 LITT! LITT! AYLØ indie r&b 2018 207758 40 0.836 0.272 0.564 0.000537 0.11 -7.127 0.0424 130.005 4 3 Confident / Feeling Cool Enjoy Your Life Lady Donli Nigerian pop 2019 175135 14 0.894 0.798 0.611 0.000187 0.0964 -4.961 0.113 111.087 4 4 wanted you rare. Odunsi (The Engine) afropop 2018 152049 25 0.702 0.116 0.833 0.91 0.348 -6.044 0.0447 105.115 4 -
Вземете някаква информация за dataframe, като извикате
info():df.info()Изходът изглежда така:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 530 entries, 0 to 529 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 530 non-null object 1 album 530 non-null object 2 artist 530 non-null object 3 artist_top_genre 530 non-null object 4 release_date 530 non-null int64 5 length 530 non-null int64 6 popularity 530 non-null int64 7 danceability 530 non-null float64 8 acousticness 530 non-null float64 9 energy 530 non-null float64 10 instrumentalness 530 non-null float64 11 liveness 530 non-null float64 12 loudness 530 non-null float64 13 speechiness 530 non-null float64 14 tempo 530 non-null float64 15 time_signature 530 non-null int64 dtypes: float64(8), int64(4), object(4) memory usage: 66.4+ KB -
Проверете отново за null стойности, като извикате
isnull()и проверите сумата дали е 0:df.isnull().sum()Изглежда добре:
name 0 album 0 artist 0 artist_top_genre 0 release_date 0 length 0 popularity 0 danceability 0 acousticness 0 energy 0 instrumentalness 0 liveness 0 loudness 0 speechiness 0 tempo 0 time_signature 0 dtype: int64 -
Описване на данните:
df.describe()release_date length popularity danceability acousticness energy instrumentalness liveness loudness speechiness tempo time_signature count 530 530 530 530 530 530 530 530 530 530 530 530 mean 2015.390566 222298.1698 17.507547 0.741619 0.265412 0.760623 0.016305 0.147308 -4.953011 0.130748 116.487864 3.986792 std 3.131688 39696.82226 18.992212 0.117522 0.208342 0.148533 0.090321 0.123588 2.464186 0.092939 23.518601 0.333701 min 1998 89488 0 0.255 0.000665 0.111 0 0.0283 -19.362 0.0278 61.695 3 25% 2014 199305 0 0.681 0.089525 0.669 0 0.07565 -6.29875 0.0591 102.96125 4 50% 2016 218509 13 0.761 0.2205 0.7845 0.000004 0.1035 -4.5585 0.09795 112.7145 4 75% 2017 242098.5 31 0.8295 0.403 0.87575 0.000234 0.164 -3.331 0.177 125.03925 4 max 2020 511738 73 0.966 0.954 0.995 0.91 0.811 0.582 0.514 206.007 5
🤔 Ако работим с клъстеризация, ненаблюдавана техника, която не изисква етикетирани данни, защо показваме тези данни с етикети? Във фазата на изследване на данните те са полезни, но не са необходими за работата на алгоритмите за клъстеризация. Можете също така да премахнете заглавията на колоните и да се отнасяте към данните по номера на колоната.
Вижте общите стойности на данните. Обърнете внимание, че популярността може да бъде '0', което показва песни без класиране. Нека скоро ги премахнем.
-
Използвайте диаграма с колони, за да разберете най-популярните жанрове:
import seaborn as sns top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top[:5].index,y=top[:5].values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')
✅ Ако искате да видите повече водещи стойности, променете горната граница [:5] на по-голяма стойност или я премахнете, за да видите всички.
Обърнете внимание, че когато най-популярният жанр е описан като 'Missing', това означава, че Spotify не го е класифицирал, така че нека го премахнем.
-
Премахнете липсващи данни чрез филтриране
df = df[df['artist_top_genre'] != 'Missing'] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')Сега проверете отново жанровете:
-
Най-много доминират трите основни жанра в този набор от данни. Нека се съсредоточим върху
afro dancehall,afropopиnigerian pop, като допълнително филтрираме набора, за да премахнем всичко с нулева популярност (което означава, че не е било класифицирано с популярност в набора и може да се счита за шум за нашите цели):df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] df = df[(df['popularity'] > 0)] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') -
Направете бърз тест, за да видите дали данните корелират по някакъв особено силен начин:
corrmat = df.corr(numeric_only=True) f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True)Единствената силна корелация е между
energyиloudness, което не е изненадващо, тъй като силната музика обикновено е доста енергична. В противен случай корелациите са сравнително слаби. Интересно ще бъде да видим какво може да извлече алгоритъм за клъстеризация от тези данни.🎓 Имайте предвид, че корелацията не означава причинно-следствена връзка! Имаме доказателство за корелация, но няма доказателство за причинност. Забавен уебсайт показва визуализации, които подчертават този факт.
Има ли съвпадение в този набор от данни относно възприеманата популярност на песен и нейната danceability? FacetGrid показва, че има концентрични кръгове, които се подреждат, независимо от жанра. Може би нигерийският вкус се събира на определено ниво на danceability за този жанр?
✅ Опитайте с различни данни (енергия, шум, речовитост) и повече или различни музикални жанрове. Какво можете да откриете? Вижте таблицата df.describe(), за да видите общото разпределение на данните.
Упражнение - разпределение на данните
Дали тези три жанра значително се различават във възприятията за тяхната danceability, базирано на тяхната популярност?
-
Изследвайте разпределението на данните на трите водещи жанра по отношение на популярност и danceability по дадени оси x и y.
sns.set_theme(style="ticks") g = sns.jointplot( data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde", )Можете да откриете концентрични кръгове около обща точка на сближаване, показваща разпределението на точките.
🎓 Обърнете внимание, че този пример използва графика KDE (оценка на ядровата плътност), която представлява данните чрез непрекъсната крива на вероятностната плътност. Това ни позволява да интерпретираме данните, когато работим с множество разпределения.
По принцип трите жанра се подреждат непрецизно по отношение на тяхната популярност и danceability. Определянето на клъстери в тези свободно подредени данни ще бъде предизвикателство:
-
Създайте scatter plot:
sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend()Разпръсната графика със същите оси показва подобен модел на сближаване
По принцип за клъстеризация можете да използвате scatterplot-и, за да покажете клъстери от данни, така че овладяването на този тип визуализация е много полезно. В следващия урок ще вземем този филтриран набор от данни и ще използваме k-means клъстеризация, за да открием групи в тези данни, които изглеждат, че се припокриват по интересен начин.
🚀Предизвикателство
В подготовка за следващия урок направете диаграма за различните алгоритми за клъстеризация, които може да откриете и използвате в производствена среда. Какви проблеми се опитва да реши клъстеризацията?
Кратък тест след лекцията
Преглед и самообучение
Преди да приложите алгоритми за клъстеризация, както научихме, е добра идея да разберете естеството на вашия набор от данни. Прочетете повече по темата тук
Тази полезна статия ви води през различните начини, по които различните алгоритми за клъстеризация работят при различни форми на данните.
Задача
Изследвайте други визуализации за клъстеризация
Отказ от отговорност: Този документ е преведен с помощта на AI преводачески услуга Co-op Translator. Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.









