انتخاب ویژگی با جستجوی تصادفی در پایتون — راهنمای کاربردی
«انتخاب ویژگی» (Feature Selection) همواره یک وظیفه مهم در «یادگیری ماشین» (Machine Learning) محسوب میشود. این کار تا حدی مهم است که برخی از «دانشمندان داده» (Data Scientists) معتقد هستند که انتخاب ویژگی حتی از انتخاب خود مدل هم مهمتر است.
انتخاب ویژگی و همخطی چندگانه
به طور کلی، یک رویکرد «نظارت نشده» (Unsupervised) معمولا برای یک انتخاب ویژگی ساده، کافی محسوب میشود. اگرچه، هر مدل روش «فکر کردن» به ویژگیهای مختص خودش را دارد و به شکل خاصی با «همبستگی» (Correlation) آنها با متغیر هدف برخورد میکند. علاوه بر آن، مدلهایی وجود دارند که توجه زیادی به «همخطی» (Collinearity) (برای مثال، همبستگی بین ویژگیها) ندارند و مدلهای دیگر (برای مثال مدلهای خطی)، در صورت وقوع این مورد دچار مشکل بسیار بزرگی میشوند.
اگرچه این امکان نیز وجود دارد که ویژگیها را با استفاده از برخی از سنجههای مرتبط معرفی شده توسط مدل (برای مثال، p-value از t-test انجام شده روی ضرایب رگرسیون خطی) رتبهبندی کرد، انتخاب صرفا مرتبطترین متغیرها کافی نخواهد بود. ویژگی مفروض است که برابر با ویژگی دیگری است؛ تنها ضرب در دو شده است. همبستگی خطی بین این ویژگیها اگر ۱ باشد و این ضرب ساده، همبستگی با متغیر هدف را تحت تاثیر قرار ندهد، بنابراین اگر صرفا مرتبطترین متغیرها انتخاب شوند، ویژگیهای اصلی و ویژگیهای ضرب شده انتخاب میشوند. این امر منجر به همخطی میشود که میتواند برای مدل بسیار خطرناک باشد. به همین منظور، در ادامه روشهایی برای انتخاب بهتر ویژگیها معرفی میشوند.
جستجوی تصادفی
جستجوی تصادفی یک ابزار بسیار مفید در جعبه ابزار دانشمندان داده است. این روش بسیار ساده، اغلب مورد استفاده قرار میگیرد. برای مثال، در «اعتبارسنجی متقابل» (Cross-Validation) و «بهینهسازی ابرپارامتری» (Hyperparameter Optimization) از جستجوی تصادفی استفاده میشود. جستجوی تصادفی بسیار ساده است. اگر یک شبکه چندبُعدی وجود داشته باشد و هدف پیدا کردن نقطهای در این شبکه باشد که «تابع هدف» (Objective Function) را بیشینه (یا کمینه) میکند، جستجوی تصادفی به صورت زیر عمل میکند.
- انتخاب یک نقطه تصادفی روی شبکه و محاسبه مقدار تابع هدف.
- اگر مقدار بهتر از بهترینی باشد که ذخیره شده، نقطه را در حافظه نگه دار.
- به تعداد مشخصی که از پیش تعیین شده، کار را تکرار کن.
جستجوی تصادفی به همین سادگی کار میکند. تنها کافی است که اعداد تصادفی تولید و بهترین آنها انتخاب شود. پرسشی که در این وهله مطرح میشود این است که آیا این راهکار برای پیدا کردن بیشینه (یا کمینه) سراسری مناسب است؟ البته که نه. نقطهای که به دنبال آن گشته میشود تنها یکی از نقاط (اگر کاربر خوششانس باشد) در فضای بسیار بزرگ است و تنها تعداد محدودی تکرار وجود دارد. احتمال به دست آوردن آن نقطه در یک شبکه N-نقطهای برابر با $$\frac{1}{N}$$ است. پس چرا جستجوی تصادفی زیاد استفاده میشود؟ دلیل این امر آن است که کاربر هیچ وقت واقعا نمیخواهد سنجه کارایی را بیشینه کند. بلکه، یک مقدار خوب و به طور منصفانهای بالا میخواهد که بالاترین مقدار ممکن نیست و این کار برای اجتناب از «بیشبرازش» (Overfitting) انجام میشود. به همین دلیل است که جستجوی تصادفی پاسخگو است و میتوان از آن برای انتخاب ویژگی استفاده کرد.
انتخاب ویژگی با جستجوی تصادفی
جستجوی تصادفی برای انتخاب ویژگی با نتایج خوب، قابل استفاده است. روال استفاده از این روش، مشابه با جستجوی تصادفی موجود در مدل درخت تصادفی است که انتخاب تصادفی ویژگیها برای هر درخت را انجام میدهد. این روش بسیار ساده است. ویژگیها به صورت تصادفی انتخاب میشوند، کارایی مدل با اعتبارسنجی متقابل k-fold سنجیده و این کار بارها تکرار میشود. ترکیب ویژگیها، بهترین کارایی که کاربر به دنبال آن است را به دست میدهد.
به طور دقیقتر، گامهایی که برای انتخاب ویژگی با جستجوی تصادفی برداشته میشوند به صورت زیر هستند.
- تولید یک عدد صحیح تصادفی N بین ۱ و تعداد ویژگیها.
- تولید یک توالی تصادفی از N عدد صحیح بین ۰ و N-1 بدون تکرار. این توالی آرایه نشانگر آرایه ویژگیها است. لازم به یادآوری است که آرایه در پایتون از صفر آغاز میشود.
- مدل را روی این ویژگیها آموزش و اعتبارسنجی متقابل آن را با «اعتبارسنجی متقابل k-لایه» (K-Fold Cross-Validation) را انجام بده و مقدار میانگین برخی سنجههای کارایی را ذخیره کن.
- از گام ۱ هر تعداد بار که کاربر تمایل دارد، تکرار را انجام بده.
- در نهایت، آرایه ویژگیها را که بهترین کارایی را مطابق با سنجه کارایی منتخب دارد، در خروجی بده.
یک مثال کاربردی در پایتون
برای این مثال، از «مجموعه داده سرطان سینه» (Breast Cancer Dataset) که در کتابخانه sklearn وجود دارد، استفاده شده است. مدل «رگرسیون لجستیک» (Logistic Regression) است و اعتبارسنجی متقابل k-fold با استفاده از سنجه کارایی دقت (Accuracy) انجام میشود. اول از همه، باید ماژولهای مهم «وارد» (Import) شوند.
import sklearn.datasets from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score import numpy as np
سپس، میتوان مجموعه دادههای سرطان سینه را وارد کرد و آن را به دو بخش «ورودی» (Input) و «هدف» (Target) شکست.
dataset= sklearn.datasets.load_breast_cancer() data = dataset.data target = dataset.target
اکنون میتوان یک شی رگرسیون لجستیک را ساخت.
lr = LogisticRegression()
سپس، میتواند میانگین صحت را در اعتبارسنجی متقابل k-fold با همه ویژگیها سنجید.
# Model accuracy using all the features np.mean(cross_val_score(lr,data,target,cv=5,scoring="accuracy")) # ۰٫۹۵۰۹۰۴۱۹۳۹۲۰۷۳۸۵
۹۵٪ کار انجام شده است. اکنون، باید جستجوی تصادفی انجام شود. برای مثال، ۳۰۰ تکرار باید انجام شود.
result = [] # Number of iterations N_search = 300 # Random seed initialization np.random.seed(1) for i in range(N_search): # Generate a random number of features N_columns = list(np.random.choice(range(data.shape[1]),1)+1) # Given the number of features, generate features without replacement columns = list(np.random.choice(range(data.shape[1]), N_columns, replace=False)) # Perform k-fold cross validation scores = cross_val_score(lr,data[:,columns], target, cv=5, scoring="accuracy") # Store the result result.append({'columns':columns,'performance':np.mean(scores)}) # Sort the result array in descending order for performance measure result.sort(key=lambda x : -x['performance'])
در پایان حلقه و تابع مرتبسازی، اولین عنصر از لیست result شیئی است که به دنبال آن هستیم. از این مقدار میتوان برای محاسبه سنجه کارایی با این زیرمجموعه از ویژگیها استفاده کرد.
np.mean(cross_val_score(lr, data[:,result[0][‘columns’]], target, cv=5, scoring=”accuracy”)) # ۰٫۹۵۲۶۷۴۱۰۵۴۲۵۱۶۳۴
همانطور که مشهود است، صحت افزایش پیدا میکند.
جمعبندی
جستجوی تصادفی میتواند ابزار قدرتمندی برای انجام انتخاب ویژگی باشد. این بدین معنا نیست که دلیل مهمتر بودن برخی از ویژگیها نسبت به برخی از ویژگیهای دیگر مشخص میشود (همچون دیگر روالهای انتخاب ویژگی مانند «حذف ویژگی بازگشتی» (Recursive Feature Elimination)، اما میتواند ابزار قدرتمندی برای رسیدن به نتایج خوب در زمان کمتر باشد.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- مجموعه آموزشهای دادهکاوی یا Data Mining در متلب
- مجموعه آموزشهای آمار و احتمالات
- دادهکاوی (Data Mining) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
- دادهکاوی (Data Mining) و مفاهیم کلیدی آن — راهنمای جامع و ساده
مجموعه: داده کاوی برچسب ها: Feature Selection, k-Fold Cross-Validation, Random Search, Recursive Feature Elimination, اعتبارسنجی متقابل, اعتبارسنجی متقاطع, انتخاب ویژگی بازگشتی, جستجوی تصادفی