Cross-Validation (اعتبار سنجی) در یادگیری ماشین:چگونه آن را به درستی انجام دهیم
در یادگیری ماشین (ML)، تعمیم معمولاً به توانایی یک الگوریتم اشاره دارد.كه در ورودي هاي مختلف موثر باشد. این بدان معنی است که مدلML در ورودي هاي جديد كه از توزيع يكسان داده هاي اموزشي است با كاهش عملكرد مواجه نميشود.
براي انسان ها ،تعميم ،طبيعي ترين چيز ممكن است. براي مثال ما مطمئنا يك سگ راميتوانيم تشخيص دهيم اگر حتي ندانيم كه از چه نژادي هست . با این وجود برای یک ml ممکن است به عنوان یک چالش دیده شود. به همین دلیل است که بررسی توانایی الگوریتم برای تعمیم یک کار مهم است که در ساخت مدل نیاز به توجه زیادی دارد.
برای این کار از Cross-Validation (CV) استفاده می کنیم.
در این مقاله به موارد زیر را پوشش خواهیم داد:
كراس وليديشن چیست، تعریف، هدف استفاده و تکنیک ها
تکنیک های مختلف CV:
Hold-out, k-folds, Leave-one-out, Leave-p-out,
Stratified k-folds, Repeated k-folds, Nested k-folds, Complete CV
چگونه از این تکنیک ها استفاده کنیم: sklearn
كراس وليديشن در یارگیری ماشین: sklearn, CatBoost
كراس وليديشن در یادگیری عمیق: Keras, PyTorch, MxNet
بهترین تمرینات و نکات: سری های زمانی ، داده های پزشکی و مالی ، تصاویر
Cross-Validation چیست:
كراس وليديشن یا اعتبار سنجی یک تکنیک است برای ارزیابی یک مدل یادگیری ماشین و تست عملکرد ان.
كراس وليديشن معمولا در یادگیری ماشین کاربرد دارد. این به مقایسه کمک می کند و یک مدل مناسب برای پیش بینی مسئله مدل سازی خاص انتخاب میکند.
فهمیدن CVبسیار اسان است و راحت پیاده سازی میشود . و تمایل به داشتن بایاس کمتری نسبت به روش های دیگر دارد و همه این ها باعث شده که CVبه یک ابزار قدرتمند برای انتخاب بهترین مدل تبدیل شود .
تکنیک های مختلفی وجود دارد که شاید برای مدل اعتبار سنجی مورد استفاده قرار بگیرد. با این حال، همه آنها یک الگوریتم مشابه دارند:
1- مجموعه داده را به دو بخش تقسیم میشود: یکی برای آموزش، دیگری برای آزمایش
2- مدل را روی مجموعه دادههای آموزشی، آموزش دهید
3- اعتبار مدل را رو داده های تست بدست میاوریم
4-مرحله یک تا سه را چندین بار تکرار میکنیم . تعداد تکرار ها بستگی روشی دارد که ما برای CVمورد استفاده قرار میدهیم .
همانطور که می دانید، تکنیک های CV زیادی وجود دارد.که فقط برخی از آنها معمولا استفاده می شود و بقیه در حد تئوری کار می کنند. بیایید روشهای اعتبارسنجی را که در این مقاله پوشش داده خواهد شد، ببینیم:
· Hold-out
· K-folds
· Leave-one-out
· Leave-p-out
· Stratified K-folds
· Repeated K-folds
· Nested K-folds
· Complete
Hold-out
1. روش اعتبار سنجیHold-out ساده ترین و رایج ترین تکنیک است که مورد استفاده قرار میگیرد. در زندگی روز مره خیلی از این روش بودن انکه بدانید دارید استفاده میکنید .
2. الگوریتم به این صورت است:
3. مجموعه داده ای را به دو قسمت تقسیم میکنیم: یکی مجموعه دادها ی اموزشی دودیگری مجموعه داده های تست. که معمولا 80درصد داده ها برای اموزش در نظر گرفته میشود و 20 درصد ان برای هم برای تست اما هر تقسیم بندی که به نظر شما مناسب تر است را میتوانید انتخاب کنید .
4. مدل را روی داده های اموزشی ، اموزش میدهیم
5. با استفاده از داده های تست انرا ارزیابی میکنیم
6. نتیجه را ذخیره میکنیم
وتمام.
ما معمولا از روش hold-outبرای داده های بزرگی که مدل ان فقط نیاز به یک بار اموزش دارند، استفاده میکنیم.
پیاده سازی hold-outبسیار راحت است. برای مثال میتوانید از sklearn.model_selection.train_test_split. استفاده کنید.
با این حال این روش یک ایراد بزرگ دارد.
به عنوان مثال میتوان به مجموعه داده ای که بصورت یکنواخت توزیع نشده اند اشاره کرد. که بعد از تقسیم بندی ممکن است نقاط بسیار نامناسب بدست بیاید. برای مثال دیگر نمیتوان داده های تست را به عنوان نماینده های داده های اموزشی در مرحله اموزش در نظر گرفت چون ممکن است بسیار متفاوت از یکدیگر باشند مثلا یکی برای مدل بسیار اسان و یکی بسیار سخت باشد.
علاوه بر این ما مدل خودمون رو یک بار ازمایش میکنیم که ممکن است یک گلوگاه بوجود بیاد. با توجه به دلایلی که بیان شد امکان دارد نتایجی که در این روش بدست می اید نادرست باشد.
در این روش ما ماییم معایب روش قبل را کاهش یا از بین میبریم. این روش ما بصورت جدیدی به تقسیم بندی داده های میپردازیم که کمک میکند تا بتوانیم گلوگاهی که در روش قبلی ممکن بود بدست بیاد را از بین ببریم.
برای این روش هم کتابخانه sklearn یک روش را ساخته است میتوانید با استفاده از model_selection در کتابخانه sklearn.model_selection.LeaveOneOut مورد استفاده قرار بدید:
بزرگترین مزیت این روش است که همه انها مورد ازمایش و تست قرار میگیرد و هیچ کدام هدر نمیرود و فقط از یک نمونه برای تست تمام داده ها استفاده میکنیم و بقیه به عنوان نمونه ازمایشی مورد استفاده قرار میگیرد. اما اگر بخواهیم با روش قبلی مقایسه کنیم تعداد تقسیم بندی به تعداد نمونه هاست که خیلی بیشتر از روش قبلی است و این به امر باعث هزینه بر بودن و زمان بر بودن بیشتری نسبت به روش قبلی میشود. بنابراین با توجه به شواهد تجربی و تحقیقات مختلف که جامعه علم داده انجام داده است روش فولد با تعداد 5 یا 10 را به این روش ترجیح داده میشود.
این روش خیلی نزدیک به روش قبلی است .و تمام مجموعه های تست و اموزش رو تولید میکنیم با در نظر گرفتن p نمونه برای داده های تست. و تمام شرایط دیگر که در روش LOOCVوجود داشت برای LPOCVهم برقرار است.
با این حال میتوان به این نکته توجه کرد که بر خلاف دو روش قبلی داده های تست در این روش همپوشانی دارند.
الگوریتم روش LPOC
1. انتخاب p نمونه برای مجموعه داده ای تست
2. باقی داده هایی که میماند را برای آموزش در نظر میگیریم
3. مدل را با توجه به داده ای اموزشی ، اموزش میدهیم.در هر تکرار یک مدل جدید باید اموزش داده شود
4. با توجه به داده های تست ارزیابی میکینم
5. تنایج بدست امده در قسمت ارزیابی را ذخیره میکنیم
6. مرحله های دو تا پنج را ? بار انجام میدهیم
7. برای بدست اوردن نتیجه نهایی نتایج بدست امده در قسمت 5 را میانگین گیری میکنیم
میتوان Leave-p-out CV را با sklearn.model_selection.LeavePOut مورد استفاده قرار داد:
این روش تمام معایب روش قبل را دارد اما با این وجود مثل روش قبل قوی است.
گاهی اوقات ممکن است با ناهماهنگی بزرگی در مقادیرهدف از مجموعه دادها مواجه شویم. برای مثال فرض کنید یک مجموعه قیمت برای ساعت های مچی داریم و تعداد ساعت با قیت بالا زیاد باشد. یا در دسته بندی مجموعه سگ ها و گربه ها ممکن است تغییرات بزرگی در داده های مربوط به سگ ها وجود داشته باشد.
این روش یک نوعی از فولد است و طوری طراحی شده است تا در چنین مواردی برای رسید به هدف مورد نظر موثر باشد.
به این صورت عمل میکند که دسته بندی مجموعه داده ها را روی k تا انجام میدهیم به طوری که تقریبا هر kیک درصد یکسان از نمونه های کل مجموعه را شامل میشود.و دراین روش این اطمینان داده میشود که تقریبا میانگین مقدار هدف همه فولد ها برابر باشد.
الگوریتم روش Stratified k-Fold به صورت زیر است:
1. یک عدد برای مقدار k انتخاب میکنیم
2. مجموعه داده ها را به k تا تقسیم میکنیم. هر قسمت یا فولد باید شامل درصد مشابهی از نمونه های کلاس هدف در مجموعه کل داده ها باشد.
3. K-1 قسمت یافولد را برای اموزش مورد استفاده قرار میدهیم و بقیه را برای تست
4. با توجه به داده های اموزشی مدل خود را اموزش میدهیم و هر تکرار باید با مدل جدید اموزش ببیند
5. با داده های تست انرا ارزیابی میکنیم
6. مقدادیر بدست امده را ذخیره میکنیم.
7. مراحل سه تا شش را تکرار میکنیم در هر تکرار باید مدل را روی هر قسمت یا فولد ارزیابی کنیم
8. برای بدست اوردن نتایج نهایی میانگین مقادیر بدست امده در قسمت شش را میانگینگیری میکنیم.
این روش نسبت به k-Fold CV مزایای واضحی دارد. اولا نسبت تقسیم داده های تست و اموزش به تعداد تکرار ها وابسته نیست دوما ما میتوانیم نسبت های منحصر به فردی را برای هر تکرار در نظر بگیریم . سوما انتخاب تصادفی نمونه ها باعث افزایش قدرت این روش میشود.
با این حال این روش هم معایب خاص خود را دارد. در روش k-Fold CV تضمین میشود که روی همه نمونه ها ازمایش شود در حالی که در این روش بر اساس تصادفی سازی صورت میگیرد که ممکن است برخی نمونه ها هرگز در مجموعه ازمایش قرار نگیرد و انتخاب نشود و یا بعضی از نمونه ها چندین بار انتخاب شوند.
برای پیاده سازی این روش باید تعداد قسمت ها یا فولد هایی که میخواهیم داشته باشیم را مشخص کنیم و همچنین تعداد دفعاتی که تقسیم انجام میشود.
فرض کنید ما یک پارمتری مثل p داریم که معمولا به الگوریتم اعتبار سنجی ما وابسته است. برای مثال رگرسیون لاجستیک دارای پارامترهای جریمه ای است که برای مشخص کردن جریمه مورد استفاده قرار میگیرد و مشخص میشود.
الگوریتم Nested k-Foldبه صورت زیر است
1. K-aعدد را انتخاب میکنیم
2. پارمتر p انتخاب میکنیم که مثالا درالگوریتم لجستیک میتواند نقاط پنالتی ما باشد
3. مجموعه داده ای خود را به 10 قسمت تقسیم میکنیم و یکی از انها برای تست انتخاب میکنیم وذخیره
4. یکی از دادههای ترین را برای برای ارزیابی ذخیره میکنیم
5. برای هر یک از مقادیر p اموزش را انجام میدهیم البته با 8 تا قسمت باقیمانده
6. مراحل چهار و پنج را نه بار تکرار کنید. هر کدام از قسمت ها یا فولد ها را بچرخانید و به عنوان ولیدیشن درنظر بگیرید. اکنون 9*4 تا اندازه گیری داریم.
7. P را انتخاب میکنیم که میانگین خطاهای کمتری در 9 تا قسمت یا فولد های انتخاب شده داشته باشد. و ان p را به عنوان ارزیاب برای مجموعه داده های تست در نظر میگیریم
8. مرحله 2 را 10بار تکرار کنید واز هر فولد در هر نوبت به عنوان فولد تست استفاده کنید
9. میانگین و انحراف معیار هر ارزیابی راکه با نظر گرفتن 10 بار قسمت های فلود تست بدست امده را ذخیره کن
10. الگوریتمی که بهترین عملکرد را دارد که بهترین میانگین را در این 10 لایه داشته باشد
این تکنیک از نظر محاسباتی بسیار گران است چون که در طول مراحل یک تا ده مدل های زیادی باید ارزیابی بشوند با این وجود این روش مورد استفاده قرار میگیرد چون بسیار موثر میباشد.
متاسفانه در کتابخانه sklearn متدی برای پیاده سازی این روش وجود ندارد اما میتوان با کمی سرچ در گوگل یکسری پیاده سازی های شخصی را پیدا کنید و ان را برای خودتان شخصی سازی کنید یا باتوجه به الگوریتمی که ارئه شد خودتان کدش را بزنید.
1. Cross-Validation in Machine Learning: How to Do It Right - neptune.ai