راهنمای قطعی برای خوشه‌بندی سلسله مراتبی با پایتون و هوش داده‌های پلاتوبلاک چین Scikit-Learn. جستجوی عمودی Ai.

راهنمای قطعی خوشه بندی سلسله مراتبی با پایتون و Scikit-Learn

معرفی

در این راهنما، ما بر روی پیاده سازی تمرکز خواهیم کرد الگوریتم خوشه‌بندی سلسله مراتبی با Scikit-Learn برای حل یک مشکل بازاریابی

پس از خواندن راهنما متوجه خواهید شد:

  • چه زمانی باید از خوشه بندی سلسله مراتبی استفاده کرد
  • چگونه مجموعه داده را تجسم کنیم تا بفهمیم آیا برای خوشه بندی مناسب است یا خیر
  • نحوه پیش پردازش ویژگی ها و مهندسی ویژگی های جدید بر اساس مجموعه داده
  • نحوه کاهش ابعاد مجموعه داده با استفاده از PCA
  • نحوه استفاده و خواندن دندروگرام برای گروه های مجزا
  • روش های مختلف پیوند و معیارهای فاصله اعمال شده برای دندروگرام ها و الگوریتم های خوشه بندی چیست؟
  • استراتژی های خوشه بندی انباشته و تقسیمی چیست و چگونه کار می کنند
  • نحوه پیاده‌سازی خوشه‌بندی سلسله مراتبی با Scikit-Learn
  • رایج ترین مشکلات هنگام برخورد با الگوریتم های خوشه بندی چیست و چگونه آنها را حل کنیم

توجه داشته باشید: می توانید نوت بوک حاوی تمام کدهای موجود در این راهنما را دانلود کنید اینجا کلیک نمایید.

انگیزه

سناریویی را تصور کنید که در آن شما بخشی از یک تیم علم داده هستید که با بخش بازاریابی ارتباط برقرار می کند. بازاریابی مدتی است که داده های خرید مشتری را جمع آوری کرده است و آنها می خواهند بر اساس داده های جمع آوری شده بفهمند که آیا وجود دارد شباهت های بین مشتریان. این شباهت ها مشتریان را به گروه هایی تقسیم می کند و داشتن گروه های مشتری به هدف گذاری کمپین ها، تبلیغات، تبدیل ها و ایجاد روابط بهتر با مشتری کمک می کند.

آیا راهی وجود دارد که بتوانید در تعیین مشتریان مشابه کمک کنید؟ چند نفر از آنها متعلق به یک گروه هستند؟ و چند گروه مختلف وجود دارد؟

یکی از راه های پاسخ به این سوالات استفاده از الف است خوشه بندی الگوریتم‌هایی مانند K-Means، DBSCAN، Hierarchical Clustering و غیره. به‌طور کلی، الگوریتم‌های خوشه‌بندی شباهت‌هایی بین نقاط داده پیدا کرده و آنها را گروه‌بندی می‌کنند.

در این مورد، داده های بازاریابی ما نسبتاً کوچک است. ما فقط در مورد 200 مشتری اطلاعات داریم. با توجه به تیم بازاریابی، مهم است که بتوانیم به وضوح برای آنها توضیح دهیم که چگونه تصمیمات بر اساس تعداد خوشه ها گرفته شده است، بنابراین برای آنها توضیح دهیم که الگوریتم واقعا چگونه کار می کند.

از آنجایی که داده های ما کوچک است و توضیح پذیری یک عامل اصلی است، ما می توانیم اهرم استفاده کنیم خوشه بندی سلسله مراتبی برای حل این مسئله. این فرآیند همچنین به عنوان شناخته شده است تجزیه و تحلیل خوشه بندی سلسله مراتبی (HCA).

یکی از مزایای HCA این است که قابل تفسیر است و روی مجموعه داده های کوچک به خوبی کار می کند.

نکته دیگری که در این سناریو باید مورد توجه قرار گیرد این است که HCA یک یک است نظارت نشده الگوریتم هنگام گروه‌بندی داده‌ها، ما راهی برای تأیید اینکه به درستی تشخیص می‌دهیم که یک کاربر به یک گروه خاص تعلق دارد، نداریم (گروه‌ها را نمی‌شناسیم). هیچ برچسبی وجود ندارد که بتوانیم نتایج خود را با آن مقایسه کنیم. اگر گروه ها را به درستی شناسایی کنیم، بعداً توسط بخش بازاریابی به صورت روزانه تأیید می شود (که با معیارهایی مانند ROI، نرخ تبدیل و غیره اندازه گیری می شود).

اکنون که مشکلی را که می‌خواهیم حل کنیم و نحوه حل آن را فهمیدیم، می‌توانیم نگاهی به داده‌های خود بیندازیم!

تجزیه و تحلیل داده های اکتشافی مختصر

توجه داشته باشید: می توانید مجموعه داده استفاده شده در این راهنما را دانلود کنید اینجا کلیک نمایید.

پس از دانلود مجموعه داده، توجه کنید که a است CSV (مقادیر جدا شده با کاما) فایل فراخوانی شد shopping-data.csv. برای آسان‌تر کردن کاوش و دستکاری داده‌ها، آن‌ها را در a بارگذاری می‌کنیم DataFrame استفاده از پاندا:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

مارکتینگ گفت 200 سوابق مشتری را جمع آوری کرده است. ما می توانیم بررسی کنیم که آیا داده های بارگیری شده با 200 ردیف کامل است یا خیر shape صفت. به ما می گوید که به ترتیب چند سطر و ستون داریم:

customer_data.shape

این نتیجه در:

(200, 5)

عالی! داده های ما با 200 ردیف کامل است (سوابق مشتری) و همچنین 5 ستون داریم (امکانات). برای اینکه ببینیم بخش بازاریابی چه ویژگی هایی را از مشتریان جمع آوری کرده است، می توانیم نام ستون ها را با آن ببینیم columns صفت. برای انجام این کار، اجرا کنید:

customer_data.columns

اسکریپت بالا برمیگرده:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

