یادگیری نظارت نشده (Unsupervised Learning) با پایتون — راهنمای جامع و کاربردی

۲۳۰۱ بازدید
آخرین به‌روزرسانی: ۱۷ تیر ۱۴۰۲
زمان مطالعه: ۸ دقیقه
یادگیری نظارت نشده (Unsupervised Learning) با پایتون — راهنمای جامع و کاربردی

«یادگیری نظارت نشده» (Unsupervised Learning) یک دسته از روش‌های «یادگیری ماشین» (Machine Learning) برای کشف الگوهای موجود در میان داده‌ها است. داده‌های ارائه شده به الگوریتم نظارت نشده دارای برچسب نیستند، بدین معنا که متغیر ورودی (X) بدون هیچ متغیر خروجی متناظری داده شده است. در یادگیری نظارت نشده، الگوریتم‌ها به حال خود رها می‌شوند تا ساختارهای جالب موجود در میان داده‌ها را کشف کنند. «یان لیوکن» (Yann LeCun)، دانشمند فرانسوی کامپیوتر و پدر بنیان‌گذار «شبکه عصبی پیچشی» (Convolutional Neural Networks | CNN)، یادگیری ماشین نظارت نشده را چنین تعریف کرده است: «آموزش دادن ماشین‌ها برای یادگیری برای خودشان بدون آنکه به آن‌ها صراحتا گفته شود کاری که انجام می‌دهند درست محسوب می‌شود یا غلط. یادگیری نظارت نشده راهی به سوی هوش مصنوعی «حقیقی» است.»

یادگیری نظارت شده و نظارت نشده

در یادگیری نظارت شده، سیستم در تلاش برای یادگیری از مثال‌های قبلی است که به آن داده شده. (به عبارت دیگر، در یادگیری نظارت شده، سیستم در تلاش برای پیدا کردن الگوها از مثال‌هایی است که به آن داده شده.)

بنابراین، اگر مجموعه داده برچسب‌گذاری شده باشد، به عنوان مساله نظارت شده مطرح می‌شود و اگر مجموعه داده بدون برچسب باشد مساله نظارت نشده است.

یادگیری نظارت شده و نظارت نشده

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

مفاهیم مهم

  • «ویژگی» (Feature): یک متغیر ورودی که برای انجام پیش‌بینی‌ها مورد استفاده قرار می‌گیرد.
  • «پیش‌بینی‌ها» (Predictions): خروجی مدل، در هنگامی که نمونه ورودی فراهم شده است.
  • «نمونه» (Example): یک سطر از مجموعه داده را گویند. یک نمونه شامل یک یا تعداد بیشتری ویژگی و احتمالا یک برچسب است.
  • «برچسب» (Label): نتیجه یک ویژگی را گویند.

آماده‌سازی داده‌ها برای یادگیری نظارت نشده

