کاهش ابعاد در یادگیری ماشین چیست؟ – Dimensionality Reduction به زبان ساده

۱۴۶ بازدید
آخرین به‌روزرسانی: ۲۱ خرداد ۱۴۰۳
زمان مطالعه: ۲۶ دقیقه
کاهش ابعاد در یادگیری ماشین چیست؟ – Dimensionality Reduction به زبان ساده

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

997696

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

منظور از کاهش ابعاد چیست؟

هر زمان که در علوم و حوزه‌های مختلفی مانند یادگیری ماشین و یا آمار و احتمال از «ابعاد» صحبت می‌کنیم، در واقع به تعداد ویژگی‌ها یا همان متغیرهای ورودی یک دیتاست اشاره داریم. به عنوان مثال، دیتاستی را با ۲ ویژگی بسیار ساده «قد» و «وزن» در نظر بگیرید. این دیتاست و هر نمونه داده‌ای از آن را می‌توان در قالب یک نمودار دو بعدی مانند زیر به نمایش گذاشت:

مثال کاهش ابعاد با دو ویژگی
مثال کاهش ابعاد با دو ویژگی

اگر بُعد دیگری را نیز با عنوان «سن» به این دیتاست اضافه کنیم، تعداد ابعاد آن به ۳ ارتقاء یافته و هر نمونه را می‌توان بر روی فضایی سه بعدی مانند زیر ترسیم کرد:

مثال کاهش ابعاد با سه ویژگی
مثال کاهش ابعاد با سه ویژگی

به همین شکل، اغلب دیتاست‌های کاربردی در جهان حقیقی نیز ویژگی‌های زیادی دارند. نمونه داده‌هایی که در فضایی با ابعاد بالا قرار داشته و مصورسازی آن‌ها کار دشواری است. دانشمندان علم داده و همچنین مهندسین یادگیری ماشین، دیتاست را موجودیتی شامل چندین سطر و ستون تعریف می‌کنند که هر ستون بیانگر بُعدی از فضای n n بُعدی ویژگی، و سطرها همان نقاط داده ترسیم شده در فضای چند بُعدی هستند. به بیان ساده‌تر، کاهش ابعاد فرایندی است که همزمان با حفظ حداکثری تنوع داده‌ها، تعداد ویژگی‌‌های دیتاست اصلی را کاهش می‌دهد. کاهش ابعاد بخشی از مرحله پیش‌پردازش داده به‌حساب می‌آید. به این معنی که فرایند Dimensionality Reduction باید پیش از آموزش مدل یادگیری ماشین اجرا شود. حالا و پس از آشنایی با مفاهیم اولیه، در ادامه به بررسی اهمیت کاهش ابعاد در یادگیری ماشین می‌پردازیم.

اهمیت کاهش ابعاد در یادگیری ماشین

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

تبدیل فضای دو بعدی به سه بعدی
تبدیل فضای دو بعدی به سه بعدی

آموزش کاهش ابعاد در یادگیری ماشین با فرادرس

دوره آموزش کاهش ابعاد فرادرس
برای دسترسی به فیلم آموزش کاهش ابعاد، روی تصویر کلیک کنید.

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

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

چرا به تکنیک های کاهش ابعاد نیاز داریم؟

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

ذره بینی متمرکز بر چند نقطه داده که نیاز به تکنیک های کاهش ابعاد را نشان می دهد
  • با کاهش تعداد ویژگی‌ها، فضای لازم برای ذخیره‌سازی نیز کاهش پیدا می‌کند.
  • ابعاد کمتر به محاسبات و زمان آموزش کمتری نیاز دارد.
  • در برخی الگوریتم‌ها، ابعاد بالا به عملکردی ضعیف ختم می‌شود و از همین جهت لازم است تا ابتدا فرایند کاهش ابعاد اجرا شود.
  • کاهش ابعاد با حذف ویژگی‌های اضافی از وضعیت «همخطی چندگانه» (Multicollinearity) جلوگیری می‌کند. به عنوان مثال دو متغیر «زمان سپری شده روی تردمیل به دقیقه» و «میزان کالری سوزانده شده» را در نظر بگیرید. این دو ویژگی همبستگی بالایی با یک‌دیگر دارند. چرا که صرف زمان بیشتر برای دویدن روی تردمیل برابر با سوزاندن کالری بیشتر است. در نتیجه نیازی به ذخیره هر دو این ویژگی‌ها نیست و تنها یک مورد از آن‌ها اطلاعات مورد نیاز را در اختیار ما قرار می‌دهد.
  • به مصورسازی داده‌ها کمک می‌کند. همان‌گونه که پیش‌تر نیز توضیح دادیم، مصورسازی داده‌ها در ابعاد بالا کار دشواری است و با کاهش فضا به دو یا سه بُعد، می‌توان درک بهتری از توزیع داده‌ها به‌دست آورد.

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

روش های کاهش ابعاد در یادگیری ماشین

برای معرفی روش‌های کاهش ابعاد در یادگیری ماشین، ابتدا باید بگوییم که کاهش ابعاد یا Dimensionality Reduction به دو شیوه زیر قابل انجام است:

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

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

۱. نسبت مقادیر گمشده

هنگامی که دیتاستی در اختیار شما قرار می‌گیرد، اولین قدم بررسی و ارزیابی داده‌ها پیش از ساخت هر گونه مدل یادگیری است. در بیشتر اوقات متوجه برخی مقادیر گمشده در دیتاست می‌شوید که باید یا جایگذاری و یا حذف شوند. اما چه می‌شود اگر حجم زیادی از داده‌ها، برای مثال ۵۰ درصد از یک ویژگی را مقادیر گمشده تشکیل داده باشند. در چنین شرایطی بهتر است ویژگی به‌طور کامل حذف شود اما، می‌توان این کار را با تعیین حد آستانه‌ای مشخص انجام داد. یعنی تنها در صورتی ویژگی حذف شود که درصد مقادیر گمشده از حد آستانه فراتر رود. برای پیاده‌سازی روش «نسبت مقادیر گمشده» (Missing Value Ratio)، ابتدا کتابخانه‌های مورد نیاز را فراخوانی کرده و دیتاست را در متغیری با نام df  ذخیره می‌کنیم:

1# importing required libraries
2import pandas as pd
3import numpy as np
4import matplotlib.pyplot as plt
5
6
7# read the data
8df = pd.read_csv("df_train.csv")