در اینجا، ما می بینیم که بازاریابی ایجاد کرده است CustomerID، جمع آوری کرد Genre, Age, Annual Income (به هزار دلار) و الف Spending Score از 1 تا 100 برای هر 200 مشتری. وقتی برای توضیح خواسته شد، آنها گفتند که مقادیر موجود در Spending Score ستون نشان می دهد که یک فرد چند وقت یکبار در یک مرکز خرید در مقیاس 1 تا 100 پول خرج می کند. به عبارت دیگر، اگر یک مشتری امتیاز 0 داشته باشد، این شخص هرگز پول خرج نمی کند و اگر امتیاز 100 باشد، ما به تازگی متوجه شده ایم. بیشترین مصرف کننده

بیایید نگاهی گذرا به توزیع این امتیاز بیندازیم تا عادات خرج کردن کاربران را در مجموعه داده خود بررسی کنیم. آنجاست که پانداها hist() روش کمک می کند:

customer_data['Spending Score (1-100)'].hist()

IMG

با نگاهی به هیستوگرام می بینیم که بیش از 35 مشتری بین آنها امتیاز دارند 40 و 60، سپس کمتر از 25 امتیاز بین آنها وجود دارد 70 و 80. بنابراین اکثر مشتریان ما هستند مصرف کنندگان متعادلو پس از آن خرج کنندگان متوسط ​​تا زیاد. همچنین می توانیم ببینیم که یک خط بعد از آن وجود دارد 0، در سمت چپ توزیع، و یک خط دیگر قبل از 100، در سمت راست توزیع. این فضاهای خالی احتمالاً به این معنی است که توزیع شامل افراد غیر مصرف کننده نیست، که دارای امتیاز 0، و همچنین هیچ خرج کننده بالایی با امتیاز وجود ندارد 100.

برای بررسی درستی این موضوع، می‌توانیم به مقادیر حداقل و حداکثر توزیع نگاه کنیم. این مقادیر را می توان به راحتی به عنوان بخشی از آمار توصیفی یافت، بنابراین می توانیم از آن استفاده کنیم describe() روش برای درک سایر توزیع های مقادیر عددی:


customer_data.describe().transpose()

این جدولی به ما می دهد که از آنجا می توانیم توزیع مقادیر دیگر مجموعه داده خود را بخوانیم:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

فرضیه ما تایید می شود. را min ارزش Spending Score is 1 و حداکثر است 99. پس نداریم 0 or 100 امتیاز مصرف کنندگان بیایید سپس نگاهی به ستون های دیگر از انتقال بیاندازیم describe جدول. هنگام نگاه کردن به mean و std ستون ها، ما می توانیم آن را برای Age la mean is 38.85 و std در حدود 13.97. همین اتفاق برای Annual Income، با mean of 60.56 و std 26.26، و برای Spending Score با یک mean of 50 و std of 25.82. برای همه ویژگی ها، mean دور از انحراف معیار است که نشان می دهد داده های ما دارای تنوع بالایی هستند.

برای درک بهتر اینکه چگونه داده های ما تغییر می کند، اجازه دهید نمودار را ترسیم کنیم Annual Income توزیع:

customer_data['Annual Income (k$)'].hist()

که به ما می دهد:

IMG

در هیستوگرام توجه کنید که بیشتر داده های ما، بیش از 35 مشتری، در نزدیکی تعداد متمرکز شده اند 60، بر روی ... ما mean، در محور افقی. اما وقتی به سمت انتهای توزیع حرکت می کنیم چه اتفاقی می افتد؟ وقتی به سمت چپ می رویم، از میانگین 60.560 دلار، مقدار بعدی که با آن مواجه می شویم 34.300 دلار است – میانگین (60.560 دلار) منهای تغییرات استاندارد (26.260 دلار). اگر به سمت چپ توزیع داده‌های خود دورتر برویم، قانون مشابهی اعمال می‌شود، تغییر استاندارد (26.260 دلار) را از مقدار فعلی (34.300 دلار) کم می‌کنیم. بنابراین، با مقدار 8.040 دلار مواجه خواهیم شد. توجه کنید که چگونه داده های ما از 60 هزار دلار به سرعت به 8 هزار دلار رسید. هر بار 26.260 دلار "پرش" دارد - بسیار متفاوت است، و به همین دلیل است که ما چنین تنوع بالایی داریم.

IMG

تنوع و اندازه داده ها در تجزیه و تحلیل خوشه بندی مهم است زیرا اندازه گیری های فاصله بسیاری از الگوریتم های خوشه بندی به بزرگی داده ها حساس هستند. تفاوت در اندازه می‌تواند نتایج خوشه‌بندی را با نزدیک‌تر یا دورتر جلوه دادن یک نقطه به نقطه دیگر از آنچه که هست تغییر دهد و گروه‌بندی واقعی داده‌ها را مخدوش کند.

تا کنون، شکل داده های خود، برخی از توزیع های آن و آمار توصیفی را دیده ایم. با پانداها، ما همچنین می‌توانیم انواع داده‌هایمان را فهرست کنیم و ببینیم که آیا همه 200 ردیف ما پر شده‌اند یا تعدادی دارند. null ارزش های:

customer_data.info()

این نتیجه در:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

در اینجا، می بینیم که هیچ وجود ندارد null مقادیر در داده ها و اینکه ما فقط یک ستون طبقه بندی داریم – Genre. در این مرحله، مهم است که در نظر داشته باشیم چه ویژگی هایی برای اضافه شدن به مدل خوشه بندی جالب به نظر می رسد. اگر بخواهیم ستون Genre را به مدل خود اضافه کنیم، باید مقادیر آن را از آن تغییر دهیم طبقه ای به عددی.

بیایید ببینیم چطور Genre با نگاهی سریع به 5 مقدار اول داده های ما پر می شود:

customer_data.head() 

این نتیجه در:

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

به نظر می رسد که فقط دارد Female و Male دسته بندی ها. ما می توانیم با نگاهی به ارزش های منحصر به فرد آن مطمئن شویم unique:

customer_data['Genre'].unique()

این فرض ما را تأیید می کند:

array(['Male', 'Female'], dtype=object)

تا اینجا ما می دانیم که تنها دو ژانر داریم، اگر بخواهیم از این ویژگی در مدل خود استفاده کنیم، Male می تواند تبدیل شود به 0 و Female به 1. همچنین مهم است که نسبت بین ژانرها را بررسی کنید تا ببینید آیا آنها متعادل هستند یا خیر. ما می توانیم این کار را با value_counts() روش و استدلال آن normalize=True برای نشان دادن درصد بین Male و Female:

customer_data['Genre'].value_counts(normalize=True)

این خروجی:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

ما 56 درصد از زنان در مجموعه داده ها و 44 درصد از مردان را داریم. تفاوت بین آنها فقط 16٪ است و داده های ما 50/50 نیست بلکه این است به اندازه کافی متعادل تا مشکلی ایجاد نشود اگر نتایج 70/30، 60/40 بود، ممکن است برای جمع‌آوری داده‌های بیشتر یا استفاده از نوعی تکنیک افزایش داده‌ها برای متعادل‌تر کردن این نسبت مورد نیاز باشد.

تا به حال، همه ویژگی ها اما Age، به اختصار مورد بررسی قرار گرفته است. در چه دغدغه هایی Age، معمولاً جالب است که آن را به سطل ها تقسیم کنید تا بتوانید مشتریان را بر اساس گروه سنی آنها تقسیم بندی کنید. اگر این کار را انجام دهیم، باید رده های سنی را قبل از اضافه کردن آنها به مدل خود به یک عدد تبدیل کنیم. به این ترتیب، به جای استفاده از دسته بندی 15-20 سال، تعداد مشتریان را در این دسته حساب می کنیم 15-20 دسته، و آن عددی در ستون جدیدی به نام خواهد بود 15-20.

مشاوره: در این راهنما، ما تنها تجزیه و تحلیل داده های اکتشافی مختصری را ارائه می کنیم. اما شما می توانید جلوتر بروید و باید جلوتر بروید. می توانید ببینید که آیا تفاوت درآمد و تفاوت امتیازات بر اساس ژانر و سن وجود دارد یا خیر. این نه تنها تجزیه و تحلیل را غنی می کند، بلکه منجر به نتایج بهتر مدل می شود. برای عمیق تر شدن به تجزیه و تحلیل داده های اکتشافی، این را بررسی کنید فصل EDA در "پیش‌بینی قیمت خانه – یادگیری ماشینی در پایتون" پروژه هدایت شده

پس از حدس زدن در مورد آنچه که می توان با هر دو دسته بندی – یا طبقه بندی بودن – انجام داد. Genre و Age ستون، بیایید آنچه را که بحث شد اعمال کنیم.

رمزگذاری متغیرها و مهندسی ویژگی

بیایید با تقسیم کردن شروع کنیم Age به گروه هایی که در 10 تغییر می کنند، به طوری که ما 20-30، 30-40، 40-50، و غیره داریم. از آنجایی که جوان‌ترین مشتری ما 15 سال دارد، می‌توانیم از 15 سالگی شروع کنیم و در 70 سالگی به پایان برسانیم، که سن پیرترین مشتری در داده‌ها است. با شروع از 15 و پایان دادن به 70، فواصل 15-20، 20-30، 30-40، 40-50، 50-60 و 60-70 را خواهیم داشت.

گروه کردن یا صندوق Age مقادیر را در این فواصل، می توانیم از پانداها استفاده کنیم cut() روشی برای برش آنها به سطل ها و سپس تخصیص بن ها به یک سطل جدید Age Groups ستون:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

این نتیجه در:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

توجه داشته باشید که هنگام نگاه کردن به مقادیر ستون، یک خط نیز وجود دارد که مشخص می کند 6 دسته داریم و تمام فواصل داده های binned را نمایش می دهد. به این ترتیب، داده‌های عددی قبلی خود را دسته‌بندی کرده و یک جدید ایجاد کرده‌ایم Age Groups ویژگی.

و در هر دسته چند مشتری داریم؟ با گروه بندی ستون و شمارش مقادیر با آن می توانیم به سرعت متوجه شویم groupby() و count():

customer_data.groupby('Age Groups')['Age Groups'].count()

این نتیجه در:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

به راحتی می توان تشخیص داد که اکثر مشتریان بین 30 تا 40 سال سن دارند و پس از آن مشتریان بین 20 تا 30 سال و سپس مشتریان بین 40 تا 50 سال قرار دارند. این نیز اطلاعات خوبی برای بخش بازاریابی است.

در حال حاضر، ما دو متغیر دسته بندی داریم، Age و Genre، که باید آن را به اعداد تبدیل کنیم تا بتوانیم در مدل خود استفاده کنیم. راه های مختلفی برای ایجاد این تغییر وجود دارد - ما از پانداها استفاده خواهیم کرد get_dummies() روشی که برای هر بازه و ژانر یک ستون جدید ایجاد می کند و سپس مقادیر آن را با 0 و 1 پر می کند - این نوع عملیات نامیده می شود. رمزگذاری تک داغ. بیایید ببینیم چگونه به نظر می رسد:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

این یک پیش نمایش از جدول حاصل را به ما می دهد:

IMG

با خروجی، به راحتی می توان متوجه شد که ستون Genre به ستون تقسیم شد - Genre_Female و Genre_Male. وقتی مشتری زن است، Genre_Female برابر است با 1، و وقتی مشتری مرد باشد برابر است 0.

همچنین Age Groups ستون به 6 ستون تقسیم شد، یکی برای هر بازه، مانند Age Groups_(15, 20], Age Groups_(20, 30]، و غیره. به همان صورت که Genre، زمانی که مشتری 18 ساله است، Age Groups_(15, 20] ارزش است 1 و ارزش تمام ستون های دیگر است 0.

La مزیت رمزگذاری تک داغ سادگی در نمایش مقادیر ستون است، درک آنچه در حال رخ دادن است ساده است - در حالی که عیب این است که ما اکنون 8 ستون اضافی ایجاد کرده ایم تا با ستون هایی که قبلاً داشتیم جمع بندی کنیم.

هشدار: اگر مجموعه داده ای دارید که در آن تعداد ستون های کدگذاری شده یک داغ از تعداد ردیف ها بیشتر است، بهتر است از روش رمزگذاری دیگری برای جلوگیری از مسائل مربوط به ابعاد داده استفاده کنید.

رمزگذاری تک داغ همچنین 0 ها را به داده های ما اضافه می کند و آنها را پراکنده تر می کند، که می تواند برای برخی از الگوریتم هایی که به پراکندگی داده ها حساس هستند مشکل ساز باشد.

