اعتبار سنجی متقابل در یادگیری ماشینی:
چگونه آن را به درستی انجام دهیم؟
در یادگیری ماشینی (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
· Cross-Validation در یادگیری ماشینی: sklearn، CatBoost
· Cross-Validation در یادگیری عمیق: Keras، PyTorch، MxNet
· بهترین شیوه ها و نکات: سری های زمانی، داده های پزشکی و مالی، تصاویر.
Cross-Validation چیست؟
اعتبار سنجی متقابل تکنیکی برای ارزیابی یک مدل یادگیری ماشین و آزمایش عملکرد آن است. CV معمولاً در کارهای کاربردی ML استفاده می شود. این به مقایسه و انتخاب یک مدل مناسب برای مسئله مدلسازی پیشبینیکننده خاص کمک میکند.
درک CV آسان است، پیادهسازی آن آسان است و نسبت به سایر روشهای مورد استفاده برای شمارش امتیازهای کارایی مدل، سوگیری کمتری دارد. همه اینها اعتبارسنجی متقابل را به ابزاری قدرتمند برای انتخاب بهترین مدل برای کار خاص تبدیل می کند.
تکنیک های مختلفی وجود دارد که ممکن است برای اعتبارسنجی متقابل یک مدل استفاده شود. با این حال، همه آنها یک الگوریتم مشابه دارند:
1- مجموعه داده را به دو بخش تقسیم کنید: یکی برای آموزش، دیگری برای آزمایش
2- مدل را روی مجموعه آموزشی آموزش دهید
3- اعتبار مدل را در مجموعه آزمایشی تأیید کنید
4- مرحله 1-3 را چند بار تکرار کنید. این عدد به روش رزومه ای که استفاده می کنید بستگی دارد
5- همانطور که می دانید، تکنیک های 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 import train_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 روش جدیدی را برای تقسیم مجموعه داده معرفی می کند که به غلبه بر "تست فقط یک بار گلوگاه(test only once bottleneck )" کمک می کند.
الگوریتم تکنیک k-Fold:
1- تعدادی چین را از –K انتخاب کنید . معمولاً k 5یا 10 است، اما میتوانید هر عددی را انتخاب کنید که کمتر از طول مجموعه داده باشد.
2- در صورت امکان مجموعه داده را به k قسمت مساوی تقسیم کنید (به آنها چین گفته می شود)
3- Fold K-1 را انتخاب کنید که کدام مجموعه آموزشی باشد. Fold باقیمانده مجموعه تست خواهد بود
4- مدل را روی مجموعه آموزشی آموزش دهید. در هر تکرار Cross-Validation ، باید یک مدل جدید مستقل از مدل آموزش داده شده در تکرار قبلی آموزش دهید.
5- در مجموعه آزمایشی اعتبار سنجی کنید
6- نتیجه اعتبار سنجی را ذخیره کنید
7- مراحل 3 تا 6 را K بار تکرار کنید. هر بار از چین باقی مانده به عنوان مجموعه تست استفاده کنید. در پایان، شما باید مدل را روی هر فولد که دارید اعتبارسنجی کرده باشید.
8- برای به دست آوردن امتیاز نهایی، میانگین نتایجی که در مرحله 6 به دست آوردید.
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("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]
به طور کلی همیشه بهتر است به جای Hold-out از تکنیک k-Fold استفاده کنید. از آنجایی که آموزش و آزمایش بر روی چندین بخش مختلف مجموعه داده انجام می شود، به صورت مو به مو، مقایسه k-Fold نتیجه پایدارتر و قابل اعتمادتری به دست می دهد. اگر تعداد Fold ها را برای آزمایش مدل بر روی بسیاری از زیر مجموعههای مختلف مختلف افزایش دهیم، میتوانیم امتیاز کلی را قویتر کنیم.
با این حال، روش k-Fold یک نقطه ضعف دارد. افزایش k منجر به آموزش مدل های بیشتر می شود و فرآیند آموزش ممکن است واقعاً گران و زمان بر باشد.
بزرگترین مزیت تأیید اعتبار متقاطع Leave-one-out این است که داده های زیادی را هدر نمی دهد. ما فقط از یک نمونه از کل مجموعه داده به عنوان یک مجموعه آزمایشی استفاده می کنیم، در حالی که بقیه مجموعه آموزشی است. اما وقتی با k-Fold CV مقایسه میشود، LOOCV نیاز به ساخت n مدل به جای k مدل دارد، وقتی میدانیم که n که مخفف تعداد نمونههای
مجموعه داده بسیار بیشتر از k است. این بدان معناست که LOOCV از نظر محاسباتی گرانتر ازk-Fold است، ممکن است زمان زیادی برای اعتبارسنجی متقابل مدل با استفاده ازLOOCV نیاز باشد.
بنابراین، جامعه علوم داده یک قاعده کلی بر اساس شواهد تجربی و تحقیقات مختلف دارد که نشان میدهد Cross-Validation 5 یا 10 برابر باید بر LOOCV ترجیح داده شود.
2- باقیمانده n-p نمونه مجموعه آموزشی خواهد بود
3- مدل را روی مجموعه آموزشی آموزش دهید. در هر تکرار، یک مدل جدید باید آموزش داده شود
4- در مجموعه آزمایشی اعتبار سنجی کنید
5- نتیجه اعتبار سنجی را ذخیره کنید
6- مراحل را Cpn 5-2 بار تکرار کنید
7- برای به دست آوردن امتیاز نهایی، میانگین نتایجی که در مرحله 5 به دست آوردید
میتوانید Leave-p-out CV را با استفاده از sklearn – sklearn.model_selection.LeavePOut انجام دهید.
import numpy as np
from sklearn.model_selection import LeavePOut
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 in lpo.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]
تمام موارد ذکر شده در بالا در مورد K-Fold CV برای تکنیک Stratified k-Fold صادق است. هنگام انتخاب بین روش های مختلف CV، مطمئن شوید که از روش مناسب استفاده می کنید. به عنوان مثال، ممکن است فکر کنید که مدل شما عملکرد بدی دارد، صرفاً به این دلیل که از K-Fold CV برای اعتبارسنجی مدلی استفاده میکنید که بر روی مجموعه داده با عدم تعادل کلاس آموزش داده شده است. برای جلوگیری از آن، همیشه باید یک تجزیه و تحلیل داده های اکتشافی مناسب روی داده های خود انجام دهید.
1. https://www.geeksforgeeks.org/cross-validation-machine-learning/
2. https://machinelearningmastery.com/k-fold-cross-validation/
3. https://towardsdatascience.com/cross-validation-in-machine-learning-72924a69872f
4. https://towardsdatascience.com/why-and-how-to-do-cross-validation-for-machine-learning-d5bd7e60c189
5. https://scikit-learn.org/stable/modules/cross_validation.html