امیرحسین مجد
امیرحسین مجد
خواندن ۱۵ دقیقه·۳ سال پیش

كراس وليديشن (اعتبار سنجی) در یادگیری ماشین:چگونه آن را به درستی انجام دهیم

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. استفاده کنید.


با این حال این روش یک ایراد بزرگ دارد.

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

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

K-Fold

در این روش ما ماییم معایب روش قبل را کاهش یا از بین میبریم. این روش ما بصورت جدیدی به تقسیم بندی داده های میپردازیم که کمک میکند تا بتوانیم گلوگاهی که در روش قبلی ممکن بود بدست بیاد را از بین ببریم.

الگوریتم روش k-Fold:

1. یک عدد برای K در k-Fold درنظر میگیریم. که معمولا 5 یا 10 میباشد اما هر عدد که کمتر از طول مجموعه داده باشد را میتوانید انتخاب کنید

2. مجموعه داده را به k قسمت مساوی (در صورت امکان) تقسیم کنید که به آنها folds گفته می شود.

3. k – 1فواد را به عنوان داده های اموزشی انتخاب کنید. وبقیه هم برای داده های تست در نظر میگیریم.

4. مدل را با توجه به داده های اموزشی، اموزش میدهیم. در هر تکرار برای CV ما باید یک مدل جدید مستقل از مدل اموزشی قبلی را اموزش دهیم.

5. با داده های تست ارزیابی میکینم

6. نتایج را ذخیره میکنیم

7. مرحله سه تا شش را برای K بار تکرار میکنیم. و هر بار هم از فولد های باقی مانده برای تست استفاده میکنیم. ودر اخر مدل را روی تمام فولد های که داریم ارزیابی میکنیم.

8. برای به دست آوردن امتیاز نهایی، میانگین نتایجی که در مرحله شش را دست می آوردیم.


برای پیاده سازی این روش از sklearn.model_selection.train_test_split. استفاده کنید:


به طور کلی همیشه بهتر است به جای Hold-out از تکنیک k-Fold استفاده کنید. از آنجایی که آموزش و آزمایش بر روی چندین بخش مختلف مجموعه داده انجام می شود و چون مجموعه داده را به چندین بخش مختلف تقسیم میکند و تست و اموزش روی همه انها انجام میدهد قابل اعتماد تر میباشد. اگر تعداد K هایی که در نظر گرفته میشود را افزایش دهیم ما میتوانیم امتیاز کلی بهتر و قوی تری را بدست بیاریم . اما این روش هم یک نقطه ضعف دارد که با افزایش K ها تعداد دفعات اموزش و تست هم افزایش میابد که این باعث زمان بر بودن و هزینه بر بودن هم هست.

Leave-one-out cross-validation (LOOCV)

LOOCV تشدیدشده ی مدل قبلی هست به این صورت که درنظر بگیر که بجای K تا دیگر n تا داریم که این تعداد نمونه های مجموعه داده است.

الگوریتم روش LOOCV :

1. یک نمونه از مجموعه داده را انتخاب می‌کنیم که مجموعه تست خواهد بود.

2. N-1 نمونه باقی مانده را به عنوان نمونه ازمایشی در نظر میگیرم

3. مدل را باتوجه به داده های اموزشی، اموزش میدهیم. و در هر تکرار باید مدل جدید اموزش داده شود

4. با نمونه تست ارزیابی میکینم

5. نتیجه ارزیابی را ذخیره میکنیم

6. مرحله 1تا 5 را تکرار کنید برای n تا نمونه که باید n تا نمونه تست و اموزشی مختلف داشته باشیم.

7. برای بدست اوردن نتیجه نهایی میانگین نتایج بدست امده در مرحله 5 را محاسبه میکنیم


برای این روش هم کتابخانه sklearn یک روش را ساخته است میتوانید با استفاده از model_selection در کتابخانه sklearn.model_selection.LeaveOneOut مورد استفاده قرار بدید:


بزرگترین مزیت این روش است که همه انها مورد ازمایش و تست قرار میگیرد و هیچ کدام هدر نمیرود و فقط از یک نمونه برای تست تمام داده ها استفاده میکنیم و بقیه به عنوان نمونه ازمایشی مورد استفاده قرار میگیرد. اما اگر بخواهیم با روش قبلی مقایسه کنیم تعداد تقسیم بندی به تعداد نمونه هاست که خیلی بیشتر از روش قبلی است و این به امر باعث هزینه بر بودن و زمان بر بودن بیشتری نسبت به روش قبلی میشود. بنابراین با توجه به شواهد تجربی و تحقیقات مختلف که جامعه علم داده انجام داده است روش فولد با تعداد 5 یا 10 را به این روش ترجیح داده میشود.

Leave-p-out cross-validation (LpOC)

این روش خیلی نزدیک به روش قبلی است .و تمام مجموعه های تست و اموزش رو تولید میکنیم با در نظر گرفتن p نمونه برای داده های تست. و تمام شرایط دیگر که در روش LOOCVوجود داشت برای LPOCVهم برقرار است.

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

الگوریتم روش LPOC

1. انتخاب p نمونه برای مجموعه داده ای تست

2. باقی داده هایی که میماند را برای آموزش در نظر میگیریم

3. مدل را با توجه به داده ای اموزشی ، اموزش میدهیم.در هر تکرار یک مدل جدید باید اموزش داده شود

4. با توجه به داده های تست ارزیابی میکینم

5. تنایج بدست امده در قسمت ارزیابی را ذخیره میکنیم

6. مرحله های دو تا پنج را ? بار انجام میدهیم

7. برای بدست اوردن نتیجه نهایی نتایج بدست امده در قسمت 5 را میانگین گیری میکنیم

میتوان Leave-p-out CV را با sklearn.model_selection.LeavePOut مورد استفاده قرار داد:


این روش تمام معایب روش قبل را دارد اما با این وجود مثل روش قبل قوی است.

Stratified k-Fold

گاهی اوقات ممکن است با ناهماهنگی بزرگی در مقادیرهدف از مجموعه دادها مواجه شویم. برای مثال فرض کنید یک مجموعه قیمت برای ساعت های مچی داریم و تعداد ساعت با قیت بالا زیاد باشد. یا در دسته بندی مجموعه سگ ها و گربه ها ممکن است تغییرات بزرگی در داده های مربوط به سگ ها وجود داشته باشد.

این روش یک نوعی از فولد است و طوری طراحی شده است تا در چنین مواردی برای رسید به هدف مورد نظر موثر باشد.

به این صورت عمل میکند که دسته بندی مجموعه داده ها را روی k تا انجام میدهیم به طوری که تقریبا هر kیک درصد یکسان از نمونه های کل مجموعه را شامل میشود.و دراین روش این اطمینان داده میشود که تقریبا میانگین مقدار هدف همه فولد ها برابر باشد.

الگوریتم روش Stratified k-Fold به صورت زیر است:

1. یک عدد برای مقدار k انتخاب میکنیم

2. مجموعه داده ها را به k تا تقسیم میکنیم. هر قسمت یا فولد باید شامل درصد مشابهی از نمونه های کلاس هدف در مجموعه کل داده ها باشد.

3. K-1 قسمت یافولد را برای اموزش مورد استفاده قرار میدهیم و بقیه را برای تست

4. با توجه به داده های اموزشی مدل خود را اموزش میدهیم و هر تکرار باید با مدل جدید اموزش ببیند

5. با داده های تست انرا ارزیابی میکنیم

6. مقدادیر بدست امده را ذخیره میکنیم.

7. مراحل سه تا شش را تکرار میکنیم در هر تکرار باید مدل را روی هر قسمت یا فولد ارزیابی کنیم

8. برای بدست اوردن نتایج نهایی میانگین مقادیر بدست امده در قسمت شش را میانگینگیری میکنیم.


این روش نسبت به k-Fold CV مزایای واضحی دارد. اولا نسبت تقسیم داده های تست و اموزش به تعداد تکرار ها وابسته نیست دوما ما میتوانیم نسبت های منحصر به فردی را برای هر تکرار در نظر بگیریم . سوما انتخاب تصادفی نمونه ها باعث افزایش قدرت این روش میشود.

با این حال این روش هم معایب خاص خود را دارد. در روش k-Fold CV تضمین میشود که روی همه نمونه ها ازمایش شود در حالی که در این روش بر اساس تصادفی سازی صورت میگیرد که ممکن است برخی نمونه ها هرگز در مجموعه ازمایش قرار نگیرد و انتخاب نشود و یا بعضی از نمونه ها چندین بار انتخاب شوند.

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


Nested 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 متدی برای پیاده سازی این روش وجود ندارد اما میتوان با کمی سرچ در گوگل یکسری پیاده سازی های شخصی را پیدا کنید و ان را برای خودتان شخصی سازی کنید یا باتوجه به الگوریتمی که ارئه شد خودتان کدش را بزنید.

Complete Cross-Validation

CV کامل کم استفاده ترین تکنیک در CV میباشد. ایده کلی این روش به این صورت میباشد که ما یک عدد مانند k را درنظر میگیریم که طول داده های اموزشی ماهستند و ارزیابی یا اندازه گیری را روی k تا تقسیم ممکن بر روی نمونه اموزشی انجام میدهیم.

میزان ان تقسیم ها را میتوان با استفاده از ? بدست اورد که n طول مجموعه داده های ما میباشد. اگر k از 2 بزرگتر باشد باید مدل خود را چندین بار آموزش دهیم که همانطور که قبلاً متوجه شدیم یک زمان فرآیند گران قیمت و از نظر محاسباتی است.

بخاطر همین از که از این روش فقط در تحقیقات تئوری و یا در صورت وجود فرمول موثر که محاسبات را به حداقل برساند مورد استفاده قرار میگیرد.

الگوریتم این روش به صورت زیر است:

1. عددk را به عنوان طول ست اموزش انتخاب میکنیم

2. مجموعه داده را تقسیمبندی میکنیم

3. روی داده های اموزشی، اموزش میدهیم

4. با استفاده از داده های تست ان را ارزیابی میکنیم

5. نتیجه را ذخیره میکنیم

6. مرحله دو تا پنج را ? بار تکرار میکنیم

7. برای ادست اوردن نتیجه نهایی میانگین تمام نتیجه هایی که در محله 5 بدست امد را اندازه گیری میکنیم.

Cross-Validation در یادگیری ماشین

بیشتر تکنیک های اعتبار سنجی که بیان شد در یادگیری ماشین مورد استفاده قرار میگیرد. خیلی مهم است که این موضوع را فراموش نکنیم که استفاده از این تکنیک ها در زمان شما صرفه جویی میکند و کمک میکند تا بتوانید بهترین مدل را انتخاب کنید. واین به این معناست که اولا ، بهتر است مدلتان را همیشه CVکنید و دوما یکی از روش ها را که مناسب کار شماست انتخاب کنید. بنابراین دانستن اینکه چه مزایا و معایبی دارند بسیار با اهمیت است.

شایان ذکر است اکر میخواهیم یک مدل را CVکنیم، باید از مدل کاملا اطلاعات را در دست داشته باشیم یا به عبارتی دفترچه راهنمای مدل در دست ما باشد چونکه ممکن است برخی از روش های ماشین لرنینگ داخل خودش CV را داشته باشند و میتوانید از انها بجای استفاده از کتابخانه sklearnاستفاده کنید.

به طور کلی همانطور که متوجه شدید تکنیک های CV را میتوان با استفاده از کتابخانه sklearn پیاده سازی کنید و بسیار مفید هم هستند از این بابت که در وقت شما بسیار صرفه جویی میکنند.

Cross-Validation in Deep Learning

اعتبار سنجی در یادگیری عمیق ممکن است مقداری مشکل باشدبخاطر اینکه اکثر تکنیک های CV حداقل یکی دوبار نیاز مند مدل های اموزشی میباشد.

در یادگیری عمیق ما معمولا وسوسه میشویم که از استفاده CV اجتناب کنیم چونکه اموزش k مدل مختلف هزینه بر است. بجای انجام k-fold یا سایر تکنیک های cvممکن است از زیرمجموعه‌ای تصادفی از داده‌های آموزشی خود به عنوان نگهدارنده برای اهداف اعتبارسنجی استفاده کنید. به عنوان مثال، کتابخانه یادگیری عمیق Keras به شما این امکان را می دهد که یکی از دو پارامتر را برای تابع fit که آموزش را انجام می دهد، ارسال کنید.

1. validation_split : درصدی از داده هایی که باید برای اعتبار سنجی نگهداری شوند

2. validation_data: : یک زوج مرتب از (X, y) که باید برای اعتبارسنجی استفاده شود. این پارامتر validation_split را نادیده می گیرد، به این معنی که شما می توانید تنها یکی از این پارامترها را در یک زمان استفاده کنید.

همین رویکرد در آموزش های رسمی سایر فریمورک های DL مانند PyTorch و MxNet استفاده می شود. آنها همچنین پیشنهاد می کنند مجموعه داده را به سه بخش تقسیم کنید: آموزش، اعتبار سنجی و آزمایش.

1. آموزش – بخشی از مجموعه داده برای آموزش

2. اعتبار سنجی - بخشی از مجموعه داده برای ارزیابی در حین آموزش

3. تست - بخشی از مجموعه داده برای اعتبار سنجی نهایی مدل

با این حال، می توانید از CV در وظایف یادگیری عمیق استفاده کنید اگر مجموعه داده کوچک باشد (شامل صدها نمونه) در این مورد، یادگیری یک مدل پیچیده ممکن است یک غیرضروری باشد، بنابراین مطمئن شوید که با انجام ان کار را بیشتر پیچیده نکنید.

بهترین تمرینات و نکات

شایان ذکر است که گاهی اوقات پیاده سازی اعتبارسنجی متقابل ممکن است کمی مشکل باشد. به عنوان مثال، اشتباه منطقی هنگام تقسیم مجموعه داده خیلی راحت بوجود می‌اید که ممکن است منجر به یک CV غیرقابل اعتماد شود.

نکات زیر را برای مدل کردن CVدرنظر داشته باشید:

1. هنگام تقسیم داده ها منطقی باشید (آیا روش تقسیم منطقی است)

2. از روش CV مناسب استفاده کنید (آیا این روش برای مورد استفاده من قابل اجرا است)

3. هنگام کار با سری‌های زمانی، گذشته را ارزیابی نکنید (به اولین نکته توجه کنید)

4. هنگامی که با داده های پزشکی یا مالی سروکار دارید حتما توسط یک شخصی انها را جداسازی کنید. از داشتن داده برای یک نفر هم در آموزش و هم در مجموعه تست خودداری کنید زیرا ممکن است به عنوان نشت داده در نظر گرفته شود

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

البته، نکات هر روش یا کار با روش یا کار دیگر متفاوت است و پوشش همه آنها تقریبا غیرممکن است. به همین دلیل است که انجام یک تجزیه و تحلیل داده های اکتشافی قوی قبل از شروع اعتبارسنجی (CV) یک مدل همیشه بهترین روش است.

اخرین نظرات(جمع بندی)

اعتبار سنجی ابزار قدرتمندی است. هر دانشمند داده باید با آن آشنا باشد. در زندگی واقعی، شما نمی توانید پروژه را بدون CV یک مدل به پایان برسانید.

به نظر من بهترین تکنیکهای CV را میتوانNested k-Fold و استانداردk-Fold در نظر گرفت. من شخصاً از آنها استفاده کردم. Nested k-Fold بهتر از GridSeachCV به من کمک کرده است و از طرف دیگر، ازk-Fold برای ارزیابی عملکرد مدل استفاده میکنم.

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

امیدواریم با این اطلاعات، مشکلی در تنظیمات CV برای پروژه بعدی یادگیری ماشین خود نداشته باشید!

منبع

1. Cross-Validation in Machine Learning: How to Do It Right - neptune.ai


كراس وليديشنcrossvalidationcross validation
شاید از این پست‌ها خوشتان بیاید