برای نیازهای خوشه‌بندی ما، به نظر می‌رسد رمزگذاری یک‌طرفه کار می‌کند. اما می‌توانیم داده‌ها را رسم کنیم تا ببینیم آیا واقعاً گروه‌های مجزایی برای خوشه‌بندی وجود دارد یا خیر.

پلات اساسی و کاهش ابعاد

مجموعه داده ما 11 ستون دارد و راه هایی وجود دارد که می توانیم آن داده ها را تجسم کنیم. اولین مورد با ترسیم آن در 10 بعدی است (موفق باشید). ده چون Customer_ID ستون در نظر گرفته نمی شود. مورد دوم با ترسیم ویژگی های عددی اولیه است و سومی با تبدیل 10 ویژگی ما به 2 - بنابراین، انجام کاهش ابعاد.

ترسیم هر جفت داده

از آنجایی که ترسیم 10 بعد کمی غیرممکن است، ما رویکرد دوم را انتخاب می کنیم - ویژگی های اولیه خود را ترسیم می کنیم. ما می توانیم دو مورد از آنها را برای تجزیه و تحلیل خوشه بندی خود انتخاب کنیم. یکی از راه‌هایی که می‌توانیم تمام جفت‌های داده خود را با هم ترکیب کنیم، Seaborn است pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

که نمایش می دهد:

IMG

در یک نگاه، می‌توانیم نمودارهای پراکنده را که به نظر می‌رسد دارای گروه‌هایی از داده‌ها هستند، تشخیص دهیم. یکی که جالب به نظر می رسد، طرح پراکندگی است که ترکیب می شود Annual Income و Spending Score. توجه داشته باشید که هیچ جدایی واضحی بین سایر نمودارهای پراکندگی متغیر وجود ندارد. حداکثر، شاید بتوانیم بگوییم که دو غلظت مجزا از نقاط در آن وجود دارد Spending Score vs Age طرح پراکنده.

هر دو پراکنده متشکل از Annual Income و Spending Score در اصل یکسان هستند. ما می توانیم آن را دو بار ببینیم زیرا محور x و y رد و بدل شده اند. با نگاهی به هر یک از آنها، می‌توانیم پنج گروه مختلف را ببینیم. بیایید فقط این دو ویژگی را با Seaborn ترسیم کنیم scatterplot() برای نگاه دقیق تر:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

IMG

با نگاه دقیق تر، قطعاً می توانیم 5 گروه مختلف داده را تشخیص دهیم. به نظر می رسد مشتریان ما را می توان بر اساس میزان درآمد آنها در یک سال و میزان هزینه آنها دسته بندی کرد. این یکی دیگر از نکات مرتبط در تحلیل ما است. مهم است که ما فقط دو ویژگی را برای گروه بندی مشتریان خود در نظر می گیریم. هر اطلاعات دیگری که در مورد آنها داریم وارد معادله نمی شود. این معنی تحلیل را می دهد - اگر بدانیم مشتری چقدر درآمد و هزینه می کند، می توانیم به راحتی شباهت های مورد نیاز خود را پیدا کنیم.

IMG

عالیه! تاکنون دو متغیر برای ساخت مدل خود داریم. علاوه بر آنچه که این نشان می دهد، مدل را ساده تر، مقرون به صرفه تر و قابل توضیح تر می کند.

راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!

توجه داشته باشید: علم داده معمولاً از رویکردهای ساده تا حد امکان استفاده می کند. نه تنها به این دلیل که توضیح برای کسب و کار آسان تر است، بلکه به دلیل مستقیم تر بودن آن - با 2 ویژگی و یک مدل قابل توضیح، مشخص است که مدل چه کاری انجام می دهد و چگونه کار می کند.

رسم داده ها پس از استفاده از PCA

به نظر می رسد رویکرد دوم ما احتمالاً بهترین باشد، اما بیایید نگاهی به رویکرد سوم خود نیز بیندازیم. زمانی که نمی‌توانیم داده‌ها را ترسیم کنیم، زیرا ابعاد بسیار زیادی دارند، یا زمانی که غلظت داده‌ها یا جداسازی واضح در گروه‌ها وجود ندارد، می‌تواند مفید باشد. هنگامی که آن موقعیت ها رخ می دهد، توصیه می شود سعی کنید ابعاد داده ها را با روشی به نام کاهش دهید تجزیه و تحلیل مincipلفه های اصلی (PCA).

توجه داشته باشید: اکثر مردم از PCA برای کاهش ابعاد قبل از تجسم استفاده می کنند. روش های دیگری نیز وجود دارد که به تجسم داده ها قبل از خوشه بندی کمک می کند، مانند خوشه بندی فضایی مبتنی بر چگالی برنامه های کاربردی با نویز (DBSCAN) و نقشه های خودسازماندهی (SOM) خوشه بندی هر دو الگوریتم های خوشه بندی هستند، اما می توانند برای تجسم داده ها نیز استفاده شوند. از آنجایی که تجزیه و تحلیل خوشه بندی استاندارد طلایی ندارد، مقایسه تجسم های مختلف و الگوریتم های مختلف مهم است.

PCA ابعاد داده های ما را کاهش می دهد و در عین حال تلاش می کند تا حد امکان اطلاعات خود را حفظ کند. بیایید ابتدا ایده ای در مورد نحوه عملکرد PCA داشته باشیم و سپس می توانیم انتخاب کنیم که داده های خود را به چند بعد کاهش دهیم.

برای هر جفت ویژگی، PCA می بیند که آیا مقادیر بیشتر یک متغیر با مقادیر بیشتر متغیر دیگر مطابقت دارد یا خیر، و برای مقادیر کمتر نیز همین کار را انجام می دهد. بنابراین، اساساً محاسبه می کند که مقادیر ویژگی ها نسبت به یکدیگر چقدر متفاوت است - ما آن را آنها می نامیم کواریانس. سپس آن نتایج در یک ماتریس سازماندهی می شوند و a به دست می آید ماتریس کوواریانس.

پس از بدست آوردن ماتریس کوواریانس، PCA سعی می‌کند ترکیبی خطی از ویژگی‌ها را بیابد که آن را به بهترین شکل توضیح می‌دهد - تا زمانی که مدلی را که توضیح می‌دهد شناسایی کند، با مدل‌های خطی مطابقت دارد. بیشترین مقدار واریانس.