سپس برای بررسی درصد مقادیر گمشده در هر متغیر یا ویژگی، از دو متد isnull()  و sum()  کمک می‌گیریم:

1# checking the percentage of missing values in each variable
2df.isnull().sum() / len(df)*100

همان‌طور که در تصویر زیر مشاهده می‌کنید، تنها دو متغیر Item_Weight و Outlet_Size با مشکل مقادیر گمشده روبه‌رو هستند:

درصد مقادیر گمشده در هر ویژگی
درصد مقادیر گمشده در هر ویژگی - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

برای حل این مشکل می‌توان از تکنیک‌های جایگذاری استفاده کرد و یا مانند زیر و با تعیین حد آستانه‌ای ۲۰ درصدی، متغیرهایی که بیش از ۲۰ درصد از مقادیر آن‌ها گمشده است را حذف و در نهایت لیست متغیرهای باقی‌مانده را در خروجی چاپ کنیم:

1# saving missing values in a variable
2m_values = df.isnull().sum() / len(df)*100
3# saving column names in a variable
4variables = train.columns
5variable = [ ]
6for i in range(0, 12):
7    if m_values[i] <= 20:   # setting the threshold as 20%
8        variable.append(variables[i])
9
10print(variable)

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

['Item_Identifier', 'Item_Weight', 'Item_Fat_Content', 'Item_Visibility', 'Item_Type', 'Item_MRP', 'Outlet_Identifier', 'Outlet_Establishment_Year', 'Outlet_Location_Type', 'Outlet_Type', 'Item_Outlet_Sales']

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

۲. فیلتر واریانس پایین

متغیری در دیتاست را در نظر بگیرید که مقدار تمام نمونه‌های آن برابر با ۱ است. چنین متغیری در ساخت مدل یادگیری ماشین مفید نخواهد بود. زیرا واریانسی برابر با صفر دارد. در روش «فیلتر واریانس پایین» (Low Variance Filter)، ابتدا واریانس هر ویژگی حساب شده و پس از مقایسه، ویژگی‌ها با واریانس پایین حذف می‌شوند. زیرا متغیرهایی که واریانس پایین داشته باشند، تاثیری بر متغیر هدف نمی‌گذارند. برای پیاده‌سازی این روش، ابتدا مقادیر گمشده دو ستون Item_Weight و Outlet_Size را به ترتیب با مقادیر میانه و نما همان ستون جایگزین می‌کنیم:

1df['Item_Weight'].fillna(df['Item_Weight'].median(), inplace=True)
2df['Outlet_Size'].fillna(df['Outlet_Size'].mode()[0], inplace=True)

در مرحله بعد و پس از جایگذاری، مجدد نگاهی به تعداد مقادیر گمشده هر ویژگی می‌اندازیم:

1df.isnull().sum() / len(train)*100

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

درصد مقادیر گمشده در هر ویژگی پس از جایگذاری
درصد مقادیر گمشده در هر ویژگی پس از جایگذاری - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

همان‌طور که ملاحظه می‌کنید دیگر هیچ متغیری داده گمشده ندارد. در مرحله بعد با فراخوانی متد var()  بر روی ویژگی‌های عددی دیتاست، مقدار واریانس آن‌ها را محاسبه می‌کنیم:

1df[['Item_Weight', 'Item_Visibility', 'Item_MRP',
2    'Outlet_Establishment_Year', 'Item_Outlet_Sales']].var()

مطابق با نتایج به‌دست آمده، واریانس ویژگی Item_Visibility (مشخص شده با رنگ قرمز) بسیار کمتر از سایر متغیرها است:

مقدار واریانس متغیر های عددی
مقدار واریانس متغیرهای عددی - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

با اعمال یک فیلتر واریانس پایین، به‌راحتی می‌توانیم ستون Item_Visibility را حذف کنیم:

1numeric = df[['Item_Weight', 'Item_Visibility', 'Item_MRP',
2              'Outlet_Establishment_Year', 'Item_Outlet_Sales']]
3var = numeric.var()
4numeric = numeric.columns
5variable = []
6for i in range(0, len(var)):
7    if var[i] >= 10:   # setting the threshold as 10%
8       variable.append(numeric[i])
9
10print(variable)

پس از اجرای قطعه کد بالا، خروجی مانند نمونه حاصل می‌شود:

['Item_Weight', 'Item_MRP', 'Outlet_Establishment_Year', 'Item_Outlet_Sales']

تنها ستون‌هایی در خروجی مشاهده می‌شوند که واریانس بیشتر از ۱۰ داشته‌اند.

۳. فیلتر همبستگی بالا

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

برای محاسبه همبستگی با استفاده از زبان برنامه نویسی پایتون، ابتدا متغیر وابسته یا همان Item_Outlet_Sales را در دیتافریم جدیدی با عنوان df_co  ذخیره و متد corr()  را فراخوانی می‌کنیم:

1df_co = df.drop('Item_Outlet_Sales', axis=1)
2df_co[['Item_Weight', 'Item_Visibility', 'Item_MRP',
3       'Outlet_Establishment_Year']].corr()

جدول زیر همبستگی میان متغیرهای عددی را نشان می‌دهد:

همبستگی محاسبه شده میان متغیر های عددی
همبستگی محاسبه شده میان متغیرهای عددی - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

به‌طور معمول اگر همبستگی میان دو متغیر بیش از ۰/۵ باشد، بهتر است یکی از آن‌ها را حذف کنیم. با این حال، در دیتاست ما هیچ دو متغیری همبستگی بالا ندارند و نیازی به حذف متغیر نیست.

۴. جنگل تصادفی

از «جنگل تصادفی» (Random Forest) به عنوان یکی از رایج‌ترین الگوریتم‌های مورد استفاده در انتخاب ویژگی یاد می‌شود. معیار اهمیت ویژگی‌ها در این الگوریتم از پیش مشخص شده و دیگر نیازی به تشخیص ما نیست. در نتیجه راحت‌تر می‌توانیم زیرمجموعه‌ای کوچک از ویژگی‌ها را انتخاب کنیم. برای پیاده‌سازی الگوریتم جنگل تصادفی از کلاس RandomForestRegressor کتابخانه Scikit-learn استفاده می‌کنیم که تنها متغیرهای عددی را به عنوان پارامتر ورودی قبول می‌کند. به همین خاطر، از تکنیک «کدبندی وان هات» (One Hot Encoding) برای تبدیل داده‌ها به نوع عددی بهره می‌بریم. همچنین دو ستون Item_Identifier و Outlet_Identifier را که فاقد اطلاعات ارزشمند هستند و از مقادیر عددی منحصربه‌فردی تشکیل شده‌اند، از دیتاست حذف می‌کنیم:

1from sklearn.ensemble import RandomForestRegressor
2
3
4df_rf = df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1)
5model = RandomForestRegressor(random_state=1, max_depth=10)
6df_rf = pd.get_dummies(df_rf)
7model.fit(df_rf, train.Item_Outlet_Sales)

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

1features = df_rf.columns
2importances = model.feature_importances_
3indices = np.argsort(importances)[-9:]  # top 10 features
4plt.title('Feature Importances')
5plt.barh(range(len(indices)), importances[indices], color='b', align='center')
6plt.yticks(range(len(indices)), [features[i] for i in indices])
7plt.xlabel('Relative Importance')
8plt.show()

خروجی، تصویری مانند زیر است:

نمودار اهمیت ویژگی پس از اعمال الگوریتم جنگل تصادفی
نمودار اهمیت ویژگی پس از اعمال الگوریتم جنگل تصادفی - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

مطابق با نمودار به‌دست آمده، می‌توانیم مهم‌ترین ویژگی‌ها را برای کاهش ابعاد انتخاب کنیم. کتابخانه Scikit-learn نیز کلاسی تحت عنوان SelectFromModel دارد که همین کار را بر اساس اهمیت ویژگی‌ها به‌طور خودکار برای ما انجام می‌دهد:

1from sklearn.feature_selection import SelectFromModel
2
3
4feature = SelectFromModel(model)
5fit_rf = feature.fit_transform(df_rf, df.Item_Outlet_Sales)

۵. حذف ویژگی رو به عقب

روش «حذف ویژگی رو به عقب» (Backward Feature Elimination) یکی دیگر از رویکردهایی است که برای کاهش ابعاد در یادگیری ماشین از آن استفاده می‌شود. مراحل اجرای این تکنیک به شرح زیر است:

  • ابتدا مدل را با همه ویژگی‌های دیتاست آموزش می‌دهیم.
  • عملکرد مدل را ارزیابی می‌کنیم.
  • هر بار یکی از ویژگی‌ها را حذف کرده و مدل را با n1 n -1 ویژگی باقی‌مانده آموزش می‌دهیم.
  • ویژگی که کمترین تاثیر را در عملکرد مدل داشته شناسایی و از دیتاست حذف می‌کنیم.
  • قدم‌های فوق را تا جایی تکرار می‌کنیم که دیگر هیچ ویژگی قابل حذف نباشد.

برای پیاده‌سازی این الگوریتم باید تعداد ویژگی‌های انتخابی را از طریق پارامتر n_features_to_select کلاس RFE مشخص کنیم. همچنین برای تحلیل اهمیت هر کدام از ویژگی‌ها، خروجی دستور rfe.ranking_ را چاپ می‌کنیم:

1# importing required libraries
2import pandas as pd
3from sklearn.linear_model import LinearRegression
4from sklearn.feature_selection import RFE
5
6
7# seperate the target and independent variable
8X = df.drop(columns = ['Item_Outlet_Sales', 'Item_Identifier', 
9                       'Item_Fat_Content', 'Item_Type', 'Outlet_Identifier', 
10                       'Outlet_Size', 'Outlet_Location_Type', 'Outlet_Type'], axis=1)
11y = df['Item_Outlet_Sales']
12
13# create the object of the model
14lreg = LinearRegression()
15
16# specify the number of  features to select 
17rfe = RFE(lreg, n_features_to_select=2)
18
19# fit the model
20rfe = rfe.fit(X, y)
21
22print('\n\nFEATUERS SELECTED\n\n')
23print(rfe.support_)
24
25print('\n\nRANKING OF FEATURES\n\n')
26print(rfe.ranking_)

خروجی به شرح زیر است:

FEATUERS SELECTED


[False  True  True False]


RANKING OF FEATURES


[3 1 1 2]

از آنجا که خواسته‌ایم تنها ۲ ویژگی را از میان ۴ ویژگی ورودی انتخاب کنیم، الگوریتم، ویژگی‌های دوم و سوم یعنی Item_Visibility و Item_MRP را برگزیده و در بخش رده‌بندی یا Ranking نیز میزان اهمیت آن‌ها با عدد ۱، بالاتر از ویژگی‌های اول و چهارم قرار گرفته است.

۶. انتخاب ویژگی رو به جلو

در «انتخاب ویژگی رو به جلو» (Forward Feature Selection)، همان‌طور که از نام آن مشخص است، بر عکس روش حذف ویژگی رو به عقب عمل می‌کنیم. در واقع به‌جای حذف، تمرکزمان را بر پیدا کردن ویژگی‌هایی می‌گذاریم که بیشترین تاثیر را بر عملکرد مدل‌ یادگیری ماشین می‌گذارند. روند اجرای این تکنیک که با عنوان استخراج ویژگی نیز شناخته می‌شود به شرح زیر است:

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

برای پیاده‌سازی این روش مانند نمونه عمل می‌کنیم:

1from sklearn.feature_selection import f_regression
2
3
4X = df.drop(columns = ['Item_Outlet_Sales', 'Item_Identifier', 
5                       'Item_Fat_Content', 'Item_Type', 'Outlet_Identifier', 
6                       'Outlet_Size', 'Outlet_Location_Type', 'Outlet_Type'], axis=1)
7ffs = f_regression(X, df.Item_Outlet_Sales )
8
9print(ffs)

در بخش زیر، خروجی اجرای این قطعه کد را مشاهده می‌کنید:

(array([8.00638865e-01, 1.43345451e+02, 4.04945623e+03, 2.06215699e+01]),
 array([3.70927701e-01, 9.04128718e-33, 0.00000000e+00, 5.67308211e-06]))

خروجی، دو آرایه را با مقادیری تحت عنوان F-values و p-values برای هر ویژگی نشان می‌دهد. هر چه رابطه خطی میان ویژگی با متغیر هدف بیشتر باشد، مقدار F-value بیشتر و p-value کمتر است. در اینجا هدف را انتخاب ویژگی‌هایی می‌گذاریم که مقدار F-value بیشتر از ۱۰ داشته باشند و سپس نتایج ذخیره شده در متغیر variable  را در خروجی چاپ می‌کنیم:

1variable = [ ]
2for i in range(0, len(X.columns)-1):
3    if ffs[0][i] >= 10:
4       variable.append(X.columns[i])
5
6print(variable)

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

['Item_Visibility', 'Item_MRP']

همان‌طور که ملاحظه می‌کنید، دو متغیر Item_Visibility و Item_MRP توسط الگوریتم انتخاب شده‌اند.

روش‌هایی که تا اینجا برای کاهش ابعاد در یادگیری ماشین معرفی کرده‌ایم از جمله حذف ویژگی رو به عقب و انتخاب ویژگی رو به جلو، بسیار زمان‌بر بوده و از نظر محاسباتی نیز تنها برای دیتاست‌های کوچک با تعداد متغیرهای کم به‌صرفه هستند. از همین جهت، در ادامه با به‌کارگیری دیتاست Fashion MNIST که متشکل از تصاویر انواع پوشاک مانند پیراهن، شلوار و کیف است، به بررسی الگوریتم‌های متناسب با دیتاست‌های بزرگ می‌پردازیم. این دیتاست شامل ۷۰ هزار تصویر است که ۶۰ هزار مورد آن در مجموعه آموزشی و ۱۰ هزار تصویر دیگر در مجموعه آزمایشی ذخیره شده‌اند. برای الگوریتم‌های بعدی، استفاده از تصاویر مجموعه آموزشی کفایت می‌کند.

۷. تحلیل عاملی

دیتاستی را با دو متغیر «درآمد» و «تحصیلات» تصور کنید. با توجه به همبستگی بالایی که میان این دو متغیر وجود دارد، در اکثر مواقع، سطح تحصیلات بالاتر به درآمد بیشتری منجر می‌شود. در روش «تحلیل عاملی» (Factor Analysis) متغیرها بر اساس معیار همبستگی گروه‌بندی می‌شوند. به بیان دیگر، متغیرهای هر گروه با یک‌دیگر همبستگی بالا و با متغیرهای سایر گروه‌ها همبستگی پایینی دارند. مجموعه متغیرهای مرتبط با هم در یک گروه را «عامل» (Factor) می‌نامند. هنگام ساده‌سازی انواع معیارها و همچنین مدل‌سازی خطی، تکنیک‌هایی مانند «نگاشت ویژگی» (Feature Projection) و «تحلیل تشخیصی خطی» (Linear Discriminant Analysis | LDA) به کار می‌آیند.

نموداری با اشکال هندسی مختلف نگاشت شده بر آن که نشان دهنده تکنیک تحلیل عاملی است

در قدم اول، همه تصاویر موجود در مجموعه آموزشی را خوانده و در متغیر images  ذخیره می‌کنیم:

1import pandas as pd
2import numpy as np
3from glob import glob
4import cv2
5
6
7images = [cv2.imread(file) for file in glob('MNIST_train/*.png')]

سپس برای اجرای عملیات‌های ریاضی و مصورسازی، فرمت تصاویر را به آرایه کتابخانه Numpy تغییر می‌دهیم:

1images = np.array(images)
2images.shape

همان‌طور که در خروجی ملاحظه می‌کنید، تعداد ۶۰ هزار تصویر با ابعاد ۲۸ پیکسل در ۲۸ پیکسل و پروفایل رنگی RGB در متغیر images ذخیره شده‌اند:

(60000, 28, 28, 3)

از آنجا که ورودی اغلب تکنیک‌های رایج تک بعدی است، باید ابعاد تصاویر را به یک بعد کاهش دهیم:

1image = []
2for i in range(0, images.shape[0]):
3    img = images[i].flatten()
4    image.append(img)
5
6image = np.array(image)

بهتر است آرایه Numpy را به دیتافریمی از کتابخانه Pandas تبدیل کنیم که در آن، مقادیر پیکسلی و برچسب مربوط به هر تصویر ذخیره شده است:

1df_train = pd.read_csv('MNIST_train.csv')
2feat_cols = ['pixel'+str(i) for i in range(image.shape[1])]
3df = pd.DataFrame(image, columns=feat_cols)
4df['label'] = df_train['label']

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

1from sklearn.decomposition import FactorAnalysis
2
3
4fa = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values)

با مقداردهی پارامتر n_components در کلاس FactorAnalysis ، تعداد کل دسته‌های دیتاست مشخص می‌شود. پس از تبدیل داده‌ها، نوبت به رسم نتایج می‌رسد:

1%matplotlib inline
2import matplotlib.pyplot as plt
3
4
5plt.figure(figsize=(12, 8))
6plt.title('Factor Analysis')
7plt.scatter(fa[:, 0], fa[:, 1])
8plt.scatter(fa[:, 1], fa[:, 2])
9plt.scatter(fa[:, 2], fa[:, 0])

توزیع داده‌های تبدیل شده به شکل زیر است:

توزیع داده پس از اعمال روش تحلیل عاملی
توزیع داده پس از اعمال روش تحلیل عاملی - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

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

۸. تحلیل مؤلفه اصلی

با بهره‌گیری از روش «تحلیل مؤلفه اصلی» (Principal Component Analysis | PCA) می‌توانیم زیرمجموعه جدیدی را از مجموعه متغیرهای اصلی استخراج کنیم. هر کدام از متغیرهای جدید به‌دست آمده مؤلفه‌ اصلی نام دارند. توجه به نکات زیر درباره PCA بسیار حائز اهمیت است:

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

ابتدا و به‌صورت تصادفی، تعدادی از تصاویر دیتاست را در خروجی رسم می‌کنیم:

1rndperm = np.random.permutation(df.shape[0])
2plt.gray()
3fig = plt.figure(figsize=(20, 10))
4for i in range(0, 15):
5    ax = fig.add_subplot(3, 5, i+1)
6    ax.matshow(df.loc[rndperm[i],feat_cols].values.reshape((28, 28*3)).astype(float))

همان‌گونه که مشاهده می‌کنید، تصویر ۱۵ محصول در خروجی نمایان شده است:

تصاویر تصادفی از دیتاست
تصاویر تصادفی از دیتاست - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

سپس از کلاس PCA کتابخانه Scikit-learn برای تبدیل داده‌ها استفاده می‌کنیم:

1from sklearn.decomposition import PCA
2
3
4pca = PCA(n_components=4)
5pca_result = pca.fit_transform(df[feat_cols].values)

