مقدمه
آیا میدانید که الگوریتم ژنتیک از تکنیکهای زیستشناسی برای انتخاب ویژگی استفاده میکند؟ جالب است بدانید که روشهای وراثت، جهش هر ویژگی و اصول انتخابی داروین برای تطبیق الگو که در الگوریتم ژنتیک استفاده میشوند؛ همگی از طبیعت و درواقع از زیستشناسی فرگشتی الهام گرفتهشدهاند.
به همین علت است که بسیار موردتوجه محققان و دانشمندان قرار میگیرد و جالبتر اینکه زیستشناسی فرگشتی هم تنوع گونهها یا دادههای محیطی را در طبیعت موردبررسی قرار میدهد.
هنگامیکه با حجم انبوهی از دادهها مواجه میشویم؛ برای مدیریت آنها در مرحله پیشپردازش یادگیری ماشین، از روش انتخاب ویژگی یا Feature selection استفاده میکنیم. بهاینترتیب که برای آموزش مدلهای طبقهبندی، ویژگی هرکدام از دادهها را استخراج کرده؛ از بین ویژگیهای استخراجشده، با استفاده از انواع الگوریتمهای یادگیری ماشین مثل الگوریتم ژنتیک، ویژگیهای مؤثر در تصمیمگیری و مدلسازی صحیح پیشبینی فرایند را انتخاب کرده و عملیات پیادهسازی را اجرا میکنیم.
این آموزش، نحوه استفاده از الگوریتم ژنتیک را برای کاهش بردار ویژگی استخراجشده از مجموعه داده با ۱۲ ویژگی موردبحث قرار داده و به توضیح مراحل انتخاب ویژگی با الگوریتم ژنتیک میپردازد. مراحل در پایتون پیادهسازی شدهاند.
هدفگذاری مناسب
به نظر من، در دادهکاوی مهمترین بخش حل مسئله قبل از مدلسازی، یافتن هدف مرتبط با سیستم و نوع عملیات در حال انجام است.
هدف، داشتن ویژگیهای باکیفیت برای رساندن ما به خروجی مناسب پروژه یا سیستم است و هر چه هدف تعیینشده، دقیقتر باشد؛ ویژگیها هم بهینهتر عمل خواهند کرد. چراکه انتخاب هدف غلط، باعث انتخاب ویژگیهای نادرست شده و هرچه ویژگیها نامرتبط باشند؛ در مدل ایجادشده نویز ایجاد کرده و تفسیر مدل را دچار خطا میکنند.
در حالت کلی، بهتر است فرایند زیر برای تعیین هدف دنبال شود تا در مراحل بعدی دچار خطا نشویم. لازم به ذکر است که این بخش فقط برای تأکید بیشتر آورده شده است تا از ایجاد خطاهای اساسی پیشگیری شود.
الگوریتم ژنتیک
برای یادآوری الگوریتم ژنتیک، یک مثال ساده را بیان میکنم. فرض کنید یک دولت برای پیشرفت علم پزشکی کشورش، تعدادی پزشک را شناسایی میکند. ژنهای این افراد را موردبررسی قرار داده؛ کسانی که دارای ژن برتر هستند را از میان آنها انتخاب کرده و برایشان شرایط ویژهای را فراهم میکنند تا اقدام به فرزند آوری کرده و ژن خود را تکثیر دهند. بهاینترتیب، دولت بستر را فراهم میکند تا آن فرزندان بعد از بالغ شدن به جامعه پزشکی به پیوندند و نیاز دولت به کادر درمان را برطرف کنند.
مثال بالا شاید کمی غیرواقعی به نظر برسد ولی میتواند در درک مفهوم و عملکرد الگوریتم ژنتیک به شما کمک کند. حال در ادامه، به تعریف علمی الگوریتم ژنتیک میپردازیم.
GA از یک جمعیت اولیه شروع میشود و شامل تعدادی کروموزوم است که در داخل هرکدام، یک توالی ژن قرار دارد. با استفاده از یک تابع تناسب، GA بهترین راهحلها را بهعنوان والدین برای ایجاد یک جمعیت جدید انتخاب میکند.
راهحل جدید در چنین جمعیت جدیدی با اعمال دو عملیات روی والدین ایجاد میشوند که عبارتند از: عملیات تقاطع crossover و جهش. عملگرهای الگوریتم ژنتیک در ادامه آورده شدهاند. در لینک زیر سورس کد الگوریتم ژنتیک در پایتون Python قرار گرفته شده است. این سورس کد به زبان پایتون Python برای الگوریتم ژنتیک نوشته شده است و به صورت آکادمیک طراحی شده برای دسترسی روی لینک زیر کلیک کنید.
بررسی عملکرد GA در انتخاب ویژگی با الگوریتم ژنتیک
برای شروع، یک دیتاست با ۱۲ ویژگی از سایت Machine Learning Repository دانلود کردیم تا یک کلاسبندی باینری در اختیار داشتهباشیم. در ادامه، مراحل انتخاب ویژگی با الگوریتم ژنتیک را توضیح میدهیم.
مقداردهی
بیایید فرض کنیم؛ هرگاه ویژگی را بخواهیم اضافه کنیم به آن مقدار باینری ۱ را بدهیم و هرگاه خواستیم هرکدام از ویژگیها را حذف کنیم. با مقداردهی ۰ این کار را انجام دهیم و ازآنجایی که ما ۱۲ ویژگی داریم؛ ۲¹² احتمال یا زیرمجموعه از کل مجموعه ویژگی وجود دارد که باید موردبررسی قرار بگیرد. البته الگوریتم ژنتیک تمام این حالات را آزمایش نمیکند؛ بلکه با استفاده از یک تابع ریاضی، ارزش برازندگی مجموعه این دادهها را تعیین کرده و بهاینترتیب آنها را مورد ارزیابی قرار میدهد.
ارزیابی تا تولیدمثل
به بیان سادهتر، از میان حدوداً ۴۰۰۰ حالت ممکن، قرار است؛ تعداد ۲۰ یا ۵۰ داده از میان کل دادههای ورودی و برحسب تابع برازندگی آنها انتخاب شوند که ارزش تناسب آنها نسبت به هدف انتخابی و نسبت به هماهنگیشان با دیگر دادهها، بیشتر باشد. سپس با استفاده از الگوریتم ژنتیک، به این گروه دادهای اجازه میدهیم که تکثیر شوند و ویژگیهای مناسب خود را به فرزندانشان انتقال دهند.
آزمون و خطا
هر سیستمی با توجه به عملکرد سازمانیافته خود، تعیین میکند که میزان جهش هر ژن در داخل گروههای دادهای به چه شکل باشد و یا چند نسل آزمایشی برای یافتن مدل مناسب تولید شود. تجربه نشان داده که هرچه تعداد نسلهای آزمایشی و تعداد آزمونوخطا بیشتر باشد؛ امکان یافتن جواب بهینه و دقت مدل پیشنهادی هم بیشتر میشود.
فقط باید در نظر داشته باشید که عملیات همواره در حال کنترل باشد تا در حداقلهای محلی، پیادهسازی برنامه دچار اختلال نشود. در ادامه، نمای شماتیک عملکرد الگوریتم ژنتیک در دادهکاوی آورده شده است.
تعیین نرخ تقاطع
در طی فرایند انتخاب ویژگی با الگوریتم ژنتیک، گاهی ممکن است برنامهنویس یا طراح الگوریتم گروهی از ژنها را برای تنوع، در ترکیب خود قرار دهد و تمایلی به تکثیر آنها نداشته یا حتی در نظر داشته باشد که آن گروه را از مجموعه ویژگیها حذف کند. برای حل این مشکل، یک نرخ متقاطع تعیین میشود که بیان میکند هر فرزند چه ژنها یا چه ویژگیهایی را از والد خود، در کدام مرحله و با چه احتمالاتی دریافت کند.
تعیین نرخ جهش
شاید برای شما هم پیش آمده باشد که در طول انجام مراحل انتخاب ویژگی با الگوریتم ژنتیک، فرزندان جهشیافته کاملی تولید شوند که تناسباندامشان بالا بوده و مدل یادگیری شما را به دلیل تولید ویژگیهای غیرقابل دستکاری، از حالت بهینه خارج کنند.
برای همین، ضروری است که یک نرخ جهش با توجه به پارامترها و هدف مدل پیشبینی، برای فرایند تعیین کنید و بهاینترتیب فرزندان جهشیافته را تحت کنترل برنامه نگهدارید. بهنحویکه به نرخهای بیشتر از نرخ جهش پروژه، اجازه تکثیر ندهید.
در شکل زیر، برای درک بهتر الگوریتم، مرحله تعییت نرخ تقاطع و نرخ جهش گنجانده شده است.
انتخاب محیط آموزش
برای جلوگیری از اتلاف زمان و هزینه، از رگرسیون لجستیک یا LR بهعنوان زبانآموز یا محیط آموزش داده، استفاده کنید. البته در مورد الگوریتمهای ژنتیک، مدلهای مبتنی بر درخت هم میتوانند تعاملات ویژگیها و سایر مواردی که ممکن است بر انتخاب ویژگیها تأثیر بگذارند را بهدرستی تشخیص دهند؛ پس میتوان گفت که جنگلهای تصادفی هم میتوانند در حوزه آموزش داده، مناسب باشند اما در مقایسه با رگرسیون لجستیک، نیاز به زمان و هزینه بیشتری دارند.
در این قسمت پکیج حل مسئله فروشنده دوره گرد با الگوریتم ژنتیک در پایتون که شامل سورس کد، گزارش کار و فیلم آموزشی میباشد را برای شما عزیزان ارائه دادهایم. این محصول یکی از محبوب ترین پکیج های پی استور در بخش برنامه نویسی و الگوریتم میباشد جهت دسترسی به لینک زیر مراجعه کنید.
کدنویسی عملکرد GA در انتخاب ویژگی با الگوریتم ژنتیک در پایتون
تکه کد زیر، نحوه عملکرد یک الگوریتم ژنتیک که زیرمجموعهای از دادهها را انتخاب میکند، را به نمایش میگذارد. در این مثال، اندازه جمعیت روی ۵۰ تنظیم شده است. البته شما میتوانید اندازه یا تعداد جمعیت را بسته به پیچیدگی مسئله، کم یا زیاد کرده و در نظر داشته باشید که هرچه نرخ جهش هر چه بیشتر باشد؛ شانس بیشتری برای تنوع خواهید داشت.
اما با بالا رفتن نرخ جهش الزاماً تضمینی برای انتخابهای بهینه وجود ندارد. بهینه شدن انتخابها بستگی به این قضیه دارد که چند نسل طول میکشد تا جهشها و تقاطعها، نامزدهای مناسبتری ایجاد کنند.
from sklearn.metrics import * mcc = make_scorer(matthews_corrcoef) estimator = LogisticRegression(solver = "liblinear", C = 6, tol = 1, fit_intercept = True) from sklearn.model_selection import * report = pd.DataFrame() nofeats = [] chosen_feats = [] cvscore = [] rkf = RepeatedStratifiedKFold(n_repeats = 2, n_splits = 10) for i in range(2,11): selector = GeneticSelectionCV(estimator, cv = rkf, verbose = 0, scoring = mcc, max_features = i, n_population = 200, crossover_proba = 0.5, mutation_proba = 0.2, n_generations = 10, crossover_independent_proba=0.5, mutation_independent_proba=0.05, #tournament_size = 3, n_gen_no_change=10, caching=True, n_jobs=-1) selector = selector.fit(D[allfeats], y) genfeats = D[allfeats].columns[selector.support_] genfeats = list(genfeats) print("Chosen Feats: ", genfeats) cv_score = selector.generation_scores_[-1] nofeats.append(len(genfeats)) chosen_feats.append(genfeats) cvscore.append(cv_score) report["No of Feats"] = nofeats report["Chosen Feats"] = chosen_feats report["Scores"] = cvscore
در تکه کد بالا، نحوه امتیازدهی به هر آزمایش یعنی ,selector.generation_score با محاسبه ضریب همبستگی برای هر نسل بهدست میآید. با تکرار هر آزمایش، معمولاً امتیاز هر نسل بهبود مییابد. بنابراین من فقط از آخرین امتیاز بهعنوان امتیاز شاخص مدل پیشبینی، استفاده کردهام.
انتخاب ویژگی با الگوریتم ژنتیک در جدول دادهای فرضی
جدول زیر را در نظر بگیرید.
جدول بالا، مجموعهای از ۵ ویژگی {age, creatinine_phosphokinase, diabetes, ejection_fraction, serum_creatinine} است که با استفاده از pycaret آن را پیادهسازی کردیم. امتیاز MCC محاسبهشده برای آن، حدود ۰٫۴ میباشد.
from pycaret.datasets import get_data from pycaret.classification import * report["Scores"] = np.round(report["Scores"], 3) report.sort_values(by = "Scores", ascending = False, inplace = True) #report.index ga_feats = report.iloc[0]["Chosen Feats"] ename = setup(data = D[used_feats], target = "DEATH_EVENT", test_data = None, fold_strategy = "stratifiedkfold", fold_shuffle = True, use_gpu = True, normalize = True, categorical_features = None, #pca = True, #pca_method = "kernel", #pca_components = 5, preprocess = False, html = True, #POLYNOMIAL #polynomial_features = True, #polynomial_degree = 2, #transformation #transformation = True, #feature_selection = True, feature_interaction = True, fix_imbalance = True, #fix_imbalance_method = imblearn.over_sampling.SMOTE(), imputation_type='simple', verbose = True, ) rskf = RepeatedStratifiedKFold(n_splits = 5, n_repeats = 20) best_model = compare_models(sort = "MCC", round = 2, fold = rskf, #include = ["rf","catboost"], #n_select = 1 )
حال بیایید از محیط آموزش جنگلهای تصادفی برای آموزش مدل، استفاده کنیم. برای این کار، از ۲۵۰ داده یعنی ۵ مجموعه داده ۵۰ عضوی استفاده میکنیم و درنهایت نتایج زیر بهدست خواهد آمد.
انتخاب ویژگی
ویژگیهای موجود عبارتاند از: {‘age’, ‘creatinine_phosphokinase’, ‘ejection_fraction’, ‘platelets’, ‘serum_creatinine’, ‘serum_sodium’}. ما در این مرحله، این مجموعه ویژگی را از سیستم گرفته و دوباره آن را از طریق pycaret در مدلهای آموزشی مختلف اجرا میکنیم. مشاهده میکنید که دادههای جالبی بهدست میآید.
در تفسیر داده های به دست آمده می توان گفت که زیرمجموعههای ویژگی بر اساس عملکرد در فرآیند امتیازدهی الگوریتم GA مرتب شدهاند و امتیاز برتر مربوط به مجموعه ۶ عضوی با اعضای زیر و با مقدار ۰.۸۶۸ در مدل پیش بینی انتخاب میشود.
{“age”, “creatinine_phosphokinase”,”ejection_fraction”,”serum_creatinine”,”smoking”, time”}
ما به یک مدل سادهتر نیاز داریم و به این منظور از این زیرمجموعه ویژگی استفاده کرده و بقیه ویژگیها را نادیده میگیریم.
انتخاب ویژگی با الگوریتم ژنتیک به کمک رگرسیون لجستیک
روشهای مختلفی در الگوریتمهای ژنتیک وجود دارد که میتوان برای انتخاب ویژگیها از آنها استفاده کرد. ما در ادامه، ۳ مورد از آنها را آوردهایم.
- انتخاب Elitist: در این روش، مناسبترین عضو هر مجموعه دادهای از بین دادههای ورودی، انتخاب میشود.
- انتخاب Roulette: در این روش، عنصری که امتیاز برازش بیشتری داشته باشد؛ انتخاب میشود.
- انتخاب Tournament: در این روش،یک زیرمجموعه از صفات یک جامعه انتخاب میشوند و اعضای آن مجموعه با هم رقابت میکنند. تا اینکه در نهایت فقط یک صفت از هر زیرگروه برای تولید انتخاب میشود.
تکه کد زیر، یه کمک رگرسیون لجستیک و از طریق pycaret به انتخاب ویژگی پرداخته است. با استفاده از روشهایی که بیان گردید؛ میتوانید بگویید که این پیادهسازی در کدام گروه از روشها قرار میگیرد.
سخن آخر درمورد انتخاب ویژگی با الگوریتم ژنتیک
مشاهده کردید که در مدلسازی، الگوریتم ژنتیک یک تکنیک کد نویسی بوده و از تکامل ژنتیکی بهعنوان یک الگوی حل مسئله به دنبال راهحل چالش سیستم استفاده کرده؛ با روش آزمونوخطای ویژگیهای کاهشیافته آن را پیداکرده و بهعنوان ویژگیهای نهایی یک مدل تصمیمگیری به سیستم کامپیوتری تحویل میدهد تا سازمانها، مؤسسات و سایر کسبوکارهای کوچک و بزرگ را که با کلان دادهها روبرو هستند در مدیریت دادهها یاری کند.
از اینکه تا پایان این مقاله با ما همراه بودهاید؛ متشکرم. نظرات، پیشنهادها و انتقادات خود را با ما در میان بگذارید و ما را در بهتر شدن کیفیت آموزش از راه دور یا اینترنتی یاری کنید. موفق و سربلند باشید.