در این مطلب، از «مجموعه داده گل زنبق» (Iris flower data set) یا «مجموعه داده زنبق فیشر» (Fisher's Iris data set) برای انجام پیش‌بینی‌های سریع استفاده می‌شود. مجموعه داده مذکور شامل یک مجموعه از ۱۵۰ رکورد و ۵ ویژگی (مشخصه | attribute) است. این ویژگی‌ها «طول گلبرگ» (Petal Length)، «عرض گلبرک» (Petal Width)، «طول کاسبرگ» (Sepal Length)، «عرض کاسبرگ» (Sepal width) و برچسب‌ها هستند.

برچسب‌ها در این مجموعه داده در واقع تعیین می‌کنند که هر نمونه با طول کاسبرگ و گلبرگ خود از کدام گونه گل زنبق است. گونه‌های موجود در این مجموعه داده شامل «زنبق سِتوسا» (Iris Setosa)، «زنبق ویرجینیکا» (Iris Virginica) و «زنبق وِرسیکالر» (Iris Versicolor) هستند. برای الگوریتم یادگیری نظارت نشده، چهار ویژگی گل زنبق به مدل داده می‌شود و مدل پیش‌بینی می‌کند که هر نمونه به کدام دسته تعلق دارد. از کتابخانه sklearn در پایتون برای بارگذاری مجموعه داده Iris و کتابخانه matplotlib به منظور بصری‌سازی داده‌ها استفاده شده است. قطعه کدی که در زیر آمده به منظور کاوش مجموعه داده مورد استفاده قرار می‌گیرد.

1# Importing Modules
2from sklearn import datasets
3import matplotlib.pyplot as plt
4
5# Loading dataset
6iris_df = datasets.load_iris()
7
8# Available methods on dataset
9print(dir(iris_df))
10
11# Features
12print(iris_df.feature_names)
13
14# Targets
15print(iris_df.target)
16
17# Target Names
18print(iris_df.target_names)
19label = {0: 'red', 1: 'blue', 2: 'green'}
20
21# Dataset Slicing
22x_axis = iris_df.data[:, 0]  # Sepal Length
23y_axis = iris_df.data[:, 2]  # Sepal Width
24
25# Plotting
26plt.scatter(x_axis, y_axis, c=iris_df.target)
27plt.show()
['DESCR', 'data', 'feature_names', 'target', 'target_names']
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
['setosa' 'versicolor' 'virginica']

مجموعه داده Iris

خوشه‌بندی

در خوشه‌بندی (Clustering)، داده‌ها به چندین گروه تقسیم‌بندی می‌شوند.

به بیان ساده، هدف جداسازی گروه‌هایی با «صفات» (traits) مشترک (منظور ویژگی‌های مشترک است) و تخصیص آن‌ها به خوشه‌ها است.

خوشه‌بندی

در تصویر بالا، نقاط داده موجود در نمودار سمت چپ داده‌های خامی هستند که «دسته‌بندی» (Classification) روی آن‌ها انجام نشده است. تصویر سمت راست داده‌های خوشه‌بندی شده هستند (داده‌ها بر پایه ویژگی‌هایشان دسته‌بندی شده‌اند). هنگامی که ورودی که براساس آن پیش‌بینی انجام می‌شود به مدل داده شد، برپایه ویژگی‌هایی که دارد خوشه‌ای که به آن متعلق است مورد بررسی قرار می‌گیرد و پیش‌بینی انجام می‌شود.

خوشه‌بندی K-Means در پایتون

«خوشه‌بندی K-means» یک الگوریتم خوشه‌بندی محسوب می‌شود که هدف آن پیدا کردن بیشینه محلی است. در این الگوریتم، ابتدا تعداد خوشه‌های مورد نظر باید انتخاب شوند. از آنجا که برای مجموعه داده Iris سه دسته وجود دارد، در اینجا الگوریتم طوری برنامه‌ریزی می‌شود تا داده‌ها را با پاس دادن پارامتر n_clusters به مدل KMeans در سه خوشه قرار دهد. اکنون، به طور تصادفی سه نقطه (ورودی) به سه دسته تخصیص پیدا می‌کنند. برپایه فاصله «مرکزوار» (Centroid) بین هر دو نقطه‌ای، ورودی بعدی به خوشه مربوطه تخصیص پیدا می‌کند. اکنون مراکز دسته‌ها مجددا برای همه خوشه‌ها انتخاب می‌شوند.

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

کد پیاده‌سازی الگوریتم K-Means در پایتون

1# Importing Modules
2from sklearn import datasets
3from sklearn.cluster import KMeans
4
5# Loading dataset
6iris_df = datasets.load_iris()
7
8# Declaring Model
9model = KMeans(n_clusters=3)
10
11# Fitting Model
12model.fit(iris_df.data)
13
14# Predicitng a single input
15predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]])
16
17# Prediction on the entire data
18all_predictions = model.predict(iris_df.data)
19
20# Printing Predictions
21print(predicted_label)
22print(all_predictions)
[0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2]

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

«خوشه‌بندی سلسله‌مراتبی» (Hierarchical Clustering)، همانطور که از نام آن بر می‌آید الگوریتمی است که یک سلسله مراتب از خوشه‌ها می‌سازد. این الگوریتم با همه داده‌هایی که به خوشه خودشان تخصیص داده شده‌اند آغاز به کار می‌کند.

سپس، دو خوشه نزدیک‌تر به یکدیگر در یک خوشه مشترک ملحق می‌شوند. در پایان، این الگوریتم با حالتی که تنها یک خوشه مجزا باقیمانده به کار خود پایان می‌دهد. تکمیل خوشه‌بندی سلسله مراتبی را می‌توان با «دِندروگرام» (Dendrogram) نشان داد. اکنون می‌توان یک مثال از خوشه‌بندی سلسله‌مراتبی داده‌های غلات را مشاهده کرد. مجموعه داده مربوط به این مثال از اینجا (+) در دسترس هستند.

پیاده‌سازی خوشه‌بندی سلسله‌مراتبی در پایتون

1# Importing Modules
2from scipy.cluster.hierarchy import linkage, dendrogram
3import matplotlib.pyplot as plt
4import pandas as pd
5
6# Reading the DataFrame
7seeds_df = pd.read_csv(
8    "https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv")
9
10# Remove the grain species from the DataFrame, save for later
11varieties = list(seeds_df.pop('grain_variety'))
12
13# Extract the measurements as a NumPy array
14samples = seeds_df.values
15
16"""
17Perform hierarchical clustering on samples using the
18linkage() function with the method='complete' keyword argument.
19Assign the result to mergings.
20"""
21mergings = linkage(samples, method='complete')
22
23"""
24Plot a dendrogram using the dendrogram() function on mergings,
25specifying the keyword arguments labels=varieties, leaf_rotation=90,
26and leaf_font_size=6.
27"""
28dendrogram(mergings,
29           labels=varieties,
30           leaf_rotation=90,
31           leaf_font_size=6,
32           )
33
34plt.show()

