از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
استفاده از متدهای Wrapper در پایتون برای انتخاب ویژگی
سرفصلهای مطلب
معرفی
در مقاله قبلی مطالعه کردیم که چگونه میتوانیم از روشهای فیلتر برای انتخاب ویژگی برای الگوریتمهای یادگیری ماشین استفاده کنیم. وقتی میخواهید مجموعهای از ویژگیهای عمومی را برای همه مدلهای یادگیری ماشین انتخاب کنید، روشهای فیلتر مفید هستند.
با این حال، در برخی از سناریوها، ممکن است بخواهید از یک الگوریتم یادگیری ماشینی خاص برای آموزش مدل خود استفاده کنید. در چنین مواردی، ویژگی های انتخاب شده از طریق روش های فیلتر ممکن است بهینه ترین مجموعه ویژگی ها برای آن الگوریتم خاص نباشد. دسته دیگری از روش های انتخاب ویژگی وجود دارد که بهینه ترین ویژگی ها را برای الگوریتم مشخص شده انتخاب می کند. چنین روش هایی نامیده می شوند روش های لفاف دار.
روشهای Wrapper برای انتخاب ویژگی
روش های Wrapper مبتنی هستند روی الگوریتمهای جستجوی حریصانه، زیرا همه ترکیبهای ممکن از ویژگیها را ارزیابی میکنند و ترکیبی را انتخاب میکنند که بهترین نتیجه را برای یک الگوریتم یادگیری ماشین خاص ایجاد کند. نقطه ضعف این رویکرد این است که آزمایش همه ترکیبات ممکن از ویژگی ها می تواند از نظر محاسباتی بسیار گران باشد، به خصوص اگر مجموعه ویژگی ها بسیار بزرگ باشد.
همانطور که قبلاً گفته شد، روشهای wrapper میتوانند بهترین مجموعه از ویژگیها را برای یک الگوریتم خاص پیدا کنند – با این حال، یک نقطه ضعف این است که این مجموعه از ویژگیها ممکن است برای هر الگوریتم یادگیری ماشین دیگری بهینه نباشد.
روش های Wrapper برای انتخاب ویژگی را می توان به سه دسته تقسیم کرد: قدم به جلو در انتخاب ویژگی، انتخاب ویژگی به عقب برگردید و انتخاب ویژگی جامع. در این مقاله خواهیم دید که چگونه می توانیم این رویکردهای انتخاب ویژگی را در پایتون پیاده سازی کنیم.
گام به جلو انتخاب ویژگی
در مرحله اول انتخاب ویژگی گام به جلو، عملکرد طبقه بندی کننده با توجه به هر ویژگی ارزیابی می شود. ویژگی که بهترین عملکرد را دارد از بین همه ویژگی ها انتخاب می شود.
در مرحله دوم، ویژگی اول در ترکیب با سایر ویژگی ها امتحان می شود. ترکیبی از دو ویژگی که بهترین عملکرد الگوریتم را به همراه دارد انتخاب شده است. این process تا زمانی که تعداد مشخصی از ویژگی ها انتخاب شود ادامه می یابد.
بیایید انتخاب ویژگی گام به جلو را در پایتون پیاده سازی کنیم. ما استفاده خواهیم کرد BNP Paribas Cardif Claims Management مجموعه داده برای این بخش همانطور که در مقاله قبلی خود انجام دادیم.
برای پیاده سازی انتخاب ویژگی گام به جلو، باید مقادیر ویژگی های طبقه بندی شده را به مقادیر ویژگی عددی تبدیل کنیم. با این حال، برای سادگی، ما تمام ستون های غیر دسته بندی را از داده های خود حذف می کنیم. همانطور که در مقاله قبلی انجام دادیم، ستون های همبسته را نیز حذف می کنیم تا یک ویژگی کوچک داشته باشیم process.
پیش پردازش داده ها
اسکریپت زیر مجموعه داده و کتابخانه های مورد نیاز را وارد می کند، سپس ستون های غیر عددی را از مجموعه داده حذف می کند و سپس مجموعه داده را به مجموعه های آموزشی و آزمایشی تقسیم می کند. در نهایت، تمام ستون های با همبستگی بیشتر از 0.8 حذف می شوند. برای توضیح دقیق این اسکریپت به این مقاله نگاه کنید:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import VarianceThreshold
paribas_data = pd.read_csv(r"E:\Datasets\paribas_data.csv", nrows=20000)
paribas_data.shape
num_colums = ('int16', 'int32', 'int64', 'float16', 'float32', 'float64')
numerical_columns = list(paribas_data.select_dtypes(include=num_colums).columns)
paribas_data = paribas_data(numerical_columns)
paribas_data.shape
train_features, test_features, train_labels, test_labels = train_test_split(
paribas_data.drop(labels=('target', 'ID'), axis=1),
paribas_data('target'),
test_size=0.2,
random_state=41)
correlated_features = set()
correlation_matrix = paribas_data.corr()
for i in range(len(correlation_matrix .columns)):
for j in range(i):
if abs(correlation_matrix.iloc(i, j)) > 0.8:
colname = correlation_matrix.columns(i)
correlated_features.add(colname)
train_features.drop(labels=correlated_features, axis=1, inplace=True)
test_features.drop(labels=correlated_features, axis=1, inplace=True)
train_features.shape, test_features.shape
پیاده سازی Step Forward Feature Selection در پایتون
برای انتخاب بهینه ترین ویژگی ها، از آن استفاده خواهیم کرد SequentialFeatureSelector
تابع از mlxtend کتابخانه کتابخانه را می توان با اجرای دستور زیر در خط فرمان anaconda دانلود کرد:
conda install -c conda-forge mlxtend
ما استفاده خواهیم کرد طبقهبندی تصادفی جنگل برای یافتن بهینه ترین پارامترها معیارهای ارزیابی مورد استفاده خواهد بود ROC-AUC. اسکریپت زیر 15 ویژگی را از مجموعه داده ما انتخاب می کند که بهترین عملکرد را برای طبقه بندی جنگل تصادفی دارد:
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.metrics import roc_auc_score
from mlxtend.feature_selection import SequentialFeatureSelector
feature_selector = SequentialFeatureSelector(RandomForestClassifier(n_jobs=-1),
k_features=15,
forward=True,
verbose=2,
scoring='roc_auc',
cv=4)
در اسکریپت بالا ما را پاس می کنیم RandomForestClassifier
به عنوان برآورد کننده به SequentialFeatureSelector
تابع. این k_features
تعداد ویژگی هایی که باید انتخاب شوند را مشخص می کند. در اینجا می توانید هر تعداد ویژگی را تنظیم کنید. این forward
پارامتر، اگر روی True
، انتخاب ویژگی گام به جلو را انجام می دهد. این verbose
پارامتر برای ثبت پیشرفت انتخابگر ویژگی استفاده می شود scoring
پارامتر معیارهای ارزیابی عملکرد را مشخص می کند و در نهایت، cv
به چین های اعتبار سنجی متقابل اشاره دارد.
ما انتخابگر ویژگی خود را ایجاد کردیم، اکنون باید آن را فراخوانی کنیم fit
روش روی انتخابگر ویژگی های ما و مجموعه های آموزشی و آزمایشی را مطابق شکل زیر ارسال کنید:
features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
بسته به سخت افزار سیستم شما، اسکریپت بالا ممکن است مدتی طول بکشد تا اجرا شود. پس از اتمام اجرای اسکریپت فوق، می توانید اسکریپت زیر را برای مشاهده 15 ویژگی انتخاب شده اجرا کنید:
filtered_features= train_features.columns(list(features.k_feature_idx_))
filtered_features
در خروجی باید ویژگی های زیر را مشاهده کنید:
Index(('v4', 'v10', 'v14', 'v15', 'v18', 'v20', 'v23', 'v34', 'v38', 'v42',
'v50', 'v51', 'v69', 'v72', 'v129'),
dtype='object')
حال برای مشاهده عملکرد طبقه بندی الگوریتم جنگل تصادفی با استفاده از این 15 ویژگی، اسکریپت زیر را اجرا کنید:
clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
clf.fit(train_features(filtered_features).fillna(0), train_labels)
train_pred = clf.predict_proba(train_features(filtered_features).fillna(0))
print('Accuracy روی training set: {}'.format(roc_auc_score(train_labels, train_pred(:,1))))
test_pred = clf.predict_proba(test_features(filtered_features).fillna(0))
print('Accuracy روی test set: {}'.format(roc_auc_score(test_labels, test_pred (:,1))))
در اسکریپت بالا، الگوریتم جنگل تصادفی خود را آموزش می دهیم روی 15 ویژگی که با استفاده از انتخاب ویژگی گام به جلو انتخاب کردیم و سپس عملکرد الگوریتم خود را ارزیابی کردیم روی مجموعه های آموزشی و آزمایشی در خروجی باید نتایج زیر را مشاهده کنید:
Accuracy روی training set: 0.7072327148174093
Accuracy روی test set: 0.7096973252804142
می توانید دقت کنید روی مجموعه های آموزشی و آزمایشی تقریباً مشابه هستند، به این معنی که مدل ما بیش از حد مناسب نیست.
انتخاب ویژگی به عقب برگردید
انتخاب ویژگی گام به عقب، همانطور که از نام آن پیداست، دقیقا برعکس انتخاب ویژگی گام به جلو است که در بخش آخر مطالعه کردیم. در مرحله اول انتخاب ویژگی گام به گام به عقب، یک ویژگی به صورت دورگرد از مجموعه ویژگی حذف می شود و عملکرد طبقه بندی کننده ارزیابی می شود.
مجموعه ویژگی هایی که بهترین عملکرد را ارائه می دهد حفظ می شود. در مرحله دوم مجدداً یک ویژگی به صورت دورگرد حذف می شود و عملکرد همه ترکیب ویژگی ها به جز 2 ویژگی ارزیابی می شود. این process تا زمانی که تعداد مشخصی از ویژگی ها در مجموعه داده باقی بماند ادامه می یابد.
انتخاب ویژگی در پایتون به عقب برگردید
در این بخش، انتخاب ویژگی گام به عقب را پیاده سازی می کنیم روی را BNP Paribas Cardif Claims Management. مرحله پیش پردازش مانند قسمت قبل باقی می ماند. تنها تغییر در forward
پارامتر از SequentiaFeatureSelector
کلاس در صورت انتخاب ویژگی گام به عقب، این پارامتر را روی آن تنظیم می کنیم False
. اسکریپت زیر را اجرا کنید:
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.metrics import roc_auc_score
from mlxtend.feature_selection import SequentialFeatureSelector
feature_selector = SequentialFeatureSelector(RandomForestClassifier(n_jobs=-1),
k_features=15,
forward=False,
verbose=2,
scoring='roc_auc',
cv=4)
features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
برای مشاهده ویژگی انتخاب شده در نتیجه حذف گام به عقب، اسکریپت زیر را اجرا کنید:
filtered_features= train_features.columns(list(features.k_feature_idx_))
filtered_features
خروجی به شکل زیر است:
Index(('v7', 'v8', 'v10', 'v17', 'v34', 'v38', 'v45', 'v50', 'v51', 'v61',
'v94', 'v99', 'v119', 'v120', 'v129'),
dtype='object')
در نهایت، اجازه دهید عملکرد طبقهبندیکننده جنگل تصادفی خود را ارزیابی کنیم روی ویژگی های انتخاب شده در نتیجه انتخاب ویژگی گام به عقب. اسکریپت زیر را اجرا کنید:
clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
clf.fit(train_features(filtered_features).fillna(0), train_labels)
train_pred = clf.predict_proba(train_features(filtered_features).fillna(0))
print('Accuracy روی training set: {}'.format(roc_auc_score(train_labels, train_pred(:,1))))
test_pred = clf.predict_proba(test_features(filtered_features).fillna(0))
print('Accuracy روی test set: {}'.format(roc_auc_score(test_labels, test_pred (:,1))))
خروجی به نظر می رسد که:
Accuracy روی training set: 0.7095207938140247
Accuracy روی test set: 0.7114624676445211
می بینید که عملکرد به دست آمده است روی مجموعه آموزشی مشابه آن چیزی است که با استفاده از انتخاب ویژگی گام به جلو به دست آمده است. با این حال، روی مجموعه تست، انتخاب ویژگی های عقب مانده کمی بهتر انجام شد.
انتخاب ویژگی جامع
در انتخاب ویژگی جامع، عملکرد یک الگوریتم یادگیری ماشین در برابر همه ترکیبهای ممکن از ویژگیهای موجود در مجموعه داده ارزیابی میشود. زیر مجموعه ویژگی که بهترین عملکرد را دارد انتخاب می شود. الگوریتم جستجوی جامع طمعآمیزترین الگوریتم در بین تمام روشهای wrapper است، زیرا همه ترکیبی از ویژگیها را امتحان میکند و بهترین را انتخاب میکند.
نقطه ضعف انتخاب ویژگی جامع این است که می تواند در مقایسه با روش گام به جلو و گام به عقب کندتر باشد زیرا همه ترکیبات ویژگی را ارزیابی می کند.
انتخاب ویژگی جامع در پایتون
در این بخش، انتخاب ویژگی گام به عقب را پیاده سازی می کنیم روی را BNP Paribas Cardif Claims Management. مرحله پیش پردازش مشابه مرحله انتخاب ویژگی Step Forward باقی خواهد ماند.
برای اجرای انتخاب ویژگی جامع، ما از آن استفاده خواهیم کرد ExhaustiveFeatureSelector
تابع از mlxtend.feature_selection
کتابخانه کلاس دارد min_features
و max_features
ویژگی هایی که می توانند برای تعیین حداقل و حداکثر تعداد ویژگی ها در ترکیب استفاده شوند.
اسکریپت زیر را اجرا کنید:
from mlxtend.feature_selection import ExhaustiveFeatureSelector
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.metrics import roc_auc_score
feature_selector = ExhaustiveFeatureSelector(RandomForestClassifier(n_jobs=-1),
min_features=2,
max_features=4,
scoring='roc_auc',
print_progress=True,
cv=2)
ما انتخابگر ویژگی خود را ایجاد کردیم، اکنون باید با آن تماس بگیرید fit
روش روی انتخابگر ویژگی های ما و مجموعه های آموزشی و آزمایشی را مطابق شکل زیر ارسال کنید:
features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
توجه داشته باشید که اجرای اسکریپت بالا ممکن است کمی طول بکشد. برای مشاهده ویژگی انتخاب شده در نتیجه حذف گام به عقب، اسکریپت زیر را اجرا کنید:
filtered_features= train_features.columns(list(features.k_feature_idx_))
filtered_features
در نهایت، برای مشاهده عملکرد طبقه بندی جنگل تصادفی روی ویژگی های انتخاب شده در نتیجه انتخاب ویژگی های جامع. اسکریپت زیر را اجرا کنید:
clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
clf.fit(train_features(filtered_features).fillna(0), train_labels)
train_pred = clf.predict_proba(train_features(filtered_features).fillna(0))
print('Accuracy روی training set: {}'.format(roc_auc_score(train_labels, train_pred(:,1))))
test_pred = clf.predict_proba(test_features(filtered_features).fillna(0))
print('Accuracy روی test set: {}'.format(roc_auc_score(test_labels, test_pred (:,1))))
نتیجه
روشهای Wrapper برخی از مهمترین الگوریتمهایی هستند که برای انتخاب ویژگی برای یک الگوریتم یادگیری ماشین خاص استفاده میشوند. در این مقاله انواع روش های لفاف را به همراه اجرای عملی آنها بررسی کردیم. ما روش های گام به جلو، گام به عقب و روش های جامع را برای انتخاب ویژگی مطالعه کردیم.
به عنوان یک قاعده کلی، اگر مجموعه داده کوچک است، روش انتخاب ویژگی جامع باید انتخاب شود، با این حال، در مورد مجموعه داده های بزرگ، روش های انتخاب ویژگی یک قدم به جلو یا یک گام به عقب باید ترجیح داده شود.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-26 09:55:03