انتخاب ویژگی در یادگیری ماشین چیست؟ – توضیح Featured Selection به زبان ساده

۲۵۷ بازدید
آخرین به‌روزرسانی: ۲۷ دی ۱۴۰۲
زمان مطالعه: ۱۷ دقیقه
انتخاب ویژگی در یادگیری ماشین چیست؟ – توضیح Featured Selection به زبان ساده

هنگام استفاده از «مجموعه‌داده‌ای» (Dataset) مشخص، به احتمال زیاد نیازی به تمامی داده‌ها و ستون‌های مجموعه‌داده برای آموزش مدل «یادگیری ماشین» (Machine Learning) خود نداشته باشید. استفاده از داده‌های غیر ضروری ممکن است مدل یادگیری ماشین را گمراه کرده و در نتیجه به «بیش‌برازش» (Overfitting) یا «کم‌برازش» (Underfitting) منتهی شود. متغیرهای ورودی مدل‌های یادگیری ماشین را «ویژگی» (Feature) می‌نامند. هر ستون در مجموعه‌داده برابر با یک ویژگی است. برای آموزش دادن مدلی بهینه، باید مطمئن شویم که تنها ویژگی‌های مهم و ضروری را انتخاب کرده‌ایم. اگر ویژگی‌های اضافه زیادی داشته باشیم، این امکان وجود دارد که مدل یادگیری ماشین الگوهای بی‌اهمیت را شناسایی و در نتیجه به خوبی آموزش نبیند. در این مطلب از مجله فرادرس، با مفهوم انتخاب ویژگی آشنا شده و نحوه به‌کارگیری آن را یاد می‌گیریم.

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

انتخاب ویژگی در یادگیری ماشین چیست؟

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

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

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

چرا انتخاب ویژگی لازم است؟

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

مثال خودروهای قدیمی در انتخاب ویژگی
جدول اطلاعات خودروها

همان‌طور که در جدول بالا مشاهده می‌کنید، مدل خودرو (Model)، سال تولید (Year) و مسافت طی شده (Miles) از جمله ویژگی‌های ارزشمند برای تشخیص نو یا قدیمی بودن خودرو هستند. با این حال، نام مالک قبلی خودرو (Owner)، اطلاعات مفیدی از میزان سلامت ماشین به ما ارائه نمی‌دهد. همین امر باعث گمراهی الگوریتم یادگیری ماشین در پیدا کردن روابط میان ویژگی‌های مختلف مجموعه داده می‌شود. در نتیجه بهتر است برای دستیابی به عملکرد بهتر، ویژگی Owner یا همان مالک را از مجموعه‌داده حذف کنیم.

مثال حذف ویژگی بیهوده
حذف ویژگی مالک

مدل های انتخاب ویژگی

تکنیک‌های انتخاب ویژگی را می‌توان به دو دسته نظارت شده و نظارت نشده تقسیم کرد. منظور از «یادگیری نظارت شده» (Supervised Learning)، استفاده از داده‌های برچسب‌گذاری شده برای آموزش الگوریتم‌های یادگیری ماشین و در نهایت پیش‌بینی خروجی یا همان پاسخ نمونه داده‌های جدید و از قبل دیده نشده است. از طرفی دیگر، در «یادگیری نظارت نشده» (Unsupervised Learning) داده‌ها بدون برچسب هستند و هدف، کشف الگوهای مخفی موجود در داده است.

روش های انتخاب ویژگی نظارت شده

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

  • «روش‌های جداسازی» (Filter Methods)
  • «روش‌های پوششی» (Wrapper Methods)
  • «روش‌های تعبیه شده» (Embedded Methods)

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

روش های جداسازی

در «روش‌های جداسازی» (Filter Methods)، ارزیابی ارزش هر ویژگی بدون در نظر گرفتن عملکرد مدل یادگیری ماشین صورت می‌پذیرد. در این روش‌ها، برای درک «همبستگی» (Correlation) میان داده‌ها، تنها داده‌ها مورد ارزیابی قرار می‌گیرند. روش‌های جداسازی از چهار دسته تکنیک انتخاب ویژگی زیر تشکیل می‌شوند:

  • «بهره اطلاعاتی» (Information Gain)
  • آزمون Chi-square
  • «امتیاز فیشر» (Fisher’s Score)
  • «نسبت مقادیر ناموجود» (Missing Value Ratio)

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

بهره اطلاعاتی