تفاوت بین K-Means و خوشه‌بندی سلسله‌مراتبی

  • خوشه‌بندی سلسله‌مراتبی نمی‌تواند «کلان‌داده» (مِه‌داده | Big Data) را به خوبی مدیریت کند، اما خوشه‌بندی K-Means توانایی انجام این کار را دارد. دلیل این امر خطی بودن پیچیدگی زمانی K Means و برابری آن با (O(n است، در حالیکه خوشه‌بندی سلسله‌مراتبی از درجه دوم (O(n2 است.
  • در خوشه‌بندی K-Means، با توجه به اینکه انتخاب خوشه‌ها به صورت دلخواه انجام می‌شود، نتایج تولید شده طی اجراهای متعدد الگوریتم ممکن است متفاوت باشند.
  • K-Means کشف شده تا هنگامی که شکل خوشه «فراکره‌ای» (hyper spherical) (برای مثال دایره و کره) است به خوبی کار کند.
  • K-Means با داده‌های دارای نویز (noisy data) نمی‌تواند به خوبی کار کند، در حالیکه خوشه‌بندی سلسله‌مراتبی می تواند از یک مجموعه داده نویزی برای خوشه‌بندی استفاده کند.

دندروگرام

خوشه‌بندی t-SNE

t-SNE یکی از روش‌های یادگیری نظارت نشده برای بصری‌سازی داده‌ها است. این کلمه در واقع سرنامی برای عبارت «t-distributed stochastic neighbor embedding» محسوب می‌شود. این الگوریتم داده‌های ابعاد بالا را به فضای ۲ یا ۳ بُعدی نگاشت می‌کند که قابل بصری‌سازی هستند.

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

پیاده‌سازی خوشه‌بندی t-SNE در پایتون برای مجموعه داده Iris

1# Importing Modules
2from sklearn import datasets
3from sklearn.manifold import TSNE
4import matplotlib.pyplot as plt
5
6# Loading dataset
7iris_df = datasets.load_iris()
8
9# Defining Model
10model = TSNE(learning_rate=100)
11
12# Fitting Model
13transformed = model.fit_transform(iris_df.data)
14
15# Plotting 2d t-Sne
16x_axis = transformed[:, 0]
17y_axis = transformed[:, 1]
18
19plt.scatter(x_axis, y_axis, c=iris_df.target)
20plt.show()

در اینجا با توجه به اینکه مجموعه داده Iris دارای چهار ویژگی (4d) است، تبدیل و در یک شکل دوبُعدی نمایش داده شده. به طور مشابه، مدل t-SNE قابل اعمال بر یک مجموعه داده با n-ویژگی است.

الگوریتم t-sne

خوشه‌بندی DBSCAN

DBSCAN (خوشه‌بندی فضایی مبتنی بر چگالی کاربردهای دارای نویز) یک الگوریتم خوشه‌بندی محبوب است که به عنوان جایگزینی برای K-means در تحلیل‌های پیش‌بین مورد استفاده قرار می‌گیرد. این روش خوشه‌بندی نیازمند آن نیست که کاربر تعداد خوشه‌ها را برای اجرا به آن بدهد. اما در عوض، باید دو پارامتر دیگر توسط کاربر تنظیم شوند.

پیاده‌سازی scikit-learn این الگوریتم، دارای مقادیر پیش‌فرض برای پارامترهای eps و min_samples است. اما عموما انتظار می‌رود که کاربر این مقادیر را تنظیم کند. پارامتر eps بیشینه فاصله بین دو نقطه داده است که باید در یک همسایگی مشابه در نظر گرفته شود. پارامتر min_samples حداقل مقدار نقاط داده در یک همسایگی است که باید در نظر گرفته شود.

پیاده‌سازی خوشه‌بندی DBSCAN در پایتون

1# Importing Modules
2from sklearn.datasets import load_iris
3import matplotlib.pyplot as plt
4from sklearn.cluster import DBSCAN
5from sklearn.decomposition import PCA
6
7# Load Dataset
8iris = load_iris()
9
10# Declaring Model
11dbscan = DBSCAN()
12
13# Fitting
14dbscan.fit(iris.data)
15
16# Transoring Using PCA
17pca = PCA(n_components=2).fit(iris.data)
18pca_2d = pca.transform(iris.data)
19
20# Plot based on Class
21for i in range(0, pca_2d.shape[0]):
22    if dbscan.labels_[i] == 0:
23        c1 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='r', marker='+')
24    elif dbscan.labels_[i] == 1:
25        c2 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='g', marker='o')
26    elif dbscan.labels_[i] == -1:
27        c3 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='b', marker='*')
28
29plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise'])
30plt.title('DBSCAN finds 2 clusters and Noise')
31plt.show()

DBSCAN

دیگر روش‌های یادگیری نظارت نشده

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
towardsdatascience
۲ دیدگاه برای «یادگیری نظارت نشده (Unsupervised Learning) با پایتون — راهنمای جامع و کاربردی»

خط 3 لطفا اصلاح شود:
غلط: “در یادگیری نظارت شده، الگوریتم‌ها به حال خود رها می‌شوند”
صحیح: “در یادگیری نظارت نشده، الگوریتم‌ها به حال خود رها می‌شوند”

با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

این مورد اصلاح شد.

برای شما آرزوی سلامتی و موفقیت داریم.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *