بهناز صادقی گل
بهناز صادقی گل
خواندن ۱۷ دقیقه·۳ سال پیش

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

اعتبار سنجی متقابل (Cross-Validation) در یادگیری ماشینی: چگونه آن را درست انجام دهیم؟

در یادگیری ماشین (ML)، جامعیت و عمومیت معمولا به توانایی یک الگوریتم در تأثیرگذاری روی ورودی­های مختلف اشاره دارد؛ به این معنی که مدل یادگیری ماشین توانایی عملکرد خود را در برابر ورود داده­های جدید در یک توزیع داده­ی آموزشی از دست نمی­دهد.

برای انسان، عمومیت­بخشی و تعمیم، طبیعی­ترین کار ممکن است. ما می­توانیم به­صورت آنی (در ذهنمان) دسته­بندی و طبقه­بندی انجام دهیم. به­­طور مثال، ما بدون شک یک سگ را تشخیص می­دهیم حتی اگر قبل از آن، چنین نژادی را ندیده باشیم. با این حال چنین مساله­ای می­تواند برای یک مدل یادگیری ماشین کاملا چالش برانگیز باشد. به همین دلیل بررسی توانایی الگوریتم در عمومیت­بخشی کار مهمی است که در زمان ساخت مدل نیاز به توجه زیادی دارد.

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

موضوعاتی که در این مقاله به آن­ها خواهیم پرداخت، عبارتند از:

- اعتبارسنجی متقابل چیست: تعریف، هدف از استفاده و روش­ها.

- روش­های متفاوت CV:, Stratified , Leave-p-out, Leave-one-out, k-folds, k-folds ,hold-out Complete CV ,Nested k-folds, Repeated k-folds

- چگونه از این روش­ها استفاده کنیم؟ sklearn

- اعتبارسنجی متقابل در یادگیری ماشین: sklearn, CatBoost

- اعتبارسنجی متقابل در یادگیری عمیق: Keras, PyTorch, MxNet

- بهترین تمرین­ها و نکات: سری­های زمانی، داده­های پزشکی و اقتصادی، تصاویر

-

اعتبارسنجی متقابل چیست؟

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

درک و فهمیدن روش CV راحت است، پیاده­سازی آن راحت است و نسبت به سایر روش­ها که در شمارش امتیازات مدل استفاده می­شود، بایاس کمتری دارد. همه­ی این­ها، روش اعتبارسنجی متقابل را یک ابزار قوی در جهت انتخاب بهترین مدل برای انتخاب یک کار مشخص می­سازد.

برای مدل کردن اعتبارسنجی متقابل روش­های متنوع زیادی ممکن است استفاده شود؛ با این­که همه­ی آن­ها یک الگوریتم مشابه دارند:

1. تقسیم کردن مجموعه داده­ها به دو بخش: بخشی برای آموزش و بخش دیگر برای تست

2. آموزش مدل روی مجموعه داده­های آموزشی

3. اعتبارسنجی مدل روی مجموعه داده­های تست

4. تکرار یک یا دوبار مراحل 1-3 . این تعداد بستگی به روش CV دارد که استفاده می­کنید.

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

روش­های اعتبارسنجی متقابلی که در این مقاله به آن­ها خواهیم پرداخت، عبارتند از:

  • Hold-out
  • K-folds
  • Leave-one-out
  • Leave-p-out
  • Stratified K-folds
  • Repeated K-folds
  • Nested K-folds
  • Complete

روش اعتبارسنجی متقابل Hold-out ساده­ترین و رایج­ترین تکنیک است. شاید شما با روش Hold-out آشنایی نداشته باشید اما یقینا همه روزه از آن استفاده می­کنید.

روش الگوریتم Hold-out:

1. مجموعه داده آموزشی را به دو قسمت تقسیم کنید: مجموعه آموزشی و مجموعه تست. معمولا 80% مجموعه داده را برای مجموعه آموزشی استفاده می­کنند و 20% دیگر را برای مجموعه تست.

2. با مجموعه آموزشی مدل را، آموزش دهید.

3. با داده­های تست، آن را ارزیابی کنید.

4. نتیجه­ی اعتبارسنجی را ذخیره کنید.

معمولا از روش اعتبارسنجی Hold-out برای مجموعه داده­های بزرگ استفاده می­کنیم زیرا تنها به یک بار آموزش مدل نیاز دارد. پیاده­سازی روش Hold-out واقعا ساده است. برای مثال، می‌توانید این کار را با استفاده از sklearn.model_selection.train_test_split انجام دهید.