تکنیک «بهره اطلاعاتی» (Information Gain)، به معنی بررسی موارد مختلف و انتخاب مفیدترین گزینه برای رسیدن به پاسخ است. نحوه عملکرد این تکنیک، مانند مرتب‌سازی ابزارهای مختلف بر اساس رنگ یا شکل آن‌ها در گروه‌های مختلف و پیدا کردن کارآمدترین ابزار است. تکنیک بهره اطلاعاتی را می‌توان مانند زیر و در زبان برنامه‌نویسی پایتون‌ پیاده‌سازی کرد:

1import numpy as np
2import matplotlib.pyplot as plt
3from sklearn.datasets import load_diabetes
4from sklearn.feature_selection import mutual_info_regression
5
6# Load the diabetes dataset
7data = load_diabetes()
8
9# Split the dataset into features and target
10X = data.data
11y = data.target
12
13# Apply Information Gain
14ig = mutual_info_regression(X, y)
15
16# Create a dictionary of feature importance scores
17feature_scores = {}
18for i in range(len(data.feature_names)):
19    feature_scores[data.feature_names[i]] = ig[i]
20
21# Sort the features by importance score in descending order
22sorted_features = sorted(feature_scores.items(), key=lambda x: x[1], reverse=True)
23
24# Print the feature importance scores and the sorted features
25for feature, score in sorted_features:
26    print("Feature:", feature, "Score:", score)
27
28# Plot a horizontal bar chart of the feature importance scores
29fig, ax = plt.subplots()
30y_pos = np.arange(len(sorted_features))
31ax.barh(y_pos, [score for feature, score in sorted_features], align="center")
32ax.set_yticks(y_pos)
33ax.set_yticklabels([feature for feature, score in sorted_features])
34ax.invert_yaxis()  # Labels read top-to-bottom
35ax.set_xlabel("Importance Score")
36ax.set_title("Feature Importance Scores (Information Gain)")
37
38# Add importance scores as labels on the horizontal bar chart
39for i, v in enumerate([score for feature, score in sorted_features]):
40    ax.text(v + 0.01, i, str(round(v, 3)), color="black", fontweight="bold")
41plt.show()

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

نمودار بهره اطلاعاتی
نمودار بهره اطلاعاتی

در نمودار بالا، عدد بزرگ‌تر نشان‌دهنده اهمیت و تاثیر بالای هر ویژگی در احتمال مبتلا شدن به بیماری دیابت است.

آزمون Chi-square

آزمون Chi-square، آزمون آماری ساده‌ایست که از طریق آن می‌توان متوجه مرتبط بودن یا نبودن ویژگی‌ها به یک‌دیگر شد. فرمول آزمون Chi-square مانند زیر تعریف می‌شود:

$$ X^2 = \sum\frac{(O_i - E_i)^2}{E_i} $$

توضیح هر یک از نمادها در فرمول آزمون Chi-square به شرح زیر است:

  • نماد $$ X^2 $$: نشان‌دهنده نتیجه آماری آزمون Chi-square.
  • نماد $$ O $$: فراوانی مشاهده شده در یک دسته خاص.
  • نماد $$ E $$: نشان‌دهنده فراوانی مورد انتظار در یک دسته.

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

توزیع روش Chi-Square
توزیع Chi-Square

امتیاز فیشر