توجه داشته باشید: PCA یک تبدیل خطی است و خطی بودن به مقیاس داده حساس است. بنابراین، PCA زمانی بهترین عملکرد را دارد که همه مقادیر داده در یک مقیاس باشند. این را می توان با کم کردن ستون انجام داد متوسط از مقادیر آن و تقسیم نتیجه بر انحراف معیار آن. که نامیده می شود استاندارد سازی داده ها. قبل از استفاده از PCA، مطمئن شوید که داده ها مقیاس شده اند! اگر مطمئن نیستید چگونه، ما را بخوانید «مقیاس‌سازی داده‌ها با Scikit-Learn برای یادگیری ماشینی در پایتون»!

با یافتن بهترین خط (ترکیب خطی)، PCA جهت محورهای خود را دریافت می کند که نامیده می شود بردارهای ویژهو ضرایب خطی آن، مقادیر ویژه. ترکیبی از بردارهای ویژه و مقادیر ویژه - یا جهت محورها و ضرایب - عبارتند از اجزای اصلی از PCA. و این زمانی است که می‌توانیم تعداد ابعاد خود را بر اساس واریانس توضیح‌داده‌شده هر ویژگی انتخاب کنیم، با درک اینکه کدام مؤلفه‌های اصلی را می‌خواهیم بر اساس میزان واریانسی که توضیح می‌دهند، نگه داریم یا کنار بگذاریم.

پس از به دست آوردن مؤلفه های اصلی، PCA از بردارهای ویژه برای تشکیل بردار ویژگی هایی استفاده می کند که داده ها را از محورهای اصلی به محورهایی که توسط مؤلفه های اصلی نشان داده شده اند تغییر جهت می دهد - به این ترتیب ابعاد داده کاهش می یابد.

توجه داشته باشید: یکی از جزئیات مهمی که در اینجا باید مورد توجه قرار گیرد این است که، به دلیل ماهیت خطی آن، PCA بیشتر واریانس توضیح داده شده را در اولین مؤلفه‌های اصلی متمرکز می‌کند. بنابراین، وقتی به واریانس توضیح داده شده نگاه می کنیم، معمولاً دو مؤلفه اول ما کافی است. اما ممکن است در برخی موارد گمراه کننده باشد - بنابراین سعی کنید هنگام خوشه بندی نمودارها و الگوریتم های مختلف را با هم مقایسه کنید تا ببینید آیا نتایج مشابهی دارند یا خیر.

قبل از اعمال PCA، باید از بین آن یکی را انتخاب کنیم Age ستون یا Age Groups ستون‌ها در داده‌های کدگذاری شده قبلی ما. از آنجایی که هر دو ستون اطلاعات یکسانی را نشان می دهند، معرفی دوبار آن بر واریانس داده ما تأثیر می گذارد. اگر Age Groups ستون انتخاب شده است، به سادگی آن را حذف کنید Age ستون با استفاده از پانداها drop() روش و دوباره آن را به customer_data_oh متغیر:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

اکنون داده‌های ما 10 ستون دارند، به این معنی که می‌توانیم یک جزء اصلی را به ستون به‌دست آوریم و با اندازه‌گیری اینکه چقدر معرفی یک بعد جدید واریانس داده‌های ما را توضیح می‌دهد، انتخاب کنیم که چه تعداد از آنها استفاده کنیم.

بیایید این کار را با Scikit-Learn انجام دهیم PCA. ما واریانس توضیح داده شده هر بعد را محاسبه خواهیم کرد explained_variance_ratio_ ، و سپس به جمع تجمعی آنها نگاه کنید cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

واریانس های توضیح داده شده تجمعی ما عبارتند از:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

می بینیم که بعد اول 50٪ از داده ها را توضیح می دهد و وقتی با بعد دوم ترکیب می شوند، 99٪ درصد را توضیح می دهند. این بدان معنی است که 2 بعد اول 99٪ از داده های ما را توضیح می دهند. بنابراین می‌توانیم یک PCA با 2 مؤلفه اعمال کنیم، مؤلفه‌های اصلی خود را بدست آوریم و آنها را رسم کنیم:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

IMG

نمودار داده بعد از PCA بسیار شبیه به نموداری است که فقط از دو ستون داده بدون PCA استفاده می کند. توجه داشته باشید که نقاطی که گروه‌ها را تشکیل می‌دهند، نزدیک‌تر هستند و بعد از PCA کمی متمرکزتر از قبل هستند.

IMG

تجسم ساختار سلسله مراتبی با دندروگرام

تا کنون، ما داده‌ها را بررسی کرده‌ایم، ستون‌های طبقه‌بندی کدگذاری شده یک‌طرفه، تصمیم گرفته‌ایم که کدام ستون‌ها برای خوشه‌بندی مناسب هستند و ابعاد داده را کاهش داده‌ایم. نمودارها نشان می دهد که ما 5 خوشه در داده های خود داریم، اما راه دیگری نیز برای تجسم روابط بین نقاط ما و کمک به تعیین تعداد خوشه ها وجود دارد - با ایجاد یک دندروگرام (معمولاً به صورت دندوگرام غلط املایی می شود). دندرو به معنی درخت به زبان لاتین

La دندروگرام نتیجه پیوند نقاط در یک مجموعه داده است. این یک نمایش بصری از فرآیند خوشه بندی سلسله مراتبی است. و فرآیند خوشه بندی سلسله مراتبی چگونه کار می کند؟ خب… بستگی دارد – احتمالاً پاسخی است که قبلاً در Data Science زیاد شنیده اید.

آشنایی با خوشه بندی سلسله مراتبی

هنگامی که الگوریتم خوشه بندی سلسله مراتبی (HCA) شروع به پیوند دادن نقاط و یافتن خوشه ها می کند، ابتدا می تواند نقاط را به 2 گروه بزرگ تقسیم کند و سپس هر یک از آن دو گروه را به 2 گروه کوچکتر تقسیم کند که در مجموع 4 گروه دارد که این متضاد و از بالا به پایین رویکرد.

از طرف دیگر، می‌تواند برعکس عمل کند - می‌تواند به تمام نقاط داده نگاه کند، 2 نقطه نزدیک‌تر به یکدیگر را پیدا کند، آنها را به هم مرتبط کند، و سپس نقاط دیگری را که نزدیک‌ترین آنها به آن نقاط مرتبط هستند بیابد و به ساختن 2 گروه ادامه دهد. از پایین بالا. که هست تجمعی رویکردی که ما توسعه خواهیم داد.

مراحل انجام خوشه بندی سلسله مراتبی تجمعی

برای اینکه رویکرد تجمعی حتی واضح شود، مراحلی از این وجود دارد خوشه بندی سلسله مراتبی تجمعی (AHC) الگوریتم:

  1. در ابتدا، هر نقطه داده را به عنوان یک خوشه در نظر بگیرید. بنابراین، تعداد خوشه ها در ابتدا K خواهد بود – در حالی که K یک عدد صحیح است که تعداد نقاط داده را نشان می دهد.
  2. با پیوستن به دو نزدیک ترین نقطه داده که منجر به خوشه های K-1 می شود، یک خوشه تشکیل دهید.
  3. با پیوستن به دو نزدیکترین خوشه که منجر به خوشه های K-2 می شود، خوشه های بیشتری تشکیل دهید.
  4. سه مرحله بالا را تکرار کنید تا یک خوشه بزرگ تشکیل شود.

توجه داشته باشید: برای ساده‌تر شدن، می‌گوییم «دو نزدیک‌ترین نقطه داده» در مراحل 2 و 3. اما راه‌های بیشتری برای پیوند دادن نقاط وجود دارد که در ادامه خواهیم دید.

اگر مراحل الگوریتم ACH را معکوس کنید، از 4 به 1 بروید - این مراحل به * خواهد بود.خوشه بندی سلسله مراتبی (DHC)*.

توجه داشته باشید که HCA ها می توانند تقسیم کننده و از بالا به پایین و یا تجمعی و از پایین به بالا باشند. رویکرد DHC از بالا به پایین زمانی بهترین کار می کند که خوشه های کمتر اما بزرگتر داشته باشید، بنابراین از نظر محاسباتی گران تر است. از سوی دیگر، رویکرد AHC از پایین به بالا برای زمانی که شما خوشه‌های کوچک‌تر زیادی دارید مناسب است. از نظر محاسباتی ساده‌تر، استفاده‌تر و در دسترس‌تر است.

توجه داشته باشید: از بالا به پایین یا از پایین به بالا، نمایش دندروگرام فرآیند خوشه‌بندی همیشه با تقسیم به دو شروع می‌شود و زمانی که ساختار زیربنایی آن از یک درخت دوتایی باشد، با تفکیک هر نقطه به پایان می‌رسد.

بیایید دندروگرام داده های مشتری خود را ترسیم کنیم تا روابط سلسله مراتبی داده ها را تجسم کنیم. این بار ما از scipy کتابخانه برای ایجاد دندروگرام برای مجموعه داده ما:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

خروجی اسکریپت به شکل زیر است:

IMG

در اسکریپت بالا، ما خوشه‌ها و زیرخوشه‌ها را با نقاط خود ایجاد کرده‌ایم و نحوه پیوند نقاطمان را تعریف کرده‌ایم (با اعمال ward روش)، و نحوه اندازه گیری فاصله بین نقاط (با استفاده از euclidean متریک).

با نمودار دندروگرام، فرآیندهای توصیف شده DHC و AHC را می توان مشاهده کرد. برای تجسم رویکرد بالا به پایین از بالای دندروگرام شروع کنید و به پایین بروید و برعکس آن را انجام دهید، از پایین شروع کنید و به سمت بالا حرکت کنید تا رویکرد پایین به بالا را تجسم کنید.

روش های پیوند

بسیاری از روش های پیوند دیگر وجود دارد که با درک بیشتر در مورد نحوه کار آنها، می توانید روش مناسب را برای نیازهای خود انتخاب کنید. علاوه بر این، هر یک از آنها هنگام اعمال نتایج متفاوتی را به همراه خواهند داشت. در تجزیه و تحلیل خوشه‌بندی قانون ثابتی وجود ندارد، در صورت امکان، ماهیت مشکل را مطالعه کنید تا ببینید کدام یک به بهترین وجه مناسب است، روش‌های مختلف را آزمایش کنید و نتایج را بررسی کنید.

برخی از روش های پیوند عبارتند از:

  • پیوند واحد: همچنین به عنوان نزدیکترین همسایه (NN). فاصله بین خوشه ها با فاصله بین نزدیکترین اعضای آنها تعریف می شود.

IMG

  • پیوند کامل: همچنین به عنوان دورترین همسایه (FN), الگوریتم دورترین نقطه، یا الگوریتم Voor Hees. فاصله بین خوشه ها با فاصله بین دورترین اعضای آنها تعریف می شود. این روش از نظر محاسباتی گران است.

IMG

  • پیوند متوسط: همچنین به عنوان شناخته می شود UPGMA (روش گروه زوج وزن نشده با میانگین حسابی). درصد تعداد نقاط هر خوشه با توجه به تعداد نقاط دو خوشه در صورت ادغام آنها محاسبه می شود.

IMG

  • پیوند وزنی: همچنین به عنوان شناخته می شود WPGMA (روش گروه زوج وزنی با میانگین حسابی). نقاط مجزای دو خوشه به فاصله جمعی بین یک خوشه کوچکتر و یک خوشه بزرگتر کمک می کند.
  • پیوند مرکز: همچنین به عنوان UPGMC (روش گروه زوج وزن نشده با استفاده از Centroids). برای هر خوشه یک نقطه تعریف شده با میانگین تمام نقاط (مرکز) محاسبه می شود و فاصله بین خوشه ها فاصله بین مرکز مربوطه آنها است.

IMG

  • پیوند بخش: معروف به MISSQ (حداقل افزایش مجموع مربعات). فاصله بین دو خوشه را مشخص می کند، مجموع مربعات خطا (ESS) را محاسبه می کند، و به طور متوالی خوشه های بعدی را بر اساس ESS کوچکتر انتخاب می کند. روش وارد به دنبال به حداقل رساندن افزایش ESS در هر مرحله است. بنابراین، به حداقل رساندن خطا.

IMG

متریک فاصله

علاوه بر پیوند، می‌توانیم برخی از پرکاربردترین معیارهای فاصله را نیز مشخص کنیم:

  • اقلیدسی: همچنین به عنوان فیثاغورثی یا خط مستقیم فاصله فاصله بین دو نقطه در فضا را با اندازه گیری طول پاره خطی که بین آنها می گذرد محاسبه می کند. از قضیه فیثاغورث استفاده می کند و مقدار فاصله نتیجه است (c) از معادله:

$$
c^2 = a^2 + b^2
$$

  • منهتن: همچنین به نام بلوک شهر، تاکسی فاصله مجموع تفاوت های مطلق بین اندازه گیری ها در تمام ابعاد دو نقطه است. اگر آن ابعاد دو باشد، شبیه به راست و سپس چپ در هنگام راه رفتن یک بلوک است.

IMG

  • مینکوفسکی: تعمیم هر دو فاصله اقلیدسی و منهتن است. این روشی برای محاسبه فواصل بر اساس تفاوت مطلق به ترتیب متریک مینکوفسکی است p. اگر چه برای هر تعریف شده است p> 0، به ندرت برای مقادیری غیر از 1، 2 و ∞ (بی نهایت) استفاده می شود. فاصله مینکوفسکی همان فاصله منهتن است که p = 1، و همان فاصله اقلیدسی وقتی p = 2.

$$
سمت چپ(X,Yright) = چپ(جمع_{i=1}^n |x_i-y_i|^راست)^{frac{1}{p}}
$$

IMG

  • چبیشف: همچنین به عنوان شناخته می شود تخته شطرنج فاصله این حالت شدید فاصله مینکوفسکی است. وقتی از بی نهایت به عنوان مقدار پارامتر استفاده می کنیم p (p = ∞)، ما با متریکی مواجه می شویم که فاصله را به عنوان حداکثر اختلاف مطلق بین مختصات تعریف می کند.
  • کسینوس: فاصله کسینوس زاویه ای بین دو دنباله نقطه یا بردار است. شباهت کسینوس حاصل ضرب نقطه ای بردارها بر حاصلضرب طول آنها است.
  • جاکارد: شباهت بین مجموعه های محدود نقاط را اندازه گیری می کند. به عنوان تعداد کل نقاط (کاردینالیته) در نقاط مشترک در هر مجموعه (تقاطع)، تقسیم بر تعداد کل نقاط (کاردینالیته) کل امتیازهای هر دو مجموعه (اتحادیه) تعریف می شود.
  • جنسن-شانون: بر اساس واگرایی کولبک-لایبلر. توزیع احتمال نقاط را در نظر می گیرد و شباهت بین آن توزیع ها را اندازه گیری می کند. این یک روش محبوب تئوری احتمال و آمار است.

ما انتخاب کردیم بخش و اقلیدسی برای دندروگرام زیرا آنها متداول ترین روش و متریک هستند. آنها معمولاً نتایج خوبی می دهند زیرا Ward نقاط را بر اساس به حداقل رساندن خطاها پیوند می دهد و اقلیدسی در ابعاد پایین تر به خوبی کار می کند.

در این مثال، ما با دو ویژگی (ستون) از داده های بازاریابی و 200 مشاهده یا ردیف کار می کنیم. از آنجایی که تعداد مشاهدات بیشتر از تعداد ویژگی ها است (200 > 2)، ما در فضایی با ابعاد کم کار می کنیم.

هنگامی که تعداد ویژگی های (F) بزرگتر از تعداد مشاهدات است (N) - بیشتر به صورت نوشته می شود f >> N، یعنی یک داریم فضای با ابعاد بالا.

اگر بخواهیم ویژگی‌های بیشتری را وارد کنیم، بنابراین بیش از 200 ویژگی داریم، فاصله اقلیدسی ممکن است خیلی خوب کار نکند، زیرا در اندازه‌گیری تمام فواصل کوچک در یک فضای بسیار بزرگ که فقط بزرگ‌تر می‌شود، مشکل خواهد داشت. به عبارت دیگر، رویکرد فاصله اقلیدسی در کار با داده ها مشکل دارد پراکندگی. این موضوعی است که نام دارد نفرین ابعاد. مقادیر فاصله به قدری کوچک می‌شوند که گویی در فضای بزرگ‌تر «رقیق» می‌شوند و تا زمانی که 0 می‌شوند تحریف می‌شوند.

توجه داشته باشید: اگر تا به حال با یک مجموعه داده با f >> ص، احتمالاً از سایر معیارهای فاصله مانند استفاده خواهید کرد ماهالانوبیس فاصله از طرف دیگر، می توانید با استفاده از آن، ابعاد مجموعه داده را کاهش دهید تجزیه و تحلیل مincipلفه های اصلی (PCA). این مشکل به ویژه هنگام خوشه بندی داده های توالی یابی بیولوژیکی مکرر است.

ما قبلاً در مورد معیارها، پیوندها و اینکه چگونه هر یک از آنها می تواند بر نتایج ما تأثیر بگذارد بحث کرده ایم. حال بیایید تحلیل دندروگرام را ادامه دهیم و ببینیم که چگونه می‌تواند نشانه‌ای از تعداد خوشه‌ها در مجموعه داده ما به ما بدهد.

یافتن تعداد جالبی از خوشه ها در دندروگرام مانند یافتن بزرگترین فضای افقی است که هیچ خط عمودی ندارد (فضایی با طولانی ترین خطوط عمودی). این بدان معنی است که جدایی بیشتری بین خوشه ها وجود دارد.

ما می توانیم یک خط افقی که از طولانی ترین فاصله می گذرد رسم کنیم:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

IMG

پس از تعیین موقعیت خط افقی، شمارش می کنیم که چند بار خطوط عمودی ما از آن عبور کرده اند - در این مثال، 5 بار. بنابراین به نظر می رسد 5 نشانه خوبی از تعداد خوشه هایی است که بیشترین فاصله را بین خود دارند.

توجه داشته باشید: دندروگرام زمانی که برای انتخاب تعداد خوشه ها استفاده می شود باید فقط به عنوان مرجع در نظر گرفته شود. به راحتی می تواند این عدد را از بین ببرد و کاملاً تحت تأثیر نوع پیوند و معیارهای فاصله است. هنگام انجام یک تجزیه و تحلیل خوشه ای عمیق، توصیه می شود به دندروگرام ها با پیوندها و معیارهای مختلف نگاه کنید و به نتایج ایجاد شده با سه خط اول که در آن خوشه ها بیشترین فاصله را بین آنها دارند نگاه کنید.

اجرای یک خوشه بندی سلسله مراتبی انبوهی

استفاده از داده های اصلی

تاکنون تعداد خوشه‌های پیشنهادی را برای مجموعه داده‌های خود محاسبه کرده‌ایم که با تحلیل اولیه و تجزیه و تحلیل PCA ما تأیید می‌کنند. اکنون می توانیم مدل خوشه بندی سلسله مراتبی تجمعی خود را با استفاده از Scikit-Learn ایجاد کنیم. AgglomerativeClustering و برچسب های نقاط بازاریابی را با labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

این نتیجه در:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

ما برای رسیدن به این نقطه بسیار تحقیق کرده ایم. و این برچسب ها به چه معناست؟ در اینجا، ما هر نقطه از داده های خود را به عنوان یک گروه از 0 تا 4 برچسب گذاری می کنیم:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

IMG

این آخرین داده های خوشه ای ما است. شما می توانید نقاط داده با کد رنگی را در قالب پنج خوشه مشاهده کنید.

نقاط داده در پایین سمت راست (برچسب: 0، نقاط داده بنفش) متعلق به مشتریان با حقوق بالا اما هزینه کم است. اینها مشتریانی هستند که پول خود را با دقت خرج می کنند.

به طور مشابه، مشتریان در بالا سمت راست (برچسب: 2، نقاط داده سبز)، مشتریانی با حقوق بالا و هزینه های بالا هستند. اینها همان دسته از مشتریانی هستند که شرکت ها هدف آنها هستند.

مشتریان در وسط (برچسب: 1، نقاط داده آبی) آنهایی هستند که درآمد متوسط ​​و هزینه متوسط ​​دارند. بیشترین تعداد مشتریان متعلق به این دسته است. شرکت ها همچنین می توانند این مشتریان را با توجه به تعداد زیاد آنها هدف قرار دهند.

مشتریان پایین سمت چپ (برچسب: 4، قرمز) مشتریانی هستند که حقوق و خرج کم دارند و ممکن است با ارائه تبلیغات جذب شوند.

و در نهایت، مشتریان سمت چپ بالا (برچسب: 3، نقاط داده نارنجی) آنهایی هستند که درآمد بالا و هزینه کم دارند که به طور ایده آل هدف بازاریابی قرار می گیرند.

با استفاده از نتیجه PCA

اگر در سناریوی دیگری قرار داشتیم که در آن باید ابعاد داده ها را کاهش می دادیم. ما همچنین می‌توانیم به راحتی نتایج PCA خوشه‌ای را رسم کنیم. این کار را می توان با ایجاد یک مدل خوشه بندی تجمعی دیگر و به دست آوردن یک برچسب داده برای هر جزء اصلی انجام داد:

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

IMG

توجه داشته باشید که هر دو نتیجه بسیار مشابه هستند. تفاوت اصلی این است که توضیح اولین نتیجه با داده های اصلی بسیار ساده تر است. واضح است که مشتریان را می توان بر اساس درآمد سالانه و امتیاز هزینه به پنج گروه تقسیم کرد. در حالی که، در رویکرد PCA، ما همه ویژگی‌های خود را در نظر می‌گیریم، تا آنجا که می‌توانیم به واریانس توضیح داده‌شده توسط هر یک از آنها نگاه کنیم، درک این مفهوم دشوارتر است، به‌ویژه هنگام گزارش دادن به یک بخش بازاریابی.

هرچه حداقل باید داده هایمان را تغییر دهیم، بهتر است.

اگر مجموعه داده بسیار بزرگ و پیچیده‌ای دارید که در آن باید قبل از خوشه‌بندی کاهش ابعاد را انجام دهید - سعی کنید روابط خطی بین هر یک از ویژگی‌ها و باقیمانده‌های آنها را تجزیه و تحلیل کنید تا از استفاده از PCA نسخه پشتیبان تهیه کنید و قابلیت توضیح فرآیند را افزایش دهید. با ساختن یک مدل خطی برای هر جفت ویژگی، می‌توانید نحوه تعامل ویژگی‌ها را درک کنید.

اگر حجم داده‌ها خیلی زیاد باشد، ترسیم جفت ویژگی‌ها غیرممکن می‌شود، نمونه‌ای از داده‌های خود را تا حد امکان متعادل و نزدیک به توزیع نرمال انتخاب کنید و ابتدا تجزیه و تحلیل را روی نمونه انجام دهید، آن را درک کنید، تنظیم دقیق کنید. آن - و بعداً آن را در کل مجموعه داده اعمال کنید.

شما همیشه می توانید تکنیک های مختلف تجسم خوشه بندی را با توجه به ماهیت داده های خود (خطی، غیر خطی) انتخاب کنید و در صورت لزوم همه آنها را ترکیب یا آزمایش کنید.

نتیجه

تکنیک خوشه بندی در مورد داده های بدون برچسب می تواند بسیار مفید باشد. از آنجایی که بیشتر داده ها در دنیای واقعی بدون برچسب هستند و حاشیه نویسی داده ها هزینه بیشتری دارد، می توان از تکنیک های خوشه بندی برای برچسب گذاری داده های بدون برچسب استفاده کرد.

در این راهنما، ما یک مشکل واقعی علم داده را آورده ایم، زیرا تکنیک های خوشه بندی تا حد زیادی در تحلیل بازاریابی (و همچنین در تجزیه و تحلیل بیولوژیکی) استفاده می شود. ما همچنین بسیاری از مراحل تحقیق برای رسیدن به یک مدل خوشه‌بندی سلسله مراتبی خوب و نحوه خواندن دندروگرام‌ها را توضیح داده‌ایم و در مورد اینکه آیا PCA یک مرحله ضروری است یا خیر، توضیح داده‌ایم. هدف اصلی ما این است که برخی از دام‌ها و سناریوهای مختلفی که در آنها می‌توانیم خوشه‌بندی سلسله مراتبی را پیدا کنیم، پوشش داده شوند.

خوشه بندی مبارک!

تمبر زمان:

بیشتر از Stackabuse