Cross-Validation یا CV یکی از موضوعات کلیدی در حوزه آزمایش مدلهای یادگیری ماشین شماست. گرچه این موضوع به طور گستردهای شناخته شده است، همچنان برخی تصورات غلط درباره برخی جنبههای آن وجود دارد. وقتی یک مدل را آموزش میدهیم، مجموعه داده را به دو مجموعه اصلی تقسیم میکنیم: آموزش و آزمایش. مجموعه آموزش، تمام مثالهایی را نشان میدهد که یک مدل از آنها یاد میگیرد. در حالی که مجموعه آزمایش، نمونههای آزمایشی را مانند شکل 1 شبیهسازی میکند.

چرا از Cross-Validation استفاده میکنیم؟
Cross-Validation ، قابلیت تخمین عملکرد مدل را بر روی دادههای دیده نشده که در حین آموزش استفاده نمیشوند، فراهم میکند.
مهندسین ارشد داده در حین فرآیند ساخت مدلهای یادگیری ماشینی (ML) به دلایل متعددی از Cross-Validation استفاده میکنند. به عنوان مثال، تنظیم هایپرپارامترهای مدل، آزمایش ویژگیهای مختلف مجموعه دادههای کلی، و تکرار فرآیند آموزش. همچنین، در مواردی که مجموعه داده آموزشی شما کوچک است و توانایی تقسیم آنها به آموزش، اعتبارسنجی (validation) و آزمایش به طور قابل توجهی بر دقت آموزش تأثیر می گذارد، این ویژگی قابل استفاده است. نکات زیر میتوانند به طور خلاصه دلیل استفاده از CV را توضیح دهند، اما با یکدیگر همپوشانی دارند. از این رو، این لیست به روشی ساده ارائه شده است:
(1) آزمایش بر روی داده های دیده نشده
یکی از ارکان مهم validation یک مدل یادگیری قبل از تولید آن، پیشبینی دقیق روی دادههای دیده نشده است. دادههای دیده نشده همه انواع دادههایی هستند که یک مدل قبلاً هرگز آنها را یاد نگرفته است. در حالت ایدهآل، قرار است دادههای تستی در بسیاری از تکرارهای آزمایشی مستقیماً در مدل جریان یابد. با این حال، در واقعیت، دسترسی به چنین دادههایی محدود است یا هنوز در یک محیط جدید در دسترس نیست.
قانون رایج 80-20 برای تقسیم دادهها به آموزش و آزمایش هنوز هم میتواند آسیب پذیر باشد. تا تصادفاً به یک تقسیم کامل ختم شود که دقت مدل را افزایش میدهد و در عین حال آن را از انجام یکسان در یک محیط واقعی محدود می کند. گاهی اوقات، دقت محاسبه شده از این طریق، بیشتر شانسی است! 80-20 به خودی خود یک قانون واقعی نیست و شما نسبت های جایگزینی را خواهید یافت که بین 25 تا 30 درصد برای آزمایش و 70 تا 75 درصد برای آموزش متغیر هستند.
(2) هایپرپارامتر مدل Tuning
یافتن بهترین ترکیب از پارامترهای مدل، یک گام رایج برای تنظیم یک الگوریتم به سمت یادگیری الگوهای پنهان مجموعه داده است. اما انجام این مرحله در یک تقسیمبندی ساده آموزش – تست معمولاً توصیه نمی شود. عملکرد مدل معمولاً به چنین پارامترهایی بسیار حساس است و باید از تنظیم آنها بر اساس تقسیم دادههای از پیش تعریفشده اجتناب شود. این کار میتواند باعث شود مدل بیش از حد overfit شود و توانایی آن را برای تعمیم کاهش دهد.
(3) تقسیم سوم قابل دستیابی نیست
برای تنظیم پارامتر و جلوگیری از overfit شدن بیش از حد مدل، ممکن است توصیه هایی در مورد تقسیم مجموعه داده به سه پارتیشن پیدا کنید: آموزش، آزمایش و validation. به عنوان مثال، 70٪ از داده ها برای آموزش، 20٪ برای اعتبار سنجی، و 10٪ باقی مانده برای آزمایش استفاده می شود. در مواردی که مجموعه داده واقعی کوچک است، ممکن است نیاز به سرمایه گذاری در استفاده از حداکثر مقدار داده، برای آموزش مدل داشته باشیم. در موارد دیگر، تقسیم به سه پارتیشن می تواند در فرآیند آموزش سوگیری ایجاد کند، جایی که برخی از نمونه های مهم در تقسیمهای آموزشی یا اعتبار سنجی نگهداری میشوند. از این رو، CV می تواند برای حل این مشکل مفید باشد.
(4) از بی ثباتی در Sampling اجتناب کنید
گاهی اوقات تقسیمبندی دادهها به آموزش-آزمایش می تواند بسیار دشوار باشد. ویژگیهای دادههای تست، مشابه ویژگیهای آموزش نیست. اگرچه تصادفی بودن تضمین میکند که هر نمونه میتواند شانس یکسانی برای انتخاب در مجموعه آزمایشی داشته باشد، فرآیند یک تقسیم واحد، همچنان میتواند در زمانی که آزمایش با یک تقسیمبندی جدید تکرار میشود، ناپایداری ایجاد کند.
Cross-Validation چگونه کار می کند؟
Cross-Validation دو مرحله اصلی دارد: تقسیم دادهها به زیر مجموعهها (به نام folds) و چرخش آموزش و Validation بین آنها. تکنیک تقسیم معمولاً دارای ویژگی های زیر است:
اندازه هر fold تقریباً یکسان است.
داده ها را می توان به صورت تصادفی در هر fold یا طبقه بندی انتخاب کرد.
همه fold ها برای آموزش مدل استفاده می شوند، به جز یکی که برای اعتبارسنجی استفاده می شود. آن fold اعتبارسنجی باید rotate شود تا زمانی که همه fold ها یک بار و تنها یک بار به یک fold مربوط به Validation تبدیل شوند.
توصیه می شود که هر نمونه در یک و تنها یک fold قرار گیرد.
K-fold
K-fold و CV دو اصطلاحی هستند که به جای هم استفاده می شوند. K-fold فقط توضیح میدهد که میخواهید مجموعه داده خود را به چند قسمت تقسیم کنید. بسیاری از کتابخانه ها از k=10 به عنوان یک مقدار پیش فرض استفاده میکنند. که نشان دهنده 90% رفتن به آموزش و 10% رفتن به مجموعه اعتبار سنجی است. شکل بعدی فرآیند iterating (تکرار) را بر روی ده برابر fold انتخاب شده از مجموعه داده، توصیف می کند.

شکل 2 نشان می دهد که چگونه یک fold در هر مرحله به طور تکراری برای آزمایش نگه داشته می شود در حالی که fold های باقی مانده برای ساخت مدل استفاده میشوند. هر مرحله خطای پیش بینی را محاسبه میکند. پس از اتمام مرحله نهایی، لیستی از خطاهای محاسبهشده تولید میشود که میتوانیم میانگین آن را بگیریم.

شکل 3 تغییر در اندازه مجموعه های آموزشی و Validation را هنگام استفاده از مقادیر مختلف برای k نشان میدهد. اندازه مجموعه آموزشی هر زمان که تعداد fold ها را افزایش دهیم، افزایش مییابد در حالی که مجموعه اعتبار سنجی کاهش مییابد. به طور معمول، هرچه مجموعه اعتبارسنجی کوچکتر باشد، احتمال افزایش تصادفی با نویز زیاد وجود دارد. افزایش اندازه مجموعه آموزشی چنین تصادفی را افزایش میدهد و معیارهای عملکرد قابل اعتمادتری را به ارمغان میآورد.
تجزیه و تحلیل نتایج
یکی از مزایای Cross-Validation مشاهده پیشبینیهای مدل در برابر تمام نمونههای موجود در مجموعه داده است. این ویژگی تضمین می کند که مدل بدون آزمایش همزمان آنها، بر روی دادههای کامل آزمایش شده است. در هر مرحله از اعتبار سنجی انتظار تغییرات وجود دار. بنابراین، محاسبه میانگین و انحراف معیار می تواند اطلاعات را به چند مقدار مقایسه کاهش دهد.
تکنیک های دیگر Cross-Validation
تکنیک های دیگری در مورد نحوه اجرای Cross-Validation وجود دارد. بیایید به برخی از آنها بپردازیم:
(1) Leave-one-out Cross-Validation (LOOCV)
LOOCV یک رویکرد جامع تقسیم holdout است که k-fold آن را افزایش میدهد. این یک مرحله بیشتر از ساخت مدلهای k دارد که با هر مثال، آزمایش شده است. این رویکرد بسیار گران است و نیاز دارد که هر نمونه نگهدارنده با استفاده از یک مدل آزمایش شود. همچنین ممکن است نرخ خطای کلی را افزایش دهد و اگر اندازه مجموعه داده بزرگ باشد، از نظر محاسباتی پرهزینه میشود. این رویکرد معمولاً زمانی توصیه میشود که اندازه مجموعه داده کوچک باشد. شکل 4 روند کلی یک مجموعه داده ساده شامل ده مثال را نشان می دهد.