«امتیاز فیشر» (Fisher's Score) روشی است که از طریق آن می‌توان مهم‌ترین ویژگی‌های هر گروه یا دسته را پیدا کرد. در این روش، به هر یک از ویژگی‌ها بر اساس میزان اهمیتی که در فرایند یادگیری دارند، امتیاز داده می‌شود و هر چه امتیاز یک ویژگی بیشتر باشد، به این معنی است که باید بیشتر مورد توجه قرار بگیرد. امتیاز فیشر را می‌توانیم مانند زیر و به زبان برنامه‌نویسی پایتون پیاده‌سازی کنیم:

1from skfeature.function.similarity_based import fisher_score
2import matplotlib.pyplot as plt
3%matplotlib inline
4
5# Calculating scores
6ranks = fisher_score.fisher_score(X, Y)
7
8# Plotting the ranks
9feat_importances = pd.Series(ranks, dataframe.columns[0:len(dataframe.columns)-1])
10feat_importances.plot(kind='barh', color = 'teal')
11plt.show()

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

نمودار امتیاز فیشر
نمودار امتیاز فیشر

نسبت مقادیر ناموجود

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

روش های پوششی

«روش‌های پوششی» (Wrapper Methods) را می‌توان به دوستی تشبیه کرد که پس از بررسی ابزارهای مختلف، کارآمدترین‌ها را به شما معرفی می‌کند. روش‌های پوششی را می‌توان به چهار گروه زیر تقسیم کرد:

  • «انتخاب ویژگی رو به جلو» (Forward Selection)
  • «انتخاب ویژگی رو به عقب» (Backward Selection)
  • «انتخاب ویژگی جامع» (Exhaustive Feature Selection)
  • «حذف بازگشتی ویژگی» (Recursive Feature Elimination)

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

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

فرض کنید برای تسهیل کاری،‌ ابزار خاصی را انتخاب و از آن استفاده می‌کنید. سپس ابزار دیگری اضافه و بهره‌وری را بالاتر نیز می‌برید. با ادامه روند اضافه کردن ابزارهای جدید، در نهایت جعبه ابزاری از ابزارهای کاربردی را خواهید داشت. در نمونه کد زیر که به زبان پایتون نوشته شده است، از روش «رگرسیون لاجستیک» (Logistic Regression) برای تخمین و پیدا کردن بهترین ویژگی استفاده کرده‌ایم:

1import numpy as np
2import pandas as pd
3from sklearn.datasets import load_breast_cancer
4from sklearn.linear_model import LogisticRegression
5from sklearn.model_selection import train_test_split
6from mlxtend.feature_selection import SequentialFeatureSelector as SFS
7
8# Load the breast cancer dataset
9data = load_breast_cancer()
10
11# Split the dataset into features and target
12X = data.data
13y = data.target
14
15# Split the dataset into training and testing sets
16X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
17
18# Define the logistic regression model
19model = LogisticRegression()
20
21# Define the forward selection object
22sfs = SFS(model, k_features=5, forward=True, floating=False, scoring="accuracy", cv=5)
23
24# Perform forward selection on the training set
25sfs.fit(X_train, y_train)
26
27# Print the selected features
28print("Selected Features:", sfs.k_feature_names_)
29
30# Evaluate the performance of the selected features on the testing set
31accuracy = sfs.k_score_
32print("Accuracy:", accuracy)
33
34# Plot the performance of the model with different feature subsets
35sfs_df = pd.DataFrame.from_dict(sfs.get_metric_dict()).T
36sfs_df["avg_score"] = sfs_df["avg_score"].astype(float)
37fig, ax = plt.subplots()
38sfs_df.plot(kind="line", y="avg_score", ax=ax)
39ax.set_xlabel("Number of Features")
40ax.set_ylabel("Accuracy")
41ax.set_title("Forward Selection Performance")
42plt.show()

نمودار زیر نشان‌دهنده تعداد ویژگی‌های مورد نیاز برای رسیدن به دقتی خاص در مدل یادگیری ماشین است:

نمودار روش انتخاب ویژگی رو به جلو
نمودار روش انتخاب ویژگی رو به جلو

همان‌طور که در نمودار نیز مشاهده می‌کنید، تنها با چهار ویژگی می‌توان به دقت تقریبی ۹۵ درصد دست یافت.

انتخاب ویژگی رو به عقب

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

نمودار روش انتخاب ویژگی رو به عقب
نمودار روش انتخاب ویژگی رو به عقب

در این نمودار مشاهده می‌کنید که در محدوده ۶ تا ۱۴ ویژگی، مدل یادگیری ماشین، دقت به نسبت ثابت و پایداری را نتیجه می‌دهد.

انتخاب ویژگی جامع

این روش برای شناسایی ویژگی‌هایی که بهترین عملکرد را در مدل یادگیری ماشین از خود به نمایش می‌گذارند، تمامی ترکیب‌های ممکن از ویژگی‌ها را مورد ارزیابی قرار می‌دهد. در ادامه پیاده‌سازی روش انتخاب ویژگی جامع را با زبان پایتون مشاهده می‌کنید. در این پیاده‌سازی از تابع ExhaustiveFeatureSelector   و الگوریتم «جنگل تصادفی» (Random Forest) استفاده شده است:

1from mlxtend.feature_selection import ExhaustiveFeatureSelector
2from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
3from sklearn.metrics import roc_auc_score
4
5feature_selector = ExhaustiveFeatureSelector(RandomForestClassifier(n_jobs=-1),
6           min_features=2,
7           max_features=4,
8           scoring='roc_auc',
9           print_progress=True,
10           cv=2)
11
12features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
13
14filtered_features= train_features.columns[list(features.k_feature_idx_)]
15filtered_features
16
17clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
18clf.fit(train_features[filtered_features].fillna(0), train_labels)
19
20train_pred = clf.predict_proba(train_features[filtered_features].fillna(0))
21print('Accuracy on training set: {}'.format(roc_auc_score(train_labels, train_pred[:,1])))
22
23test_pred = clf.predict_proba(test_features[filtered_features].fillna(0))
24print('Accuracy on test set: {}'.format(roc_auc_score(test_labels, test_pred [:,1])))

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

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

حذف بازگشتی ویژگی

در این رویکرد، با زیرمجموعه‌ای از ویژگی‌ها شروع و در ادامه با توجه به میزان اهمیت ویژگی‌ها، آن‌ها را اضافه و یا حذف می‌کنیم. در نمودار زیر، نحوه کار روش حذف بازگشتی ویژگی را مشاهده می‌کنید:

نمودار روش حذف بازگشتی ویژگی
نمودار روش حذف بازگشتی ویژگی

همان‌گونه که در نمودار نیز مشخص است، حذف یا اضافه شدن ویژگی‌ها بر اساس میزان اهمیت آن‌ها صورت می‌گیرد.

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

«روش‌های تعبیه شده» (Embedded Methods) مانند ربات هوشمندی هستند که می‌تواند به‌طور خودکار یاد گرفته و بهترین ویژگی‌ها را برای کاربردی خاص انتخاب کند. این ربات همزمان با یادگیری، مدل‌سازی کرده و از این طریق مهم‌ترین ویژگی‌ها را شناسایی و حفظ می‌کند. در فهرست زیر، دو گروه از روش‌های تعبیه شده را ملاحظه می‌کنید:

روش‌های تعبیه شده به‌طور معمول عملکرد بهتری نسبت به روش‌های پوششی دارند و کاربردهای واقع‌گرایانه‌تری ارائه می‌دهند. در ادامه به شرح و توضیح روش‌های تعبیه شده می‌پردازیم.

روش منظم‌سازی

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

مثال روش منظم سازی

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

روش اعتبار جنگل تصادفی

برای درک بهتر روش «اعتبار جنگل تصادفی» (Random Forest Importance)، فرض کنید در مورد موضوع خاصی از گروه دوستان خود درخواست کمک کرده‌اید. هر کدام از دوستان شما دیدگاه شخصی خود را داشته و ممکن است برخی از آن‌ها باهوش‌تر از سایرین باشند. این روش، تمامی دیدگاه‌ها یا در این‌جا «درخت‌های تصمیم» (Decision Trees) را مورد بررسی قرار داده و با ترکیب آن‌ها، مهم‌ترین معیارها در فرایند تصمیم‌گیری را شناسایی می‌کند. در قطعه کد زیر نمونه‌ای از روش اعتبار جنگل تصادفی را پیاده‌سازی کرده‌ایم:

1import pandas as pd
2import numpy as np
3from sklearn.ensemble import RandomForestClassifier
4from sklearn.model_selection import train_test_split
5import matplotlib.pyplot as plt
6
7# Load the Covertype dataset
8data = pd.read_csv(
9    "https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/covtype.data.gz",
10    header=None,
11)
12
13# Assign column names
14cols = (
15    [
16        "Elevation",
17        "Aspect",
18        "Slope",
19        "Horizontal_Distance_To_Hydrology",
20        "Vertical_Distance_To_Hydrology",
21        "Horizontal_Distance_To_Roadways",
22        "Hillshade_9am",
23        "Hillshade_Noon",
24        "Hillshade_3pm",
25        "Horizontal_Distance_To_Fire_Points",
26    ]
27    + ["Wilderness_Area_" + str(i) for i in range(1, 5)]
28    + ["Soil_Type_" + str(i) for i in range(1, 41)]
29    + ["Cover_Type"]
30)
31
32data.columns = cols
33
34# Split the dataset into features and target
35X = data.iloc[:, :-1]
36y = data.iloc[:, -1]
37
38# Split the dataset into train and test sets
39X_train, X_test, y_train, y_test = train_test_split(
40    X, y, test_size=0.3, random_state=42
41)
42
43# Create a random forest classifier object
44rfc = RandomForestClassifier(n_estimators=100, random_state=42)
45
46# Fit the model to the training data
47rfc.fit(X_train, y_train)
48
49# Get feature importances from the trained model
50importances = rfc.feature_importances_
51
52# Sort the feature importances in descending order
53indices = np.argsort(importances)[::-1]
54
55
56# Select the top 10 features
57num_features = 10
58top_indices = indices[:num_features]
59top_importances = importances[top_indices]
60
61
62# Print the top 10 feature rankings
63print("Top 10 feature rankings:")
64for f in range(num_features):  # Use num_features instead of 10
65    print(f"{f+1}. {X_train.columns[indices[f]]}: {importances[indices[f]]}")
66# Plot the top 10 feature importances in a horizontal bar chart
67plt.barh(range(num_features), top_importances, align="center")
68plt.yticks(range(num_features), X_train.columns[top_indices])
69plt.xlabel("Feature Importance")
70plt.ylabel("Feature")
71plt.show()

نمودار زیر، نتیجه حاصل از اعمال این روش را نشان می‌دهد:

نمودار روش اعتبار جنگل تصادفی
نمودار روش اعتبار جنگل تصادفی

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

روش های انتخاب ویژگی نظارت نشده

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

  • «تحلیل مولفه اصلی» (Principal Component Analysis | PCA)
  • «تحلیل مولفه مستقل» (Independent Component Analysis | ICA)
  • «فاکتورگیری نامنفی ماتریس» (Non-negative Matrix Factorization | NMF)
  • «t-توکاری همسایگی تصادفی توزیع شده» (T-distributed Stochastic Neighbor Embedding | t-SNE)
  • «خودرمزگذار» (Autoencoder)

در ادامه این مطلب از مجله فرادرس، بیشتر با روش‌های انتخاب ویژگی نظارت نشده در فهرست بالا آشنا می‌شویم.

روش تحلیل مولفه اصلی

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

1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4from sklearn.datasets import load_wine
5from sklearn.decomposition import PCA
6from sklearn.preprocessing import StandardScaler
7
8# Load the Wine dataset
9wine = load_wine()
10X = wine.data
11y = wine.target
12feature_names = wine.feature_names
13
14# Standardize the features
15scaler = StandardScaler()
16X_scaled = scaler.fit_transform(X)
17
18# Perform PCA
19pca = PCA()
20X_pca = pca.fit_transform(X_scaled)
21
22# Calculate the explained variance ratio
23explained_variance_ratio = pca.explained_variance_ratio_
24
25# Create a 2x1 grid of subplots
26fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(16, 8))
27
28# Plot the explained variance ratio in the first subplot
29ax1.bar(range(1, len(explained_variance_ratio) + 1), explained_variance_ratio)
30ax1.set_xlabel("Principal Component")
31ax1.set_ylabel("Explained Variance Ratio")
32ax1.set_title("Explained Variance Ratio by Principal Component")
33
34# Calculate the cumulative explained variance
35cumulative_explained_variance = np.cumsum(explained_variance_ratio)
36
37# Plot the cumulative explained variance in the second subplot
38ax2.plot(
39    range(1, len(cumulative_explained_variance) + 1),
40    cumulative_explained_variance,
41    marker="o",
42)
43ax2.set_xlabel("Number of Principal Components")
44ax2.set_ylabel("Cumulative Explained Variance")
45ax2.set_title("Cumulative Explained Variance by Principal Components")
46
47# Display the figure
48plt.tight_layout()
49plt.show()

