آموزش

مقدمه‌ای بر خوشه‌بندی k-Means با Scikit-learn در پایتون

اینجا یاد می‌گیری چطور خوشه‎‌بندی k-Means رو با استفاده از Scikit-learn در پایتون پیاده‌سازی کنی.

تاریخ انتشار:
31 مرداد 1405
پایتون
8 دقیقه
یادگیری ماشین
علم داده
یادگیری ماشین
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

در این آموزش، با خوشه‌بندی k-means آشنا می‌شی. ما به این موضوعات می‌پردازیم:

  • الگوریتم خوشه‌بندی k-means چطور کار می‌کنه
  • چطوری داده‌ها رو مصورسازی کنیم تا بفهمیم برای خوشه‌بندی مناسب هستن یا نه
  • بررسی یک نمونه عملی از آموزش و تنظیم مدل خوشه‌بندی k-means روی دیتاست واقعی مسکن کالیفرنیا.

حواست باشه این الگوریتم رو با k-nearest neighbors اشتباه نگیری؛ اگه دنبال اون هستی، بهتره بری سراغ آموزش طبقه‌بندی k-نزدیک‌ترین همسایه (KNN) با scikit-learn در پایتون.

یادگیری این الگوریتم خیلی به دردت می‌خوره، چون k-means یکی از روش‌های معروفه که داده‌های کروی‌شکل رو خیلی خوب در گروه‌های مجزا طبقه‌بندی می‌کنه. این روش هم به عنوان ابزار تحلیلی (وقتی دسته‌بندی سطرها مشخص نیست) و هم برای مهندسی ویژگی‌ها در جهت بهبود مدل‌های یادگیری نظارت‌شده (supervised learning) خیلی کاربردی و ارزشمنده.

برای استفاده از این آموزش، انتظار می‌ره در حد پایه با پایتون آشنا باشی و بتونی با دیتافریم‌های pandas کار کنی.

مروری بر خوشه‌بندی K-Means

هدف مدل‌های خوشه‌بندی اینه که داده‌ها رو در گروه‌ها یا همون «خوشه‌های» مجزا طبقه‌بندی کنن. این کار هم دید خوبی برای تحلیل بهمون میده و هم می‌تونه به عنوان یک ویژگی در الگوریتم‌های یادگیری نظارت‌شده استفاده بشه.

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

در قسمت چپ نمودار بالا، دو مجموعه مجزا از نقاط رو می‌بینیم که هیچ برچسبی ندارن و همه‌شون یک‌رنگ هستن. اگه مدل k-means رو روی این داده‌ها برازش (fit) کنیم (قسمت راست تصویر)، این دو گروه از هم جدا میشن و با رنگ و شکل متفاوتی نشون داده میشن.

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

دیتاست

در این آموزش، از دیتاست مسکن کالیفرنیا در سایت Kaggle (اینجا) استفاده می‌کنیم. ما فقط با داده‌های موقعیت مکانی (طول و عرض جغرافیایی) و میانه قیمت خانه‌ها کار داریم. قراره خانه‌ها رو بر اساس موقعیتشون خوشه‌بندی کنیم تا ببینیم قیمت مسکن در کالیفرنیا چطور تغییر می‌کنه. این دیتاست رو به صورت یک فایل CSV با اسم housing.csv در پوشه پروژه‌مون ذخیره می‌کنیم و با کمک کتابخونه pandas اون رو می‌خونیم.

خروجی
     longitude  latitude  median_house_value
0    -122.23     37.88            452600.0
1    -122.22     37.86            358500.0
2    -122.24     37.85            352100.0
3    -122.25     37.85            341300.0
4    -122.25     37.85            342200.0

این داده‌ها سه تا متغیر دارن که با استفاده از پارامتر usecols انتخابشون کردیم:

  • longitude (طول جغرافیایی): این مقدار نشون میده خونه چقدر به سمت غرب قرار داره. مقادیر بالاتر یعنی خونه غربی‌تره.
  • latitude (عرض جغرافیایی): این مقدار نشون میده خونه چقدر به سمت شمال قرار داره. مقادیر بالاتر یعنی خونه شمالی‌تره.
  • median_house_value: میانه قیمت خونه در یک محله یا بلوک که با واحد دلار آمریکا (USD) ثبت شده.

مراحل انجام خوشه‌بندی k-Means

مثل بقیه الگوریتم‌های یادگیری ماشین، خوشه‌بندی k-Means هم یک سری مراحل مشخص داره. در این آموزش، تمرکزمون روی جمع‌آوری و جداسازی داده‌ها (بخش آماده‌سازی)، و همچنین تنظیم ابرپارامترها، آموزش مدل و ارزیابی عملکردش (بخش مدل‌سازی) هست. در الگوریتم‌های یادگیری بدون نظارت (unsupervised learning)، بیشترِ کار همون تنظیم ابرپارامترها و ارزیابی عملکرده تا بتونی بهترین نتیجه رو از مدلت بگیری.

مصورسازی داده‌ها

کارمون رو با مصورسازی (رسم نمودار) داده‌های مسکن شروع می‌کنیم. با کمک یک هیت‌مپ (Heatmap) و بر اساس میانه قیمت خونه‌ها در هر بلوک، نگاهی به داده‌های موقعیت مکانی می‌ندازیم. در این آموزش برای اینکه نمودارها رو سریع‌تر رسم کنیم، از Seaborn استفاده می‌کنیم (اگه می‌خوای دقیق‌تر بفهمی این نمودارها چطور ساخته میشن، پیشنهاد می‌کنم دوره مقدمه‌ای بر مصورسازی داده‌ها با Seaborn رو در فینکا ببینی).

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

وقتی فقط با ۲ یا ۳ تا ویژگی کار می‌کنی، پیدا کردن خوشه‌ها کار راحتیه. اما هرچی تعداد ویژگی‌ها بیشتر بشه، این کار سخت‌تر و حتی غیرممکن میشه.

نرمال‌سازی داده‌ها

وقتی با الگوریتم‌های مبتنی بر فاصله مثل k-Means کار می‌کنیم، حتما باید داده‌ها رو نرمال‌سازی کنیم. اگه این کار رو نکنیم، متغیرهایی که مقیاس متفاوتی دارن، موقع آموزش مدل وزن‌های مختلفی می‌گیرن و نتیجه رو خراب می‌کنن. مثلا اگه علاوه بر طول و عرض جغرافیایی، قیمت رو هم وارد خوشه‌بندی کنیم، چون مقیاس قیمت خیلی بزرگ‌تر از مختصات مکانیه، تأثیر به شدت زیادی روی محاسبه فاصله‌ها می‌ذاره و محاسبات رو به هم می‌ریزه.

برای شروع، با استفاده از تابع train_test_split از کتابخونه sklearn، داده‌ها رو به دو بخش آموزش (train) و تست (test) تقسیم می‌کنیم.

در قدم بعدی، با کمک متد preprocessing.normalize() از کتابخونه sklearn، داده‌های آموزش و تست رو نرمال می‌کنیم.

برازش و ارزیابی مدل

برای شروع، تعداد خوشه‌ها (که با k نشونش میدیم) رو به شکل دلخواه روی عدد ۳ می‌ذاریم. ساختن و برازش مدل در sklearn خیلی راحته. ما یه نمونه از KMeans می‌سازیم، تعداد خوشه‌ها رو با پارامتر n_clusters مشخص می‌کنیم، مقدار n_init (که مشخص می‌کنه الگوریتم چند بار با هسته‌های مختلف اجرا بشه) رو روی 'auto' می‌ذاریم و random_state رو هم 0 قرار میدیم تا با هر بار اجرای کد، نتایج یکسانی بگیریم. بعدش می‌تونیم با متد fit()، مدلمون رو روی داده‌های آموزشیِ نرمال‌شده برازش بدیم.

بعد از اینکه برازش داده‌ها انجام شد، می‌تونیم با استفاده از ویژگی labels_ به برچسب‌ها دسترسی پیدا کنیم. در ادامه، داده‌هایی که تازه برازش شدن رو روی نمودار رسم می‌کنیم.

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

خیلی واضح می‌بینیم که خوشه‌های شمالی و جنوبی (یعنی خوشه‌های 0 و 2) توزیع قیمت مشابهی دارن و قیمت‌هاشون از خوشه مرکزی (خوشه 1) بیشتره.

برای ارزیابی عملکرد الگوریتم می‌تونیم از معیار امتیاز سیلوئت (Silhouette score) که در ماژول sklearn.metrics قرار داره، استفاده کنیم. در اینجا، امتیاز کمتر نشون‌دهنده برازش بهتره.

چون هنوز حالت‌های دیگه رو با تعداد خوشه‌های متفاوت بررسی نکردیم، دقیقا نمی‌دونیم مدل k = 3 چقدر خوب برازش شده. در بخش بعدی، تعداد خوشه‌های مختلف رو تست و با هم مقایسه می‌کنیم تا بتونیم بهترین مقادیر رو برای ابرپارامترِ مدلمون انتخاب کنیم.

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

نقطه ضعف خوشه‌بندی اینه که فقط با یک بار اجرای مدل، نمی‌تونیم بفهمیم دقیقا چند تا خوشه نیازه. برای همین باید مقادیر مختلفی رو تست کنیم و بعد بهترین مقدار k رو انتخاب کنیم. معمولا برای این کار از روش آرنج (Elbow method) استفاده می‌شه؛ این‌طوری می‌تونیم تعداد بهینه خوشه‌ها رو طوری پیدا کنیم که نه با انتخاب خوشه‌های خیلی زیاد دچار بیش‌برازش (overfitting) بشیم و نه با انتخاب خوشه‌های خیلی کم، کم‌برازش (underfitting) اتفاق بیفته.

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

حالا اول بیایم به‌صورت بصری چند تا مقدار مختلف برای k رو بررسی کنیم.

اول از همه سراغ k = 2 می‌ریم.

این مدل تونسته ایالت رو خیلی خوب به دو بخش تقسیم کنه، اما احتمالا جزئیات بازار مسکن کالیفرنیا رو به اندازه کافی نشون نمیده.

در قدم بعدی، میریم سراغ بررسی k = 4.

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

و در آخر، حالت k = 7 رو بررسی می‌کنیم.

به نظر میاد نمودار بالا خوشه‌های خیلی زیادی داره. در واقع اینجا سادگی و قابل‌فهم بودنِ خوشه‌ها رو فدای دقت بیشترِ خوشه‌بندی جغرافیایی کردیم.

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

ما معمولا نقطه‌ای رو انتخاب می‌کنیم که از اونجا به بعد، روندِ بهبود مدل متوقف میشه یا حتی افت می‌کنه. همون‌طور که مشخصه، k = 5 بهترین انتخابه که بدون درگیری با بیش‌برازش بهش می‌رسیم.

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

چه زمانی تحلیل خوشه k-means شکست می‌خوره؟

الگوریتم K-means روی داده‌های کروی بهترین نتیجه رو میده. داده‌های کروی اونایی هستن که در فضا خیلی نزدیک به هم و در یک محدوده جمع شدن. این موضوع رو در فضاهای دو یا سه‌بعدی خیلی راحت‌تر میشه تصور کرد. اما داده‌هایی که شکل کروی ندارن یا اصولا نباید کروی باشن، در K-means جواب خوبی نمیدن. مثلا k-means نمی‌تونه داده‌های زیر رو درست خوشه‌بندی کنه؛ چون با اینکه به چشم می‌بینیم دو تا دایره و کمان مجزا داریم، اما مدل نمی‌تونه هسته‌های متمایزی پیدا کنه تا اونا رو درست از هم جدا کنه.

البته الگوریتم‌های دیگه‌ای هم هستن که در خوشه‌بندیِ داده‌های غیرکروی فوق‌العاده عمل می‌کنن. این روش‌ها رو می‌تونی در سایت فینکا بخونی.

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

اینکه داده‌ها رو تقسیم کنی یا نه، کاملا به هدفت بستگی داره. اگه کلا می‌خوای تحلیلت رو با خوشه‌بندی تموم کنی، پس نیازی به این کار نیست. اما اگه هدفت اینه که از خوشه‌ها به عنوان یک ویژگی (Feature) برای مدل‌های یادگیری نظارت‌شده یا کارهای پیش‌بینی استفاده کنی (مثل کاری که در آموزش Scikit-Learn: تحلیل بیسبال قسمت ۱ در فینکا کردیم)، اونوقت حتما باید قبل از خوشه‌بندی داده‌هات رو تقسیم کنی تا مطمئن بشی اصولِ یادگیریِ نظارت‌شده رو درست پیاده کردی.

سطح خودت رو ارتقا بده

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

اشتراک‌گذاری
فهرست مطالب
  • مروری بر خوشه‌بندی K-Means
  • دیتاست
  • مراحل انجام خوشه‌بندی k-Means
  • مصورسازی داده‌ها
  • نرمال‌سازی داده‌ها
  • برازش و ارزیابی مدل
  • انتخاب بهترین تعداد خوشه
  • چه زمانی تحلیل خوشه k-means شکست می‌خوره؟
  • آیا لازمه داده‌ها رو به مجموعه‌های آموزش و تست تقسیم کنی؟
  • سطح خودت رو ارتقا بده

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.