import numpy as np

from sklearn.model_selection importtrain_test_split

X, y = np.arange(10).reshape((5, 2)), range(5)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=111)

البته روش Hold-out یک ایراد اساسی دارد. برای مثال، مجموعه داده­ای که توزیع کاملا یکنواختی ندارد. در چنین حالتی ممکن است پس از تقسیم، در یک نقطه­ی نقطه­ی ناهموار قرار بگیریم. به­طور مثال مجموعه­ی آموزشی، مجموعه تست را نشان نخواهد داد. ممکن است مجموعه آموزشی و تست تفاوت بسیاری داشته باشند، ممکن است یکی از آن­ها سخت­تر یا آسان­تر باشد.

به­علاوه این واقعیت که ما مدلمان را فقط یک بار تست می­کنیم ممکن است یک تنگنا برای این روش باشد. به دلایلی که اشاره شد، ممکن است نتایج به­دست آمده به روش Hold-out نادرست به نظر برسد.

k-Fold

k-Fold CV یک روش است که معایب روش Hold-out را به حداقل می­رساند. k-Fold روش جدیدی را برای تقسیم مجموعه داده معرفی می­کند برای غلبه بر «تنگنای فقط یک تست» کمک می­کند.

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

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

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

3. 1-Kدسته یا fold را که مجموعه آموزشی خواهد بود، انتخاب کنید. دسته­های باقیمانده مجموعه تست خواهد بود.

4. مدل را روی مجموعه آموزشی، آموزش دهید. در هر تکرار در اعتبارسنجی متقابل، باید یک مدل جدید مستقل از مدل آموزشی که در مرتبه­ی قبل آموزش دیده را آموزش دهید.

5. روی مجموعه تست ارزیابی انجام دهید.

6. نتیجه­ی ارزیابی را ذخیره کنید.

7. مراحل 3-6 را k بار تکرار کنید. هر بار یک دسته باقی­مانده را به­عنوان داده­ی تست در نظر بگیرید. در نهایت، شما با همه دسته­هایی که دارید مدل را ارزیابی کرده­اید.

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

اعتبار سنجی متقابل به روش k- fold

برای انجام اعتبارسنجی متقابل k-Fold می توانید از sklearn.model_selection.KFold استفاده کنید.

import numpy as np
from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=2)
for train_index, test_index in kf.split(X):
print(&quotTRAIN:&quot, train_index, &quotTEST:&quot, test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

به طور کلی همیشه بهتر است به­جای روش Hold-out از روش k- fold استفاده شود. به­طور دقیق­تر، مقایسه­ی نتایجی که از روش k- fold به دست می­آید درست­تر و قابل اعتمادتر است زیرا تست و آموزش روی چندین بخش مختلف از مجموعه داده اجرا می­شود. حتی می­توانیم تعداد دسته­بندی یا fold های تست مدل را روی زیرمجموعه داده­ها بیشتر کنیم، تا کل امتیاز را به دست آوریم.

همچنان روش k- fold معایبی دارد. افزایش k باعث آموزش مدل­های بیشتری می­شود و روند آموزش ممکن است واقعا گران و زمان بر باشد.

Leave-one-out

اعتبارسنجی متقابل Leave-one-out (LOOCV) شدت یافته­ی مورد k-Fold CV است. تصور کنید k برابر با n باشد که n تعداد نمونه های مجموعه داده است.

تکنیک الگوریتم LOOCV

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

2. 1-nنمونه باقی­مانده را در مجموعه آموزشی قرار دهید.

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

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

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

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

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

اعتبارسنجی متقابل Leave-one-out (LOOCV)

sklearn برای LOOCV هم یک متد داخلی داردکه می­توان آن را در کتابخانه model_selection - sklearn.model_selection.LeaveOneOut یافت.

import numpy as np
from sklearn.model_selection import LeaveOneOut
X = np.array([[1, 2], [3, 4]])
y = np.array([1, 2])
loo = LeaveOneOut()
for train_index, test_index in loo.split(X):
print(&quotTRAIN:&quot, train_index, &quotTEST:&quot, test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

بزرگ­ترین مزیت اعتبارسنجی متقابل Leave-one-out این است که داده زیادی را به هدر نمی­دهد. ما فقط یک نمونه از کل مجموعه داده را به­عنوان داده تست در نظر می­گیریم؛ درحالی­که بقیه داده، آموزشی است. اما وقتی با k-Fold CV مقایسه می‌شود، LOOCV نیاز است به جای k مدل n مدل ساخته شود. به این معنی که LOOCV از نظر محاسباتی گران­تر از k-Fold است، ممکن است زمان زیادی برای اعتبارسنجی متقابل مدل با استفاده از LOOCV نیاز باشد.بنابراین، جامعیت علم داده یک قاعده­ی کلی بر اساس شواهد تجربی و تحقیقات متفاوت دارد که پیشنهاد می­دهد که اعتبارسنجی متقابل 5-Fold یا10-Fold بر روشLOOCV ترجیح دارد.

Leave-p-out

اعتبارسنجی متقابل Leave-p-out (LpOC) شبیه Leave-one-out CV است؛ زیرا تمام مجموعه­های آموزشی و تست ممکن را با استفاده از pنمونه، به­عنوان مجموعه آزمایشی ایجاد می کند. تمام موارد گفته شده در مورد LOOCV برایLpOC هم درست است.

با این حال قابل ذکر است که برخلاف مجموعه تست LOOCV و k-Fold برای LpOCاگر p بزرگتر از 1 باشد، هم­پوشانی دارد.

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

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

2- n – p نمونه باقیمانده مجموعه آموزشی خواهد بود.

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

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

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

6- مراحل 2 تا 5 C­­np بار را تکرار کنید.

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

می­توانید Leave-p-out CV را با استفاده – sklearn.model_selection.LeavePOut اجرا کنید.

import numpy as np

from sklearn.model_selection importLeavePOut

X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])