خروجی PCA نموداری حاوی «واریانس تجمعی» (Cumulative Variance) است که تعداد ویژگی‌ها یا مولفه‌های اصلی نمایان‌گر داده‌ها را به تصویر می‌کشد.

روش تحلیل مولفه مستقل

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

1from sklearn.datasets import load_digits
2from sklearn.decomposition import FastICA
3X, _ = load_digits(return_X_y=True)
4transformer = FastICA(n_components=7,
5         random_state=0,
6         whiten='unit-variance')
7X_transformed = transformer.fit_transform(X)

> X_transformed.shape
(1797, 7)
خروجی پیاده‌سازی بالا مانند زیر خواهد بود:
مثال روش ICA
خروجی روش ICA

روش فاکتورگیری نامنفی ماتریس

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

1import numpy as np
2X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
3from sklearn.decomposition import NMF
4model = NMF(n_components=2, init='random', random_state=0)
5W = model.fit_transform(X)
6H = model.components_

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

خروجی روش NMF
خروجی روش NMF

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

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

1import numpy as np
2from sklearn.manifold import TSNE
3X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
4X_embedded = TSNE(n_components=2, learning_rate='auto',
5                   init='random', perplexity=3).fit_transform(X)

> X_embedded.shape
(4, 2)
خروجی چیزی شبیه به تصویر زیر خواهد بود:
خروجی روش T-SNE
خروجی روش T-SNE