پارامتر n_components در کلاس PCA ، تعداد مؤلفه‌های اصلی دیتاست را مشخص می‌کند. در ادامه، میزان واریانس توصیف شده با ۴ مؤلفه را به تصویر می‌کشیم:

1plt.plot(range(4), pca.explained_variance_ratio_)
2plt.plot(range(4), np.cumsum(pca.explained_variance_ratio_))
3plt.title("Component-wise and Cumulative Explained Variance")

نمودار حاصل مانند زیر است:

نمودار واریانس مؤلفه ای و انباشه
نمودار واریانس مؤلفه‌ای و انباشه - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

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

1import seaborn as sns
2
3
4plt.style.use('fivethirtyeight')
5fig, axarr = plt.subplots(2, 2, figsize=(12, 8))
6sns.heatmap(pca.components_[0, :].reshape(28, 84), ax=axarr[0][0], cmap='gray_r')
7sns.heatmap(pca.components_[1, :].reshape(28, 84), ax=axarr[0][1], cmap='gray_r')
8sns.heatmap(pca.components_[2, :].reshape(28, 84), ax=axarr[1][0], cmap='gray_r')
9sns.heatmap(pca.components_[3, :].reshape(28, 84), ax=axarr[1][1], cmap='gray_r')
10axarr[0][0].set_title(
11"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[0]*100),
12fontsize=12
13)
14axarr[0][1].set_title(
15"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[1]*100),
16fontsize=12
17)
18axarr[1][0].set_title(
19"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[2]*100),
20fontsize=12
21)
22axarr[1][1].set_title(
23"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[3]*100),
24fontsize=12
25)
26axarr[0][0].set_aspect('equal')
27axarr[0][1].set_aspect('equal')
28axarr[1][0].set_aspect('equal')
29axarr[1][1].set_aspect('equal')
30
31plt.suptitle('4-Component PCA')

خروجی به شرح زیر است:

نمایش ۴ مؤلفه اصلی
نمایش ۴ مؤلفه اصلی - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

هر بُعد جدیدی که به تکنیک PCA اضافه شود، واریانس کمتری را نسبت به سایر ابعاد در مدل جذب می‌کند. مؤلفه‌های اول، دوم و سوم به ترتیب بیشترین اهمیت را دارند.

همچنین می‌توانیم از روش «تجزیه مقادیر منفرد» (Singular Value Decomposition | SVD) برای کاهش ابعاد در یادگیری ماشین بهره ببریم. در SVD متغیرهای اصلی به سه ماتریس تجزیه شده و متغیرهای اضافی از دیتاست حذف می‌شوند. تعیین این سه ماتریس از طریق «مقادیر ویژه» (Eigenvalues) و «بردارهای ویژه» (Eigenvectors) صورت می‌گیرد. مجله فرادرس مطلب جامعی را درباره مقادیر و بردارهای ویژه تهیه کرده است که با مراجعه به لینک زیر می‌توانید آن را مطالعه کنید:

برای کاهش ابعاد با روش SVD از کلاس TruncatedSVD کمک می‌گیریم:

1from sklearn.decomposition import TruncatedSVD
2
3
4svd = TruncatedSVD(n_components=3, random_state=42).fit_transform(df[feat_cols].values)

مصورسازی متغیرهای تبدیل شده با رسم سه مؤلفه اصلی اول مانند زیر انجام می‌شود:

1plt.figure(figsize=(12, 8))
2plt.title('SVD Components')
3plt.scatter(svd[:, 0], svd[:, 1])
4plt.scatter(svd[:, 1], svd[:, 2])
5plt.scatter(svd[:, 2],svd[:, 0])

خروجی مانند تصویر زیر خواهد بود:

متغیر های تبدیل شده پس از اعمال روش SVD
متغیرهای تبدیل شده پس از اعمال روش SVD - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

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

۹. تحلیل مؤلفه مستقل

«تحلیل مؤلفه مستقل» (Independent Component Analysis | ICA) یکی از مورد استفاده‌ترین روش‌های کاهش ابعاد در یادگیری ماشین است. در PCA، هدف پیدا کردن معیارهای ناهمبسته است اما در ICA، این معیارهای مستقل هستند که دنبال می‌شوند. دو متغیر را ناهمبسته می‌نامیم اگر هیچ رابطه خطی میان آن‌ها وجود نداشته باشد. اما مستقل بودن به معنی عدم وابستگی به سایر متغیرها است. به عنوان مثال، سن یک نفر مستقل از غذای او یا میزان زمانی است که صرف تماشای تلویزیون می‌کند. این الگوریتم، متغیرهای دیتاست را خطی و مستقل از هم در نظر می‌گیرد. به همین خاطر و از آنجا که هیچ متغیری به دیگر متغیرها وابستگی ندارد، به آن‌ها مؤلفه مستقل گفته می‌شود. برای مقایسه بهتر PCA و ICA به دو تصویر زیر توجه کنید:

مقایسه دو روش PCA و ICA

تصاویر ۱ و ۲ به ترتیب نتایج الگوریتم PCA و ICA را نسبت به دیتاستی مشابه نشان می‌دهند. فرمول محاسبه PCA عبارت است از:

x=Wχ x = W\chi

در این عبارت، x x به نمونه داده، W W به ماتریس «آمیخته» (Mixing) و χ \chi به مؤلفه‌های مستقل اشاره دارد. حالا باید ماتریس «نا آمیخته‌ای» (Un-mixing) پیدا کنیم که مؤلفه‌ها را تا حد امکان از یک‌دیگر جدا کند. رایج‌ترین روش برای اندازه‌گیری میزان استقلال مؤلفه‌ها، «نا گاوسی» (Non-Gaussianity) نام داشته و مانند زیر عمل می‌کند:

  • بر اساس «قضیه حد مرکزی» (Central Limit Theorem)، توزیع مؤلفه‌های مستقل به سمت نرمال (گاوسی) میل می‌کند.
  • تبدیلات بیشینه‌کننده معیار «کشیدگی» (Kurtosis) هر مؤلفه پیدا می‌شوند. گشتاور مربته سوم توزیع داده‌ها را کشیدگی می‌گویند.
  • با بیشینه‌سازی معیار کشیدگی، توزیع دیتاست از حالت گاوسی خارج شده و مؤلفه‌ها مستقل می‌شوند.
مقایسه توزیع گاوسی و غیرگاوسی
مقایسه توزیع گاوسی و غیرگاوسی

برای پیاده‌سازی الگوریتم ICA در پایتون از کتابخانه FastICA استفاده می‌کنیم:

1from sklearn.decomposition import FastICA
2
3
4ica = FastICA(n_components=3, random_state=12) 
5X = ica.fit_transform(df[feat_cols].values)

با مشخص کردن پارامتر n_components ، تعداد مؤلفه‌ها را برابر با ۳ قرار می‌دهیم. قطعه کد لازم برای مصورسازی داده‌های تبدیل شده مانند نمونه است:

1plt.figure(figsize=(12, 8))
2plt.title('ICA Components')
3plt.scatter(X[:, 0], X[:, 1])
4plt.scatter(X[:, 1], X[:, 2])
5plt.scatter(X[:, 2], X[:, 0])

با توجه به تصویر زیر، دیتاست به سه مؤلفه مستقل تقسیم شده است:

متغیر های تبدیل شده پس از اعمال روش ICA
متغیرهای تبدیل شده پس از اعمال روش ICA - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

محورهای افقی و عمودی، بیانگر مقادیر مؤلفه‌های مستقل هستند. در بخش بعد به معرفی تعدادی از روش‌های کاهش ابعاد در یادگیری ماشین می‌پردازیم که از تکنیک‌های «نگاشتی» (Projection) استفاده می‌کنند.

۱۰. روش های مبتنی بر نگاشت

برای شروع، بهتر است یاد بگیریم منظور از «تصویر کردن» یا «نگاشت» چیست. دو بردار با نام‌های a a و b b را در نظر بگیرید:

دو بردار با نام های a و b

می‌خواهیم نگاشت یا تصویر بردار a a را بر b b پیدا کنیم. زاویه بین این دو بردار را با θ \theta نمایش می‌دهیم. نگاشت بردار a a برابر است با a1 a1 :

نگاشت بردار a بر b

بردار a1 a1 با b b موازی است و در نتیجه می‌توانیم از طریق معادله زیر، نگاشت بردار a a را محاسبه کنیم:

a1=acosθ=ab^=abb a_1 = |a|\cos\theta = a\cdot\hat{b} = a\cdot\frac{b}{|b|}

در این معادله a1 a1 همان نگاشت بردار a a بر b b و b^ \hat{b} بردار واحدی است که در جهت بردار b b قرار دارد. تصویر کردن یک بردار بر بردار دیگر راهی برای کاهش ابعاد است. در تکنیک‌های نگاشتی، تحلیل داده چند بُعدی با تصویر کردن نقاط داده بر فضایی با ابعاد پایین انجام می‌شود. انواع روش‌های نگاشت را می‌توان به دو دسته «نگاشت بر جهت» (Projection onto Directions) و «نگاشت بر خمیده» (Projection onto Manifolds) تقسیم کرد. در ادامه به بررسی دقیق‌تر این دو روش می‌پردازیم.

نگاشت بر جهت

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

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

نگاشت بر خمیده

زمانی باور این بود که زمین صاف است. هر جا که قدم بگذارید (به‌جز کوه‌ها) زمین صاف به‌نظر می‌رسد. اما اگر در یک جهت حرکت کرده و ادامه دهید، سرانجام به همان موقعیت اول می‌رسید. اگر زمین صاف بود چنین نمی‌شد. ما فکر می‌کنیم زمین صاف است چرا که در مقایسه با آن بسیار کوچک‌تر هستیم. این قسمت‌های کوچکی که باعث می‌شوند زمین را صاف تصور کنیم، «خمیده» (Manifolds) نام دارند. ترکیب این خمیده‌ها دید وسیع‌تری از زمین به ما می‌دهد. به‌طرز مشابهی، در یک منحنی n n بعدی نیز قسمت‌های صاف نشانگر خمیده‌ها هستند. با ترکیب این خمیده‌ها می‌توانیم منحنی n n بعدی اصلی را بازسازی کنیم. مراحل اجرای روش نگاشت بر خمیده به شرح زیر است:

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

روش‌های متنوعی برای خمیده‌یابی وجود دارد که همه آن‌ها از رویکردی سه مرحله‌ای تشکیل می‌شوند. این مراحل عبارت‌اند از:

  1. ایجاد نموداری که در آن نقاط داده نقش رئوس را دارند.
  2. تبدیل نمودار ساخته شده در مرحله قبل به ورودی مناسب مسئله.
  3. محاسبه مقادیر ویژه.

خمیده‌ای را که نسبت به هر مرتبه‌ای مشتق‌پذیر باشد، به اصطلاح خمیده «نرم» (Smooth) گویند. با استفاده از الگوریتم ISOMAP، تصویر یک خمیده غیرخطی با ابعاد پایین قابل بازیابی است. البته با این فرض که خمیده مشتق‌پذیر بوده و به‌ازای هر دو نقطه، فاصله «ژئودزیک» (Geodesic) برابر با فاصله «اقلیدسی» (Euclidean) باشد. کوتاه‌ترین مسیر بین دو نقطه روی سطح منحنی و خط صاف را به ترتیب ژئودزیک و اقلیدسی گویند که در تصویر زیر مشخص شده است:

مقایسه فاصله ژئودزیک و اقلیدسی
به ترتیب از چپ به راست فاصله ژئودزیک و اقلیدسی

در این مثال، Dn1n2 Dn_1n_2 فاصله ژئودزیک و dn1n2 dn_1n_2 فاصله اقلیدسی را بین دو نقطه X1 X_1 و X2 X_2 نشان می‌دهد. در الگوریتم ISOMAP هر دو این فواصل یکسان فرض می‌شوند. مراحل اجرای این الگوریتم به سه بخش محاسبه گراف مجاورت، محاسبه «فاصله گراف‌ها» (Graph Distance) و «جانمایی» (Embedding) تقسیم می‌شود که در ادامه توضیح بیشتری از هر بخش ارائه می‌دهیم.

محاسبه گراف مجاورت

ابتدا و طبق معادله زیر، فاصله میان هر جفت نقطه داده به‌دست می‌آید:

dij=dχ(xi,xj)=xixjχ d_{ij} = d\chi(x_i, x_j) = \parallel x_i - x_j \parallel \chi

در این معادله، dχ(xi,xj) d\chi(x_i, x_j) فاصله ژئودزیک و xixj \parallel x_i - x_j \parallel فاصله اقلیدسی بین دو نقطه xi x_i و xj x_j را نشان می‌دهد. پس از محاسبه فاصله، همسایه‌های خمیده را مشخص کرده و در نهایت گراف همسایگی را مانند نمونه ایجاد می‌کنیم:

G=G(V,E) G = G(V, E)

نماد V V بیانگر مجموعه‌ای از رئوس به عنوان نقاط داده ورودی و E E شامل یال‌هایی است که همسایگی میان نقاط را نشان می‌دهند.

محاسبه فاصله گراف

در این مرحله فاصله ژئودزیک جفت نقاط داده روی خمیده به‌دست می‌آید. فاصل گراف برابر با کوتاه‌ترین مسیر بین تمام جفت نقاط داده در گراف G G است.

تعداد گره بهم متصل که نمای یک گراف را نشان می دهند

جانمایی

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

جهت پیاده‌سازی الگوریتم ISOMAP ابتدا نوعی تکنیک غیرخطی را بر روی زیرمجموعه‌ای از دیتاست اجرا می‌کنیم:

1from sklearn import manifold
2
3
4trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(df[feat_cols][:6000].values)

در کلاس Isomap که در قطعه کد بالا فراخوانی شده است، دو پارامتر n_neighbors و n_components به ترتیب تعداد همسایه‌های هر نقطه داده و مختصات خمیده را مشخص می‌کنند. همچنین مقدار پارامتر n_jobs را برابر با ‍۱- قرار می‌دهیم تا از همه قدرت پردازنده استفاده شود. نحوه رسم توزیع داده‌ها پس از کاهش ابعاد به شکل زیر است:

1plt.figure(figsize=(12, 8))
2plt.title('Decomposition using ISOMAP')
3plt.scatter(trans_data[:, 0], trans_data[:, 1])
4plt.scatter(trans_data[:, 1], trans_data[:, 2])
5plt.scatter(trans_data[:, 2], trans_data[:, 0])

همان‌طور که ملاحظه می‌کنید، همبستگی کمی میان مؤلفه‌ها وجود دارد:

متغیر های تبدیل شده پس از اعمال روش ISOMAP
متغیرهای تبدیل شده پس از اعمال روش ISOMAP - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

در الگوریتم ISOMAP همبستگی مؤلفه‌ها به یک‌دیگر حتی از روش SVD نیز کمتر است.

۱۱. t-توکاری همسایگی تصادفی توزیع شده

تا اینجا یاد گرفتیم که PCA انتخاب مناسبی برای کاهش ابعاد در یادگیری ماشین و مصورسازی دیتاست‌های بزرگ است. با این حال، تکنیک‌های پیشرفته‌تری مانند «t-توکاری همسایگی تصادفی توزیع شده» (t-Distributed Stochastic Neighbor Embedding | t-SNE) الگوها را به شیوه‌ای غیرخطی پیدا می‌کنند. برای نگاشت نقاط داده از دو رویکرد اصلی استفاده می‌شود:

  • رویکرد «محلی» (Local): نگاشت نقاط داده همسایه روی خمیده بر نقاط داده همسایه در ابعاد پایین.
  • رویکرد «سراسری» (Global): در این رویکرد تلاش می‌شود تا موقعیت نمونه‌ها در هر مقیاس حفظ شود. به عنوان مثال نقاط داده همسایه روی خمیده به نقاط داده همسایه در ابعاد پایین و نقاط دورتر به نقاط مشابهی نگاشت می‌شوند.

قطعه کد زیر نحوه پیاده‌سازی تکنیک t-SNE را در پایتون نشان می‌دهد:

1from sklearn.manifold import TSNE
2
3
4tsne = TSNE(n_components=3, n_iter=300).fit_transform(df[feat_cols][:6000].values)

پارامتر n_components  بیانگر تعداد مؤلفه‌ها بوده و برای رسم داده‌های تبدیل شده مانند نمونه عمل می‌کنیم:

1plt.figure(figsize=(12, 8))
2plt.title('t-SNE components')
3plt.scatter(tsne[:, 0], tsne[:, 1])
4plt.scatter(tsne[:, 1], tsne[:, 2])
5plt.scatter(tsne[:, 2], tsne[:, 0])

خروجی به شرح زیر است:

متغیر های تبدیل شده پس از اعمال روش t-SNE
متغیرهای تبدیل شده پس از اعمال روش t-SNE - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

در نمودار حاصل از تکنیک t-SNE، سه نوع مؤلفه متفاوت دیده می‌شود.

۱۲. نگاشت و برآورد خمیده یکسان

با وجود عملکرد بسیار خوب روش t-SNE نسبت به دیتاست‌های بزرگ، سرعت محاسبه پایینی داشته و نمایش قابل قبولی از اطلاعات ارائه نمی‌دهد. روش «نگاشت و برآورد خمیده یکسان» (Uniform Manifold Approximation and Projection | UMAP) در کاهش ابعاد کاربرد زیادی داشته و علاوه‌بر مزایای t-SNE، در مدت زمان کوتاه‌تری نیز اجرا می‌شود. به عنوان برخی از مزایای روش UMAP می‌توان به موارد زیر اشاره کرد:

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

این روش از مفهوم الگوریتم K-نزدیک‌ترین همسایه یا KNN برای بهینه‌سازی نتایج حاصل از «گرادیان کاهشی تصادفی» (Stochastic Gradient Descent) استفاده می‌کند. نحوه کار UMAP به این شکل است که ابتدا فاصله میان نقاط داده نگاشت شده به ابعاد پایین به‌دست آمده و سپس از الگوریتم گرادیان کاهشی در کمینه‌سازی تفاضل میان فواصل استفاده می‌شود. برای پیاده‌سازی روش UMAP در پایتون ابتدا لازم است کتابخانه umap-learn را مانند زیر نصب کنیم:

pip install umap-learn

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

1import umap
2
3
4umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(df[feat_cols][:6000].values)

در کلاس UMAP  پارامتر n_neighbors ، تعداد نقاطه همسایه و پارامتر min_dist میزان پراکندگی داده‌ها را مشخص می‌کند. به‌منظور ترسیم توزیع داده‌ها مانند زیر عمل می‌کنیم:

1plt.figure(figsize=(12, 8))
2plt.title('Decomposition using UMAP')
3plt.scatter(umap_data[:, 0], umap_data[:, 1])
4plt.scatter(umap_data[:, 1], umap_data[:, 2])
5plt.scatter(umap_data[:, 2], umap_data[:, 0])

مطابق با انتظار، ابعاد داده کاهش یافته و می‌توانیم مؤلفه‌های مختلف را مشاهده کنیم:

متغیر های تبدیل شده پس از اعمال روش UMAP
متغیرهای تبدیل شده پس از اعمال روش UMAP - «برای بزرگ‌نمایی روی تصویر کلیک کنید».

همبستگی کمی میان متغیرهای تبدیل شده وجود دارد. با مقایسه نتایج حاصل از دو روش UMAP و t-SNE متوجه می‌شویم که در UMAP، همبستگی به‌مراتب کمتری میان مؤلفه‌ها وجود دارد. به بیان ساده‌تر، روش UMAP عملکرد بهتری در جداسازی و درک مؤلفه‌های مستقل از خود نشان می‌دهد.

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

کاربرد تکنیک های کاهش ابعاد

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

صندوقی با اسناد آماری داخل آن که نشانگر کاربرد های کاهش ابعاد است
  • نسبت مقادیر گمشده: اگر بخش زیادی از مقادیر دیتاست به اصطلاح گمشده باشد، از این روش برای کاهش تعداد متغیرها بهره می‌بریم. در حقیقت متغیرهایی با درصد بالا از داده‌های گمشده حذف می‌شوند.
  • فیلتر واریانس پایین: زمانی از این روش استفاده می‌شود که بخواهیم متغیرهای ثابت را از دیتاست شناسایی و حذف کنیم. متغیر هدف، تحت تاثیر متغیرهایی با واریانس پایین قرار نمی‌گیرد و به سادگی می‌توان این قبیل از متغیرها را حذف کرد.
  • فیلتر همبستگی بالا: با توجه به احتمال رخداد شرایط همخطی چندگانه در دیتاست، از این تکنیک برای یافتن و حذف ویژگی‌های همبسته استفاده می‌کنند.
  • جنگل تصادفی: یکی از رایج‌ترین تکنیک‌هایی که نمایان‌گر اهمیت هر ویژگی در دیتاست است. در نتیجه تنها ویژگی‌هایی حفظ می‌شوند که بیشترین اهمیت را داشته و از ابعاد دیتاست کاسته می‌شود.
  • حذف ویژگی رو به عقب و انتخاب ویژگی رو به جلو: این دو روش از نظر محساباتی بسیار زمان‌بر بوده و تنها مناسب دیتاست‌های کوچک هستند.
  • تحلیل معیار: مناسب برای مسائلی که در آن‌ها درصد همبستگی متغیرها زیاد است. در این روش، متغیرها بر اساس معیار همبستگی به گروه‌های مختلف تقسیم می‌شوند.
  • تحلیل مؤلفه اصلی یا PCA: از جمله پر کاربردترین تکنیک‌های کاهش ابعاد در یادگیری ماشین برای داده‌های خطی. تقسیم داده‌ها در PCA بر اساس معیار واریانس صورت می‌گیرد.
  • تحلیل مؤلفه مستقل یا ICA: مورد استفاده در تبدیل داده‌ها به مؤلفه‌های مستقلی که نمونه‌ها را در ابعاد پایین‌تری به نمایش می‌گذارند.
  • ISOMAP: این الگوریتم زمانی به‌کار گرفته می‌شود که داده‌ها غیرخطی باشند.
  • t-SNE: بیشترین کاربرد را برای داده‌های غیرخطی داشته و مصورسازی با آن راحت است.
  • UMAP: برای داده‌هایی با ابعاد بالا مناسب بوده و زمان اجرای کوتاه‌تری نسبت به الگوریتم t-SNE دارد.

کاهش ابعاد چه مزایا و معایبی دارد؟

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

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

همچنین باید معایب زیر را نیز در نظر داشته باشیم:

  • فراموش شدن بخشی از اطلاعات.
  • گاهی هدف روش PCA که یافتن همبستگی خطی میان متغیرها است، مطلوب و مورد نیاز نیست.
  • اگر دو معیار میانگین و کوواریانس برای تعریف دیتاست کافی نباشند، روش PCA موفق نخواهد بود.
  • ممکن است تشخیص تعداد مؤلفه‌های اصلی کار راحتی نباشد.
  • گاهی تفسیر و درک ارتباط میان ویژگی‌های تبدیل شده و داده‌های اصلی دشوار است.
  • انتخاب مؤلفه‌ها بر اساس داده‌های آموزشی، احتمال وقوع مشکل بیش‌برازش را افزایش می‌دهد.
  • برخی تکنیک‌های کاهش ویژگی به «نمونه‌های پرت» (Outliers) حساس هستند. به این معنی که در انتها نمایش سوگیرانه‌ای از داده‌ها حاصل می‌شود.
  • کاهش ویژگی فرایندی هزینه‌بر از نظر محاسبات است. به‌ویژه اگر با دیتاست بزرگی سروکار داشته باشیم.

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

سوالات متداول

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

صفحه کامپیوتری که علامت سوال نشان می دهد و بیانگر سوالات متداول پیرامون کاهش ابعاد است

کاربرد تکنیک های کاهش ابعاد چیست؟

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

چرا کاهش ابعاد مهم است؟

استفاده از تکنیک‌های کاهش ابعاد به دلایل زیر اهمیت دارد:

  • کاهش احتمال بیش‌برازش.
  • بهبود عملکرد مدل یادگیری.
  • صرفه‌جویی در منابع و کاهش پیچیدگی محاسباتی.
  • مصورسازی راحت‌تر نمونه داده‌ها.

آیا PCA نوعی روش کاهش ابعاد به حساب می آید؟

بله. روش PCA همزمان با حفظ اطلاعات ارزشمند، فضای داده‌ها را به ابعاد پایین‌تری تغییر می‌دهد. پیاده‌سازی PCA در پروژه‌های یادگیری ماشین به مدیریت و پردازش سریع‌تر داده‌ها کمک می‌کند.

بیشتر از چه تکنیک هایی برای کاهش ابعاد استفاده می شود؟

پاسخ این سوال به نوع مسئله و اندازه دیتاست بستگی دارد. به عنوان مثال اگر تعداد ویژگی‌ها کم باشد، تکنیک‌هایی مانند جنگل تصادفی و انتخاب ویژگی بیشترین کاربرد را دارند. در غیر این‌صورت بهره‌گیری از الگوریتم‌هایی مانند t-SNE و UMAP توصیه می‌شود.

جمع‌بندی

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

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
GeeksforGeeksTowards Data ScienceAnalytics Vidhya
نظر شما چیست؟

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