فصل ۹: روشهای یادگیری بدون نظارت
اگرچه بخش بزرگی از کاربردهای امروزی یادگیری ماشین بر یادگیری نظارتشده استوار است و به همین دلیل بیشتر سرمایهگذاریها نیز در همین حوزه انجام میشود، بیشتر دادههای در دسترس برچسب ندارند: ویژگیهای ورودی X را داریم، اما برچسبهای y موجود نیستند. Yann LeCun این وضعیت را با تشبیه معروف کیک توضیح داده است: اگر هوش یک کیک باشد، یادگیری بدون نظارت خودِ کیک، یادگیری نظارتشده روکش روی کیک و یادگیری تقویتی گیلاس روی آن است. یعنی ظرفیت یادگیری بدون نظارت بسیار بیشتر از چیزی است که تاکنون از آن استفاده کردهایم.
فرض کنید میخواهید در یک خط تولید، از هر محصول چند تصویر بگیرید و محصولات معیوب را تشخیص دهید. ساخت سامانهای برای گرفتن خودکار هزاران تصویر در روز ساده است و در چند هفته دادهٔ زیادی جمع میشود، اما این تصاویر برچسب ندارند. برای آموزش یک طبقهبند دودویی معمولی باید تکتک تصاویر بهصورت «معیوب» یا «سالم» توسط کارشناسان انسانی برچسب بخورند. این کار کند، پرهزینه و خستهکننده است و معمولاً فقط روی بخش کوچکی از داده انجام میشود؛ بنابراین مجموعهٔ برچسبدار کوچک میماند و عملکرد طبقهبند ممکن است ناامیدکننده باشد. هر تغییر در محصول نیز میتواند این فرایند را دوباره از ابتدا لازم کند. یادگیری بدون نظارت تلاش میکند از حجم بزرگ دادهٔ بدون برچسب استفاده کند.
فصل ۸ یکی از رایجترین کارهای بدون نظارت، یعنی کاهش ابعاد، را بررسی کرد. در این فصل چند وظیفهٔ دیگر مطرح میشوند:
- خوشهبندی یا Clustering
- هدف، گروهبندی نمونههای مشابه در خوشههاست. خوشهبندی برای تحلیل داده، بخشبندی مشتریان، سامانههای پیشنهاددهنده، موتورهای جستوجو، قطعهبندی تصویر، یادگیری نیمهنظارتی، کاهش ابعاد و کاربردهای دیگر مفید است.
- تشخیص ناهنجاری یا Outlier Detection
- الگوریتم شکل دادهٔ «عادی» را یاد میگیرد و نمونههای غیرعادی را تشخیص میدهد. نمونههای غیرعادی Anomaly یا Outlier و نمونههای عادی Inlier نام دارند. کاربردها شامل کشف تقلب، تشخیص محصول معیوب در تولید، یافتن روندهای تازه در سری زمانی و پاکسازی Outlierها پیش از آموزش مدل دیگری است.
- تخمین چگالی یا Density Estimation
- هدف، برآورد تابع چگالی احتمال یا PDF فرایند تصادفی مولد داده است. نواحی با چگالی بسیار پایین معمولاً محل مناسبی برای یافتن ناهنجاریاند؛ این روش برای تحلیل و بصریسازی داده نیز کاربرد دارد.
فصل با دو الگوریتم خوشهبندی k-means و DBSCAN آغاز میشود، سپس مدلهای Gaussian Mixture بررسی میشوند که برای تخمین چگالی، خوشهبندی و تشخیص ناهنجاری کاربرد دارند.
الگوریتمهای خوشهبندی: k-means و DBSCAN
خوشهبندی یعنی شناسایی نمونههای مشابه و قرار دادن آنها در گروههایی از نمونههای شبیه به هم. مانند طبقهبندی، هر نمونه به یک گروه اختصاص مییابد؛ اما برخلاف طبقهبندی، برچسب هدف در اختیار الگوریتم نیست و کار بدون نظارت انجام میشود.
شکل ۹-۱ در سمت چپ دادهٔ Iris را با برچسب گونهها نشان میدهد؛ چنین دادهای برای Logistic Regression، SVM یا Random Forest مناسب است. در سمت راست همان داده بدون برچسب دیده میشود و دیگر نمیتوان طبقهبند نظارتشده را مستقیماً به کار برد. الگوریتم خوشهبندی خوشهٔ پایین-چپ را بهآسانی پیدا میکند و با استفاده از دو ویژگی دیگر Iris که در این نمودار نمایش داده نشدهاند میتواند سه خوشه را نسبتاً خوب شناسایی کند. کتاب اشاره میکند که Gaussian Mixture در این مثال فقط ۵ نمونه از ۱۵۰ نمونه را در خوشهٔ نادرست قرار میدهد.
شکل 9-1. طبقهبندی در برابر خوشهبندی
کاربردهای خوشهبندی
- بخشبندی مشتریان
- مشتریان را بر اساس خریدها و فعالیت آنها روی وبسایت خوشهبندی میکنید تا نیازهای هر بخش بهتر شناخته شود و محصول یا کمپین بازاریابی برای آن گروه تنظیم شود. در سامانههای پیشنهاددهنده نیز میتوان محتوای محبوب میان کاربران همان خوشه را پیشنهاد کرد.
- تحلیل داده
- هنگام بررسی یک مجموعهٔ جدید، اجرای خوشهبندی و تحلیل جداگانهٔ هر خوشه میتواند ساختار داده را آشکار کند.
- کاهش ابعاد
- پس از خوشهبندی میتوان میزان تعلق یا Affinity هر نمونه به هر خوشه را محاسبه کرد و بردار ویژگی اصلی را با بردار Affinityها جایگزین نمود. اگر k خوشه وجود داشته باشد، نمایش جدید kبعدی است و ممکن است بسیار کمبعدتر از دادهٔ اولیه باشد.
- مهندسی ویژگی
- Affinity خوشهها میتواند بهعنوان ویژگی اضافی وارد مدل شود. در فصل ۲ از k-means برای ساخت ویژگیهای Affinity جغرافیایی در دادهٔ مسکن کالیفرنیا استفاده شد.
- تشخیص ناهنجاری
- نمونهای که به همهٔ خوشهها Affinity کمی دارد احتمالاً غیرعادی است؛ مثلاً کاربری با تعداد درخواستهای غیرعادی در ثانیه.
- یادگیری نیمهنظارتی
- اگر فقط تعداد کمی برچسب دارید، میتوان داده را خوشهبندی و برچسبهای موجود را به نمونههای همخوشه منتشر کرد تا دادهٔ برچسبدار بیشتری برای الگوریتم نظارتشده فراهم شود.
- موتورهای جستوجو
- برای جستوجوی تصویر مشابه، ابتدا تصاویر پایگاه داده خوشهبندی میشوند. هنگام دریافت تصویر مرجع، خوشهٔ آن پیدا و تصاویر همان خوشه برگردانده میشوند.
- قطعهبندی تصویر
- با خوشهبندی پیکسلها بر اساس رنگ و جایگزینی رنگ هر پیکسل با میانگین رنگ خوشه، تعداد رنگهای متفاوت کاهش مییابد. این کار در سامانههای تشخیص و ردیابی اشیا برای سادهتر شدن یافتن مرز اشیا مفید است.
تعریف جهانی و یکتایی برای «خوشه» وجود ندارد؛ مفهوم خوشه به زمینه بستگی دارد و الگوریتمهای مختلف ساختارهای متفاوتی را پیدا میکنند. برخی حول یک نقطهٔ مرکزی یا Centroid شکل میگیرند، برخی نواحی پیوستهٔ با چگالی بالا را پیدا میکنند و شکل آزاد دارند و برخی ساختار سلسلهمراتبی از خوشههای تودرتو میسازند.
k-means
دادهٔ بدون برچسب شکل ۹-۲ پنج تودهٔ واضح دارد. k-means الگوریتمی ساده، سریع و کارآمد است که معمولاً در چند تکرار چنین دادهای را خوشهبندی میکند. الگوریتم توسط Stuart Lloyd در Bell Labs در سال ۱۹۵۷ برای Pulse-Code Modulation پیشنهاد شد و در سال ۱۹۸۲ خارج از شرکت منتشر شد. Edward W. Forgy نیز در سال ۱۹۶۵ الگوریتم تقریباً یکسانی منتشر کرده بود، بنابراین گاهی نام Lloyd–Forgy برای آن استفاده میشود.
شکل 9-2. مجموعهٔ بدون برچسب شامل پنج تودهٔ نمونه
کد زیر تلاش میکند مرکز پنج توده را پیدا کند و هر نمونه را به نزدیکترین مرکز نسبت دهد:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
X, y = make_blobs([...]) # y has cluster IDs, but we do not use them
k = 5
kmeans = KMeans(n_clusters=k, random_state=42)
y_pred = kmeans.fit_predict(X)
باید تعداد خوشهها، k، را از قبل مشخص کنید. در این مثال با نگاه به داده مقدار ۵ واضح است، اما در بسیاری از مسائل این انتخاب ساده نیست.
در خوشهبندی، Label هر نمونه شمارهٔ خوشهای است که الگوریتم به آن تخصیص داده است و نباید با Class Label در طبقهبندی اشتباه شود؛ در خوشهبندی این Label از روی Target آموزشی به مدل داده نشده است. شیء KMeans برچسب نمونههای آموزشی را در labels_ نگه میدارد:
>>> y_pred
array([4, 0, 1, ..., 2, 1, 0], dtype=int32)
>>> y_pred is kmeans.labels_
True
مرکزهای خوشه نیز قابل مشاهدهاند:
>>> kmeans.cluster_centers_
array([[-2.80389616, 1.80117999],
[ 0.20876306, 2.25551336],
[-2.79290307, 2.79641063],
[-1.46679593, 2.28585348],
[-2.80037642, 1.30082566]])
نمونهٔ جدید به خوشهای داده میشود که Centroid آن کمترین فاصله را دارد:
>>> import numpy as np
>>> X_new = np.array([[0, 2], [3, 2], [-3, 3], [-3, 2.5]])
>>> kmeans.predict(X_new)
array([1, 1, 2, 2], dtype=int32)
مرزهای تصمیم خوشهها یک Voronoi Tessellation میسازند. در شکل ۹-۳ هر Centroid با علامت X نشان داده شده است.
شکل 9-3. مرزهای تصمیم k-means و Voronoi Tessellation
بیشتر نمونهها درست گروهبندی شدهاند، اما نزدیک مرز خوشهٔ بالا-چپ و خوشهٔ مرکزی نمونههای نامناسب دیده میشود. علت این است که k-means برای تخصیص نمونه فقط فاصله تا Centroid را در نظر میگیرد؛ بنابراین وقتی قطر خوشهها بسیار متفاوت باشد عملکرد خوبی ندارد.
Hard Clustering و Soft Clustering
اگر هر نمونه فقط یک خوشه بگیرد، روش Hard Clustering است. گاهی بهتر است برای هر خوشه یک Score یا Affinity داشته باشیم؛ این حالت Soft Clustering نام دارد. Score میتواند فاصلهٔ نمونه تا Centroid یا یک معیار شباهت مانند Gaussian RBF باشد.
متد transform() در KMeans فاصلهٔ هر نمونه تا همهٔ Centroidها را محاسبه میکند:
>>> kmeans.transform(X_new).round(2)
array([[2.81, 0.33, 2.9 , 1.49, 2.89],
[5.81, 2.8 , 5.85, 4.48, 5.84],
[1.21, 3.29, 0.29, 1.69, 1.71],
[0.73, 3.22, 0.36, 1.55, 1.22]])
نمونهٔ اول در X_new بهترتیب حدود ۲٫۸۱، ۰٫۳۳، ۲٫۹۰، ۱٫۴۹ و ۲٫۸۹ واحد از پنج Centroid فاصله دارد. اگر دادهٔ اصلی پُربعد باشد، چنین تبدیلی آن را به فضای kبعدی میبرد و میتواند یک کاهش ابعاد غیرخطی بسیار کارآمد باشد. همین فاصلهها را نیز میتوان بهعنوان ویژگی اضافی به مدل دیگری داد.
الگوریتم k-means چگونه کار میکند؟
اگر Centroidها معلوم باشند، برچسبزدن نمونهها ساده است: هر نمونه به نزدیکترین مرکز میرود. برعکس، اگر برچسب نمونهها معلوم باشد، مرکز هر خوشه را با میانگین گرفتن از نمونههای آن خوشه میتوان یافت. در مسئلهٔ واقعی نه برچسب داریم و نه Centroid، بنابراین الگوریتم از جایگذاری تصادفی k مرکز شروع میکند، نمونهها را برچسب میزند، Centroidها را دوباره محاسبه میکند و این دو مرحله را تا ثابتشدن مراکز تکرار میکند.
الگوریتم در تعداد متناهی مرحله همگرا میشود، زیرا میانگین فاصلهٔ مربعی نمونهها تا نزدیکترین Centroid در هر مرحله فقط میتواند کاهش یابد و مقدار منفی نیز ندارد. شکل ۹-۴ روند را نشان میدهد: مقداردهی تصادفی Centroidها، Label کردن نمونهها، بهروزرسانی مراکز و تکرار این کار. در مثال کتاب تنها سه تکرار به خوشهبندی نزدیک به بهینه میرسد.
شکل 9-4. روند الگوریتم k-means
پیچیدگی محاسباتی k-means معمولاً نسبت به تعداد نمونهها m، تعداد خوشهها k و تعداد ابعاد n خطی است، به شرط آنکه داده ساختار خوشهای داشته باشد. در بدترین حالت و روی دادهٔ فاقد ساختار خوشهای ممکن است پیچیدگی نسبت به تعداد نمونهها نمایی شود، ولی در عمل این حالت نادر است و k-means معمولاً از سریعترین الگوریتمهای خوشهبندی است.
مشکل بهینههای محلی
تضمین همگرایی به معنی تضمین رسیدن به بهترین جواب نیست. الگوریتم میتواند بسته به مقداردهی اولیهٔ Centroidها روی یک بهینهٔ محلی نامناسب متوقف شود. شکل ۹-۵ دو جواب زیربهینه را نشان میدهد که از مقداردهیهای اولیهٔ ناموفق حاصل شدهاند.
شکل 9-5. جوابهای زیربهینه بر اثر مقداردهی اولیهٔ نامناسب Centroid
روشهای مقداردهی اولیهٔ Centroid
اگر تقریباً بدانید مراکز باید کجا باشند، میتوانید آرایهٔ مراکز را به init بدهید و n_init=1 قرار دهید:
good_init = np.array([
[-3, 3], [-3, 2], [-3, 1], [-1, 2], [0, 2]
])
kmeans = KMeans(
n_clusters=5,
init=good_init,
n_init=1,
random_state=42
)
kmeans.fit(X)
راه دیگر اجرای چندبارهٔ الگوریتم با مقداردهیهای اولیهٔ تصادفی متفاوت و نگهداشتن بهترین نتیجه است. تعداد اجراها با n_init کنترل میشود. معیار انتخاب بهترین اجرا Inertia است؛ یعنی مجموع فاصلههای مربعی همهٔ نمونهها تا نزدیکترین Centroid.
در مثال کتاب، Inertia دو جواب نامناسب شکل ۹-۵ تقریباً ۲۱۹٫۴ و ۲۵۸٫۶ است، در حالی که جواب شکل ۹-۳ حدود ۲۱۱٫۶ دارد. مدل با Inertia کمتر انتخاب میشود:
>>> kmeans.inertia_
211.59853725816836
>>> kmeans.score(X)
-211.5985372581684
score() مقدار منفی Inertia را برمیگرداند، زیرا قرارداد Scikit-Learn این است که Score بزرگتر باید نشاندهندهٔ مدل بهتر باشد.
k-means++
روش k-means++ مقداردهی اولیهٔ هوشمندانهتری دارد و Centroidهایی را انتخاب میکند که تمایل دارند از یکدیگر دور باشند. این کار احتمال همگرایی به جواب نامناسب را کم میکند و ارزش محاسبهٔ اضافهٔ مرحلهٔ شروع را دارد، زیرا نیاز به اجرای کامل مکرر الگوریتم را کاهش میدهد.
- Centroid نخست c(1) بهطور یکنواخت و تصادفی از میان نمونههای مجموعه انتخاب میشود.
دو مرحلهٔ بعدی الگوریتم k-means++ در مقالهٔ بعدی ادامه پیدا میکند.