(2) Leave-pair-out Cross-Validation (LPOCV)
این یکی دیگر از تکنیک های جامع برای انجام Cross-Validation است. ما میتوانیم در هر تکرار تعریف کنیم که چند مثال برای آزمایش مدل و چند نمونه برای آموزش باقی میمانند. این فرآیند برای همه ترکیبهای ممکن از جفتها در مجموعه داده تکرار میشود. توجه داشته باشید که LOOCV یک تکنیک LOPCV است که در آن p=1 است.
مثال
بیایید در مورد نحوه تقسیم داده ها با استفاده از کتابخانه Sklearn تجدید نظر کنیم. کد زیر مجموعه داده را به دو بخش تقسیم می کند: آموزش و آزمایش. ما در اینجا تعریف کردیم که یک سوم از مجموعه داده باید برای آزمایش استفاده شود.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
سپس یک تابع می سازیم تا نشان دهد k-fold چگونه در مقایسه با تک تقسیم درکد قبلی کار میکند.
def k_Fold_Split(data, n_splits, shuffle, random_state, verbose=False):
# Creating k-fold splitting
kfold = KFold(n_splits, shuffle, random_state)
sizes = [0 , 0]
for train, test in kfold.split(data):
if verbose:
print('train: indexes %s, val: indexes %s, size (training) %d, (val) %d' % (train, test, train.shape[0], test.shape[0]))
sizes[0] += train.shape[0]
sizes[1] += test.shape[0]
return int(sizes[0]/n_splits), int(sizes[1]/n_splits)
تابع ‘k_fold_split’ شاخصها و اندازه هر پارتیشن را نشان میدهد. این به شما امکان میدهد تا میزان داده اختصاص داده شده برای هر فولد و شاخصهای انتخابی را ردیابی کنید.
LOOCV
استفاده از LOOCV به عنوان یک استراتژی تقسیم بسیار ساده است. ما دوباره از کتابخانه Sklearn برای انجام اعتبارسنجی متقابل استفاده خواهیم کرد.
from sklearn.model_selection import LeaveOneOut
cv_strategy = LeaveOneOut()
# cross_val_score will evaluate the model
scores = cross_val_score(estimator, X, y, scoring='accuracy', cv=cv_strategy, n_jobs=-1)
توصیههای دقیق
مجموعه داده Time-series
Cross-Validation روشی عالی برای اطمینان از این است که مجموعه داده آموزشی یک نوع سفارش ضمنی ندارد. با این حال، برخی از موارد، مانند موارد استفاده سری زمانی، نیاز به حفظ نظم دارند. ما هنوز هم میتوانیم از Cross-Validation برای مجموعه دادههای time-series با استفاده از تکنیکهای دیگری مانند fold های مبتنی بر زمان استفاده کنیم.
مجموعه داده نامتعادل
پرداختن به Cross-Validation در یک مجموعه داده نامتعادل نیز میتواند مشکل باشد. اگر از نمونه برداری بیش از حد استفاده شود، نشت نمونه های بیش از حد نمونه، میتواند نتایج CV را گمراه کند. یکی از راههای نتیجهگیری، استفاده از نمونهگیری طبقهای به جای تقسیم تصادفی است.
Nested Cross-Validation
Cross-Validation عمومیسازی مدل را اندازهگیری می کند، اما نمیتواند به طور کلی از سوگیری جلوگیری کند. Nested Cross-Validation بر حصول اطمینان از عدم تطابق بیش از حد پارامترهای مدل با مجموعه داده تمرکز دارد. کلمه کلیدی Nested به استفاده از Cross-Validation مضاعف در هر fold اشاره می کند. Cross-Validation تنظیم هایپرپارامتر با استفاده از تقسیمهای k-fold دیگر در fold های مورد استفاده برای آموزش مدل به دست میآید.
Overfitting
همانطور که قبلا ذکر شد، Cross-Validation برای اندازه گیری اینکه آیا یک مدل یادگیری میتواند بر روی دادههای دیده نشده تعمیم دهد، استفاده می شود. ما به استفاده از یک مجموعه داده Validation برای توقف اولیه و تنظیم پارامتر متفاوت از مجموعه آزمایش در طول ساخت مدلها متکی هستیم. اخیراً چند مقاله تحقیقاتی وجود دارد که استفاده از CV را برای اندازهگیری Overfitting نیز پیشنهاد میکنند. در این مورد، کاربرد مستقیم استفاده از CV به عنوان یک مجموعه Validation برای یک مدل یادگیری خواهد بود.
خلاصه
Cross-Validation روشی برای ارزیابی عملکرد مدلهای یادگیری است. مجموعه دادهها معمولاً در یک استراتژی تصادفی یا طبقهبندی شده تقسیم میشوند. تکنیک تقسیم را می توان بر اساس اندازه دادهها و هدف نهایی تنوعبخشی و انتخاب کرد. همچنین هزینه محاسباتی در اجرای تکنیک CV نقش دارد. در مشکلات رگرسیون و طبقهبندی میتوان از CV استفاده کرد، اما برای برخی از انواع مجموعه دادهها مانند time-series ، باید توجه دقیقی صورت گیرد. یک نمونه کامل از کد را می توان در Github من یافت.
منبع: towardsdatascience نویسنده: محمد عبدالحمید
Leave feedback about this