y = np.array([1, 2, 3, 4])

lpo = LeavePOut(2)

for train_index, test_index inlpo.split(X):

print("TRAIN:", train_index, "TEST:", test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

LpOC تمام معایب LOOCV را دارد، اما، با این وجود، به اندازه LOOCV قوی است.

k-Fold طبقه­بندی شده

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

K-Fold طبقه بندی شده نوع دیگری از روش استاندارد K-Fold CV است که طراحی شده است تا در چنین مواردی از عدم تعادل هدف موثر واقع شود.

این­طور عمل می­کند: K-Fold طبقه بندی شده مجموعه داده را روی K دسته طبقه­بندی می­کند به طوری که هر دسته تقریباً دارای همان درصدی باشد که نمونه های هر کلاس هدف به نسبت کل مجموعه دارد. در مورد رگرسیون، k-Fold طبقه­بندی شده این اطمینان را می دهد که میانگین مقدار هدف تقریباً در همه­ی دسته­ها مساوی است.

الگوریتم روش K-Fold طبقه بندی شده به این صورت است:

1- تعداد K دسته را انتخاب کنید.

2- مجموعه داده­ها را در K دسته تقسیم­بندی کنید؛ به طوری که هر دسته تقریباً دارای همان درصدی باشد که نمونه­های هر کلاس هدف به نسبت کل مجموعه دارد.

3- 1- K دسته را برای مجموعه آموزشی انتخاب کنید. دسته باقی­مانده به­عنوان داده تست استفاده می­شود.

4- مدل را روی مجموعه آموزشی آموزش دهید. در هر بار، یک مدل جدید باید آموزش داده شود.

5- با مجموعه تست ارزیابی انجام دهید.

6- نتیجه ارزیابی را ذخیره کنید.

7- مراحل 6-3 را K بار تکرار کنید. هر بار دسته­ی باقی مانده را برای مجموعه تست استفاده کنید. در پایان شما باید مدل را روی همه­ی مجموعه­ها ارزیابی کرده باشید.

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

همان­طور که ممکن است دقت کرده باشید، الگوریتم روش طبقه­بندی شده k-Fold مشابه روش K-Fold استاندارد است. شما نیازی به کدنویسی اضافی ندارید زیرا این روش همه کارهای لازم را برای شما انجام خواهد داد.

k-Foldطبقه­بندی شده یک متد داخلی در sklearn دارد. – sklearn.model_selection.StratifiedKFold

import numpy as np

from sklearn.model_selection importStratifiedKFold

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])

y = np.array([0, 0, 1, 1])

skf = StratifiedKFold(n_splits=2)

for train_index, test_index inskf.split(X, y):

print("TRAIN:", train_index, "TEST:", test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

تمام موارد ذکر شده در بالا در مورد K-Fold CV برای روش Stratified k-Foldنیز درست است. موقع انتخاب کردن بین روش های مختلف CV، اطمینان پیدا کنید که از روش مناسب استفاده می کنید. برای مثال، ممکن است فکر کنید که مدل شما عملکرد بدی دارد، صرفاً به این دلیل که از K-Fold CV برای ارزیابی مدلی استفاده می‌کنید که بر روی مجموعه داده با کلاس نامتعادل آموزش داده شده است. برای جلوگیری از آن باید همیشه تحلیل داده اکتشافی مناسب را روی دیتا انجام دهید.

Repeated k-Fold (تکرار شونده)

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

ایده کلی این است که در هر تکرار، به‌طور تصادفی نمونه‌هایی را از تمام مجموعه داده به عنوان مجموعه تست انتخاب می‌کنیم. به عنوان مثال، اگر تصمیم بگیریم که 20٪ از مجموعه داده را برای مجموعه تست در نظر بگیریم، 20٪ نمونه­ها به طور تصادفی انتخاب شوند و 80٪ مابقی مجموعه آموزشی در نظر گرفته شوند.

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

1- k – a را انتخاب کنید تا مدل آموزش داده شود.

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

3- مجموعه داده را تقسیم کنید.

4- مجموعه آموزشی را مورد آموزش قرار دهید. در هر تکرار اعتبارسنجی متقابل، یک مدل جدید باید آموزش داده شود.

5- مجموعه تست را مورد ارزیابی قرار دهید.

6- نتیجه ارزیابی را ذخیره کنید.

7- مراحل را 3-6 را k بار تکرار کنید.

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

Repeated k-Fold

K-Fold تکرارشونده مزایای واضحی نسبت به k-Fold CV استاندارد دارد. اول، نسبت تقسیم آموزش/تست به تعداد تکرارها بستگی ندارد. دوم، حتی می توانیم نسبت­های خاصی را برای هر تکرار مشخص کنیم. سوم، انتخاب تصادفی نمونه‌ از مجموعه داده‌ها، Repeated k-Fold را انتخاب قوی‌تری می‌کند.

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

Sklearn به شما در پیاده سازی Repeated k-Fold CV کمک می­کند. فقط از sklearn.model_selection.RepeatedKFold استفاده کنید. در اجرای sklearn این روش باید تعداد دسته­هایی که می­خواهید داشته باشید (n_splits ) و تعداد دفعاتی که تقسیم انجام می­شود (n_repeats ) را تنظیم کنید. این تضمین می­کند که در هر تکرار دسته­های مختلفی داشته باشید.

import numpy as np
from sklearn.model_selection import RepeatedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 1, 1])
rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=42)
for train_index, test_index in rkf.split(X):
print(&quotTRAIN:&quot, train_index, &quotTEST:&quot, test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

روش Nested k-Fold

برخلاف سایر‌ روش­های CV، که برای ارزیابی کیفیت یک الگوریتم طراحی شده‌اند، Nested k-Fold CV محبوب ‌ترین راه برای تنظیم پارامترهای یک الگوریتم است.

تصور کنید که ما یک پارامتر p داریم که معمولاً به الگوریتم پایه ای که ما در حال اعتبارسنجی متقابل آن هستیم بستگی دارد. به عنوان مثال، برای رگرسیون لجستیک، ممکن است پارامتر جریمه­ای باشد که برای تعیین اندازه مورد استفاده در جریمه به کار گرفته می شود.

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

1- k را انتخاب کنید. (به عنوان مثال، 10). فرض کنید این عدد را انتخاب کرده­ایم.

2- یک پارامتر p انتخاب کنید. فرض کنید الگوریتم ما رگرسیون لجستیک است و p پارامتر جریمه p = {'l1', 'l2', 'elasticnet', 'none'}

3- مجموعه داده را به 10 دسته تقسیم کنید و یکی از آنها را برای تست در نظر بگیرید.

4- یکی از دسته­های آموزشی را برای اعتبارسنجی رزرو کنید.

5- برای هر مقدار p روی 8 دسته آموزشی باقیمانده آموزش دهید و روی دسته اعتبارسنجی ارزیابی کنید. اکنون 4 اندازه­گیری دارید.

6- مراحل 4-5 را 9 بار تکرار کنید. طوری دسته آموزشی را بچرخانید تا دسته ارزیابی قرار گیرد. اکنون 4 * 9 اندازه گیری دارید.

7- p را انتخاب کنید که میانگین خطای آموزش را روی 9 دسته به حداقل می رساند. از آن p برای ارزیابی روی مجموعه تست استفاده کنید.

8- از مرحله 2 ، 10 بار تکرار کنید و از هر فولد به نوبت به عنوان فولد تست استفاده کنید.

9- میانگین و انحراف معیار اندازه گیری ارزیابی را در 10 فولد تست ذخیره کنید.

10- الگوریتمی که بهترین عملکرد را داشت، الگوریتمی بود که بهترین میانگین عملکرد خارج از نمونه را در 10 فولد آزمایشی داشت.

این روش از نظر محاسباتی هزینه­بر است؛ زیرا در طول مراحل 1 تا 10 تعداد زیادی مدل باید آموزش و ارزیابی شوند. با این حال، Nested k-Fold CV معمولا استفاده می شود و ممکن است در چندین کار ML واقعاً مؤثر باشد.

متأسفانه، هیچ روش داخلی در sklearn وجود ندارد که بتواند CV Nested k-Fold را برای شما انجام دهد. این لحظه ای است که شما باید یا گوگل کنید و پیاده سازی شخصی را پیدا کنید یا خودتان آن را کدنویسی کنید.

Complete Cross-Validation

CV کامل کم استفاده ترین تکنیک CV است. ایده کلی این است که ما یک عدد k - طول مجموعه آموزشی را انتخاب می کنیم و روی هر تقسیم ممکن شامل k نمونه در مجموعه آموزشی سنجی می کنیم.

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

به همین دلیل است که از CV کامل یا در تحقیقات نظری استفاده می شود و یا در صورت وجود فرمول مؤثری که به حداقل رساندن محاسبات کمک می کند.

الگوریتم اعتبار سنجی متقاطع کامل:

1- یک عدد k را انتخاب کنید ( طول مجموعه آموزشی).

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

3- روی مجموعه آموزشی تمرین کنید.

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

5- نتیجه اعتبارسنجی را ذخیره کنید.

6- مراحل 2 تا 5 را به اندازه ترکیب n از k تکرار کنید.

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

اعتبار سنجی متقابل در یادگیری ماشینی

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

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

شایان ذکر است که اگر می‌خواهید مدل را اعتبار سنجی متقابل کنید، همیشه باید دفترچه راهنمای مدل را بررسی کنید زیرا برخی از الگوریتم‌های ML، به عنوان مثال، CatBoost روش‌های CV داخلی خود را دارند. ممکن است آنها را مربوط به وظیفه ML خود بیابید و به جای روش های داخلی sklearn از آنها استفاده کنید.

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

اعتبار متقابل در یادگیری عمیق

اعتبار سنجی متقابل در یادگیری عمیق (DL ) ممکن است کمی مشکل باشد زیرا اکثر تکنیک های CV حداقل چند بار نیاز به آموزش مدل دارند.

در یادگیری عمیق، معمولاً به دلیل هزینه ‌های مرتبط با آموزش مدل ‌های مختلف، از CV اجتناب می‌کنید. به جای انجام k-Fold یا سایر تکنیک های CV، ممکن است از یک زیرمجموعه تصادفی از داده های آموزشی خود به عنوان hold-out برای اهداف اعتبار سنجی استفاده کنید.

به عنوان مثال، کتابخانه یادگیری عمیق Keras به شما امکان می دهد یکی از دو پارامتر را برای تابع fit که آموزش را انجام می دهد، ارسال کنید.

validation_split: درصدی از داده هایی که باید برای اعتبار سنجی hold-out شوند.

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

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

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

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

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

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

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

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

به عنوان مثال، اشتباه منطقی هنگام تقسیم مجموعه داده بسیار آسان است که ممکن است منجر به یک CVغیرقابل اعتماد شود.

ممکن است نکاتی را بیابید که باید هنگام اعتبارسنجی متقابل یک مدل همچنانکه در زیر آمده مد نظر داشته باشید:

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

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

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

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

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

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

نتایج نهایی

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

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

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

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


منبع: https://neptune.ai/blog/cross-validation-in-machine-learning-how-to-do-it-right

یادگیری ماشیناعتبارسنجی متقابلcross validation
شاید از این پست‌ها خوشتان بیاید