K-Means Clustering за допомогою методу Elbow PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Кластеризація K-Means за методом Elbow

Кластеризація K-середніх — це алгоритм неконтрольованого навчання, який групує дані на основі евклідової відстані кожної точки до центральної точки, яка називається центроїд. Центроїди визначаються за допомогою всіх точок, які знаходяться в одному кластері. Алгоритм спочатку вибирає випадкові точки як центроїди, а потім повторює їх коригування до повної конвергенції.

При використанні K-середніх важливо пам’ятати, що кількість кластерів є гіперпараметром, його буде визначено перед запуском моделі.

K-means можна реалізувати за допомогою Scikit-Learn лише за допомогою 3 рядків коду. Scikit-learn також уже має доступний метод оптимізації центроїда, km означає++, що допомагає моделі сходитися швидше.

Щоб застосувати алгоритм кластеризації K-середніх, давайте завантажимо Пінгвіни Палмера набір даних, виберіть стовпці, які буде кластеризовано, і використовуйте Seaborn, щоб побудувати діаграму розсіювання з кольоровими кодами кластерів.

примітки: Ви можете завантажити набір даних тут link.

Давайте імпортуємо бібліотеки та завантажимо набір даних Penguins, обрізаючи його до вибраних стовпців і видаляючи рядки з відсутніми даними (їх було лише 2):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df = pd.read_csv('penguins.csv')
print(df.shape) 
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)

Ми можемо використовувати метод Elbow, щоб отримати індикацію кластерів для наших даних. Він полягає в трактуванні лінійного сюжету з ліктьовою формою. Кількість кластерів - це ліктьові згини. Вісь х на графіку – це кількість кластерів, а вісь y – сума квадратів усередині кластерів (WCSS) для кожної кількості кластерів:

wcss = []

for i in range(1, 11):
    clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering.fit(df)
    wcss.append(clustering.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);

Метод ліктя показує, що наші дані мають 2 кластери. Побудуємо графік даних до і після кластеризації:

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');

K-Means Clustering за допомогою методу Elbow PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Цей приклад показує, що метод Elbow є лише еталонним, коли використовується для вибору кількості кластерів. Ми вже знаємо, що у нас є 3 типи пінгвінів у наборі даних, але якби ми мали визначити їхню кількість за допомогою методу Elbow, нашим результатом було б 2 кластери.

Оскільки K-середні чутливі до дисперсії даних, давайте подивимося на описову статистику стовпців, які ми кластеризуємо:

df.describe().T 

Це призводить до:

 					count 	mean 		std 		min 	25% 	50% 	75% 	max
bill_length_mm 		342.0 	43.921930 	5.459584 	32.1 	39.225 	44.45 	48.5 	59.6
flipper_length_mm 	342.0 	200.915205 	14.061714 	172.0 	190.000 197.00 	213.0 	231.0

Зверніть увагу, що середнє значення далеке від стандартного відхилення (стандартного відхилення), це вказує на високу дисперсію. Давайте спробуємо зменшити його, масштабуючи дані за допомогою стандартного масштабувальника:

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
scaled = ss.fit_transform(df)

Тепер давайте повторимо процес методу Elbow для масштабованих даних:

wcss_sc = []

for i in range(1, 11):
    clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering_sc.fit(scaled)
    wcss_sc.append(clustering_sc.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);

K-Means Clustering за допомогою методу Elbow PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Цього разу запропонована кількість кластерів становить 3. Ми можемо знову побудувати дані з мітками кластерів разом із двома попередніми графіками для порівняння:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');

K-Means Clustering за допомогою методу Elbow PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

При використанні K-means Clustering необхідно заздалегідь визначити кількість кластерів. Як ми бачили під час використання методу вибору нашого k кількість кластерів, результат є лише пропозицією, і на нього може вплинути кількість розбіжностей у даних. Під час кластеризації важливо провести поглиблений аналіз і створити більше однієї моделі з різними _k_s.

Якщо немає попередньої індикації кількості кластерів у даних, візуалізуйте їх, протестуйте та інтерпретуйте, щоб побачити, чи мають результати кластеризації сенс. Якщо ні, згрупуйте знову. Крім того, подивіться більше ніж на одну метрику та створіть різні моделі кластеризації – для K-середніх подивіться на оцінку силуету та, можливо, на ієрархічну кластеризацію, щоб побачити, чи результати залишаться незмінними.

Часова мітка:

Більше від Stackabuse