روش خودرمزگذار

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

1input_size = 784
2hidden_size = 128
3code_size = 32
4
5input_img = Input(shape=(input_size,))
6hidden_1 = Dense(hidden_size, activation='relu')(input_img)
7code = Dense(code_size, activation='relu')(hidden_1)
8hidden_2 = Dense(hidden_size, activation='relu')(code)
9output_img = Dense(input_size, activation='sigmoid')(hidden_2)
10
11autoencoder = Model(input_img, output_img)
12autoencoder.compile(optimizer= 'adam', loss='binary_crossentropy')
13autoencoder.fit(x_train, x_train, epochsfs)

تصویر زیر نشان‌دهنده خروجی روش خودرمزگذار است:

خروجی روش خودرمزگذار
خروجی روش خودرمزگذار

انتخاب ویژگی با پایتون

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

تعداد ۲۵ ویژگی یا ستون در این مجموعه‌داده موجود است که ما به همه آن‌ها نیاز نداریم. ابتدا کتابخانه‌های مورد نیاز را مانند زیر فراخوانی می‌کنیم:

1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt

سپس دو ستون loc_x   و loc_y   که نشان‌دهنده طول و عرض جغرافیایی هستند را بررسی می‌کنیم:

1alpha = 0.02
2plt.figure(figsize=(10, 10))
3
4# Loc_x and Loc_y
5plt.subplot(121)
6plt.scatter(data.loc_x, data.loc_y, color='blue', alpha=alpha)
7plt.title('loc_x and loc_y')
8
9# Latitude and Longitude
10plt.subplot(122)
11plt.scatter(data.lon, data.lat, color='green', alpha=alpha)
12plt.title('lat and lon')

نتیجه اجرای قطعه کد بالا مانند زیر خواهد بود:

نمودار دو ویژگی lat و lot

با توجه به دو نمودار خروجی بالا، مشاهده می‌کنیم که شکل زمین بسکتبال مانند حرف D انگلیسی نمایان شده است. به‌جای دو ستون مجزا، می‌توانیم دو مختصات را به یک ستون «مختصات قطبی» (Polar Coordinate) با نام angle   تبدیل کنیم:

1
2# Change lat and lon into polar coordinates
3data['dist'] = np.sqrt(data['loc_x']**2 + data['loc_y']**2)
4
5loc_x_zero = data['loc_x'] == 0
6data['angle'] = np.array([0]*len(data))
7data['angle'][~loc_x_zero] = np.arctan(data['loc_y'][~loc_x_zero] / data['loc_x'][~loc_x_zero]
8data['angle'][loc_x_zero] = np.pi / 2

همچنین دو ستون minutes   و seconds   را به یک ستون با نام time   تبدیل می‌کنیم:

1# Combine minutes and seconds columns into one
2
3data['remaining_time'] = data['minutes_remaining'] * 60 + data['seconds_remaining']

مقادیر منحصربه‌فرد دو ستون team_id   و team_name   به شرح زیر است:

1# team_id and team_name columns
2
3print(data['team_id'].unique())
4print(data['team_name'].unique())

[1610612747]
['Los Angeles Lakers']
این دو ستون تنها یک مقدار داشته و از همین‌رو می‌توان آن‌ها را حذف کرد. با قطعه کد زیر نگاهی به دو ستون match_up   و opponent   می‌اندازیم:
1# matchup and opponent columns
2pd.DataFrame({'matchup': data.matchup, 'opponent': data.opponent})
جدول ویژگی matchup

این دو ستون نیز مقدایر مشابهی داشته و اطلاعات مفیدی اضافه نمی‌کنند. در ادامه مقادیر دو ستون dist   و shot_distance   را بر روی نمودار یکسانی رسم می‌کنیم تا متوجه تفاوت آن‌ها شویم:

1# distance and shot_distance differ columns
2
3plt.figure(figsize=(5, 5))
4
5plt.scatter(data.dist, data.shot_distance, color='blue')
6plt.title('dist and shot_distance')
نمودار ویژگی dist به صورت خط راست

مقادیر دو ستون dist   و shot_distance   نیز یکسان هستند. در قطعه کد زیر مقادیر ستون‌های shot_zone_area  ، shot_zone_basic   و shot_zone_range   را بررسی می‌کنیم:

1# shot_zone_area, shot_zone_basic and shot_zone_range columns
2
3import matplotlib.cm as cm
4plt.figure(figsize=(20,10))
5
6def scatter_plot_by_category(feat):
7    alpha = 0.1
8    gs = data.groupby(feat)
9    cs = cm.rainbow(np.linspace(0, 1, len(gs)))
10    for g, c in zip(gs, cs):
11        plt.scatter(g[1].loc_x, g[1].loc_y, color=c, alpha=alpha)
12
13# shot_zone_area
14plt.subplot(131)
15scatter_plot_by_category('shot_zone_area')
16plt.title('shot_zone_area')
17
18# shot_zone_basic
19plt.subplot(132)
20scatter_plot_by_category('shot_zone_basic')
21plt.title('shot_zone_basic')
22
23# shot_zone_range
24plt.subplot(133)
25scatter_plot_by_category('shot_zone_range')
26plt.title('shot_zone_range')

تصاویر زیر نشان‌دهنده سه نمودار حاصل از ستون‌های مذکور هستند:

سه نموداری رنگی برای استخراج ویژگی
به ترتیب از راست به چپ: ویژگی‌های rang و basic و area

بخش‌های مختلف زمین که پرتاب‌ها از آن انجام شده است را در تصاویر مشاهده می‌کنید. این اطلاعات در دو ستون angle   و dist   موجود است. در ادامه تمامی ستون‌های بی‌فایده را حذف می‌کنیم:

1# Drop the useless columns
2drops = ['shot_id', 'team_id', 'team_name', 'shot_zone_area', 'shot_zone_range', 'shot_zone_basic', \
3         'matchup', 'lon', 'lat', 'seconds_remaining', 'minutes_remaining', \
4         'shot_distance', 'loc_x', 'loc_y', 'game_event_id', 'game_id', 'game_date']
5for drop in drops:
6    data = data.drop(drop, 1)

پس از ادغام و حذف ستون‌های بیهوده، مجموعه‌داده نهایی ما شامل ۸ ستون یا ویژگی مهم خواهد بود.

مجموعه داده نهایی Kobe Bryant

برگزیدن مدل انتخاب ویژگی مناسب

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

  • «متغیرهای عددی» (Numerical Variables): شامل مقادیر صحیح (Integer) و اعشاری (Float).
  • «متغیرهای دسته‌ای» (Categorical Variables): شامل مقادیر رشته‌ای (String)، بولی (Boolean) و برچسب (Label).

بر اساس نوع مقادیر ورودی و خروجی، عددی یا دسته‌ای بودن آن‌ها، می‌توانیم مدل انتخاب ویژگی مناسب را مطابق با جدول زیر انتخاب کنیم:

متغیر ورودیمتغیر خروجیمدل انتخاب ویژگی
عددیعددیضریب همبستگی پیرسون

ضریب همبستگی رتبه‌ای اسپیرمن

عددیدسته‌ایضریب همستگی ANOVA

ضریب همستگی رتبه‌ای کندال

دسته‌ایعددیضریب همبستگی رتبه‌ای کندال

ضریب همستگی ANOVA

دسته‌ایدسته‌ایآزمون Chi-square

«اطلاعات متقابل» (Mutual Information)

قابل ذکر است که از ضریب همستگی کندال و ANOVA، هم برای داده‌های خطی و هم غیر خطی استفاده می‌شود.

سوالات متداول پیرامون انتخاب ویژگی چیست؟

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

روش انتخاب ویژگی چیست؟

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

انتخاب ویژگی چه قاعده‌ای دارد؟

در انتخاب ویژگی، باید همزمان تمرکز بر حذف ویژگی‌های بیهوده، شناسایی و حفظ ویژگی‌های کارآمد باشد؛ بهینه‌سازی که موجب ارتقاء دقت مدل یادگیری ماشین می‌شود.

فرایند انتخاب ویژگی از چه مراحلی تشکیل شده است؟

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

چگونه روش انتخاب ویژگی مناسب را انتخاب کنیم؟

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

جمع‌بندی

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

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

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