3 مهر 1402
تهران، خیابان آزادی، تقاطع قریب
یادگیری ماشین

مقدمه‌ای بر k-fold Cross-Validation

مقدمه‌ای بر k-fold Cross-Validation

Cross-Validation یک متد آماری است که برای تخمین مهارت مدل‌های یادگیری ماشین استفاده می‌شود.

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

در این آموزش، مقدمه‌ای اجمالی بر روش k-fold Cross-Validation برای تخمین مهارت مدل‌های یادگیری ماشین، آورده شده است.

پس از تکمیل این آموزش، مهارت‌های زیر را خواهید آموخت:

  • k-fold Cross-Validation رویه‌ای است که برای تخمین مهارت مدل در داده‌های جدید استفاده می‌شود.
  • تاکتیک‌های رایجی وجود دارند که می‌توانید از آن‌ها برای انتخاب مقدار k برای مجموعه داده‌ خود استفاده کنید.
  • انواع متداولی از Cross-Validation وجود دارند که در scikit-learn موجود است. مانند stratified و repeated . (طبقه‌بندی شده و تکرار شده)

بیایید شروع کنیم:

k-fold Cross-Validation

بررسی اجمالی سرفصل‌های آموزش

این آموزش به 5 قسمت زیر تقسیم شده است:

  • k-Fold Cross-Validation
  • پیکربندی k
  • نمونه کار شده
  • Cross-Validation API
  • تغییرات در Cross-Validation

Cross-Validation

Cross-Validation یک روش نمونه‌گیری مجدد است که برای ارزیابی مدل‌های یادگیری ماشین بر روی یک نمونه داده محدود استفاده می‌شود.

این روش دارای یک پارامتر واحد به نام k است که به تعداد گروه‌هایی اشاره دارد که یک نمونه داده معین باید به آنها تقسیم شود. به این ترتیب، این روش اغلب Cross-Validation از نوع k-fold نامیده می شود. هنگامی که یک مقدار خاص برای k انتخاب می‌شود، ممکن است به جای k در مرجع مدل استفاده شود، مانند k=10 که تبدیل به 10-fold Cross-Validation می‌شود.

k-Fold Cross-Validation

Cross-Validation اساساً در یادگیری ماشین کاربردی برای تخمین مهارت یک مدل یادگیری ماشینی بر روی داده‌های دیده نشده استفاده می‌شود. یعنی استفاده از یک نمونه محدود به منظور تخمین نحوه عملکرد کلی مدل، زمانی که برای پیش‌بینی داده‌های استفاده نشده در طول آموزش مدل استفاده می‌شود.

این یک روش محبوب است زیرا درک آن ساده است و نتایج آن به طور کلی سوگیری و خوش‌بینی کمتری نسبت به روش‌های دیگر دارد. مانند یک تقسیم train/test ساده. 

روال کلی این متد به شرح زیر است:

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

برای هر گروه منحصر به فرد:

  • گروه را به‌عنوان مجموعه داده‌های نگهدارنده یا آزمایشی در نظر بگیرید.
  • گروه‌های باقی مانده را به عنوان یک مجموعه داده آموزشی در نظر بگیرید.
  • یک مدل را در مجموعه آموزشی قرار دهید و آن را در مجموعه تست ارزیابی کنید.
  • امتیاز ارزیابی را حفظ کنید و مدل را کنار بگذارید.
  • مهارت مدل را با استفاده از نمونه نمرات ارزیابی مدل خلاصه کنید.

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

k-Fold

این رویکرد شامل تقسیم تصادفی مجموعه مشاهدات به k گروه یا fold هایی با اندازه تقریبا مساوی است. اولین fold به‌عنوان یک مجموعه اعتبارسنجی درنظر گرفته می‌شود، و این روش روی fold های k − 1 باقی‌مانده مناسب است.

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

علی‌رغم بهترین تلاش‌هایی که متدولوژیست‌های آماری انجام داده‌اند، کاربران اغلب با نگاه کردن ناخواسته به داده‌های تست، نتایج خود را باطل می‌کنند.

نتایج یک آزمون Cross-Validation k-fold اغلب با میانگین نمرات مهارت مدل خلاصه می شود. همچنین تمرین خوبی است که معیاری برای واریانس نمرات مهارت، مانند انحراف معیار یا خطای استاندارد لحاظ شود.

پیکربندی k

مقدار k باید برای نمونه داده شما با دقت انتخاب شود.

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

سه تاکتیک رایج برای انتخاب مقدار k به شرح زیر است:

Representative

مقدار k به گونه‌ای انتخاب می‌شود که هر گروه train/test از نمونه داده‌ها به اندازه کافی بزرگ باشد که از نظر آماری معرف مجموعه داده وسیع‌تر باشد.

k=10: مقدار k روی 10 ثابت شده است، مقداری که از طریق آزمایش به طور کلی به یک برآورد مهارت مدل با بایاس کم و واریانس متوسط می‌انجامد.

k=n: مقدار k بر روی n ثابت می شود، جایی که n اندازه مجموعه داده است تا به هر نمونه آزمایشی فرصتی برای استفاده از مجموعه داده نگهدارنده را بدهد. به این رویکرد leave-one-out Cross-Validation می‌گویند.

انتخاب k معمولاً 5 یا 10 است، اما این وحی منزل نیست. با بزرگ‌تر شدن k، تفاوت در اندازه بین مجموعه آموزشی و زیر مجموعه‌های نمونه برداری مجدد کمتر می‌شود. با کاهش این تفاوت، سوگیری تکنیک کوچکتر می‌شود.

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

به طور خلاصه، یک تبادل bias-variance مرتبط با انتخاب k در k-fold Cross-Validation وجود دارد. به طور معمول و با توجه به این ملاحظات، k-fold Cross-Validation با استفاده از k = 5 یا k = 10 انجام می‌شود، زیرا این مقادیر به‌طور تجربی نشان داده شده‌اند و تخمین‌هایی از میزان خطای آزمون ارائه می‌کنند که نه از تعصب بیش از حد بالا و نه از واریانس بسیار بالا رنج نمی‌برند.

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

نمونه کار شده از k-fold

برای مشخص کردن روش Cross-Validation، اجازه دهید یک مثال کار شده را ببینیم.

تصور کنید ما یک نمونه داده با 6 Observations داریم:

				
					[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
				
			

اولین قدم این است که مقداری را برای k انتخاب کنید تا تعداد fold های مورد استفاده برای تقسیم داده‌ها را تعیین کنید. در اینجا از مقدار k=3 استفاده خواهیم کرد. به این معنی که داده‌ها را به هم می‌زنیم و سپس داده‌ها را به 3 گروه تقسیم می‌کنیم. از آنجا که ما 6 Observations داریم، هر گروه به تعداد مساوی 2 Observations خواهد داشت.

مثلا:

				
					Fold1: [0.5, 0.2]
Fold2: [0.1, 0.3]
Fold3: [0.4, 0.6]

				
			

سپس می‌توانیم از نمونه استفاده کنیم، مانند ارزیابی مهارت الگوریتم یادگیری ماشین.

سه مدل آموزش داده می‌شوند و با هر fold ، فرصتی برای تبدیل شدن به مجموعه‌ی آزمایشی ارائه می‌شود.

مثلا:

Model1: آموزش روی Fold1 + Fold2، تست شده روی Fold3

Model2: آموزش روی Fold2 + Fold3، تست شده روی Fold1

Model3: آموزش روی Fold1 + Fold3، تست شده روی Fold2

سپس مدل‌ها پس از ارزیابی، به دلیل اینکه به هدف خود رسیده‌اند، کنار گذاشته می‌شوند.

نمرات مهارت برای هر مدل جمع آوری شده و برای استفاده خلاصه می شود.

Cross-Validation API

ما نیازی به اجرای k-fold Cross-Validation به صورت دستی نداریم. کتابخانه scikit-learn نوعی پیاده‌سازی را ارائه می‌دهد که یک نمونه داده از پیش داده شده را تقسیم می‌کند.

می توان از کلاس Sicit-learn KFold() استفاده کرد. این کلاس به عنوان آرگومان تعداد تقسیم‌ها را در نظر می‌گیرد، خواه این‌که نمونه را به هم بزنیم یا نه، و خواه این‌که برای تولیدکننده اعداد شبه تصادفی استفاده شده قبل از مخلوط کردن سیدبندی کنیم یا نه.

به عنوان مثال، می‌توانیم نمونه‌ای ایجاد کنیم که یک مجموعه داده را به 3 تا تقسیم می‌کند، قبل از تقسیم به هم می‌ریزد، و از مقدار 1 برای تولید کننده اعداد شبه تصادفی استفاده می‌کند.

				
					kfold = KFold(3, True, 1)
				
			

سپس تابع split() می‌تواند در کلاسی که نمونه داده به عنوان آرگومان ارائه می‌شود فراخوانی شود. این تقسیم که مکرراً فراخوانی می شود، هر گروه از آموزش‌ها و مجموعه‌های آزمایشی را برمی‌گرداند. به طور خاص، array هایی حاوی index ‌ها به نمونه داده‌های اصلی Observation ها بازگردانده می‌شوند تا برای مجموعه‌های آموزش و آزمایش در هر تکرار استفاده شوند.

تقسیم‌بندی شاخص‌ها با استفاده از نمونه K-Fold

برای مثال، می‌توانیم تقسیم‌بندی شاخص‌ها را برای یک نمونه داده با استفاده از نمونه KFold ایجاد شده به صورت زیر برشماریم:

				
					# enumerate splits
for train, test in kfold.split(data):
	print('train: %s, test: %s' % (train, test))

				
			

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

				
					# scikit-learn k-fold Cross-Validation
from numpy import array
from sklearn.model_selection import KFold
# data sample
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# prepare cross validation
kfold = KFold(3, True, 1)
# enumerate splits
for train, test in kfold.split(data):
	print('train: %s, test: %s' % (data[train], data[test]))

				
			

ران شدن مثال، Observation های خاص انتخاب شده برای هر آموزش و مجموعه آزمایشی را چاپ می کند. شاخص ها مستقیماً روی array داده‌های اصلی برای بازیابی مقادیر مشاهده استفاده می‌شوند.

				
					train: [0.1 0.4 0.5 0.6], test: [0.2 0.3]
train: [0.2 0.3 0.4 0.6], test: [0.1 0.5]
train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]

				
			

به طور مفید، پیاده‌سازی Cross-Validation k-fold در scikit-learn به عنوان یک عملیات جزء در روش‌های گسترده‌تر، مانند هایپرپارامترهای مدل جستجوی شبکه‌ای و امتیازدهی یک مدل بر روی یک مجموعه داده ارائه می‌شود.

با این وجود، کلاس KFold را می توان مستقیماً به منظور تقسیم یک مجموعه داده قبل از مدل سازی به گونه‌ای استفاده کرد که همه مدل‌ها از تقسیم داده‌های یکسان استفاده کنند. این به ویژه اگر با نمونه داده‌های بسیار بزرگ کار می‌کنید، مفید است. استفاده از تقسیم‌بندی‌های مشابه در الگوریتم‌ها می‌تواند مزایایی برای آزمایش‌های آماری داشته باشد که ممکن است بخواهید بعداً روی داده‌ها انجام دهید.

Variation ‌ها در Cross-Validation

Variation های متعددی در متد k-fold cross validation وجود دارد.

انواع رایج Variation ها به شرح زیر است:

تقسیم Train/Test

 اگر خیلی افراط کنیم، k ممکن است روی 2 تنظیم شود (نه 1) به طوری که یک تقسیم Train/Test واحد برای ارزیابی مدل ایجاد شود.

LOOCV

 با نوعی دیگر از افراط، k ممکن است به تعداد کل مشاهدات در مجموعه داده تنظیم شود، به طوری که به هر مشاهده فرصت داده شود تا خارج از مجموعه داده باشد. به این کار leave-one-out Cross-Validation یا به اختصار LOOCV می گویند.

طبقه بندی شده

 تقسیم داده‌ها به fold ها ممکن است با معیارهایی مانند اطمینان از اینکه هر fold دارای همان نسبت Observation ها با یک مقدار طبقه بندی معین است، مانند مقدار نتیجه کلاس، کنترل می‌شود. این Cross-Validation طبقه‌بندی شده نامیده می‌شود.

تکرار شده

 اینجا جایی است که متد k-fold Cross-Validation به میزان n بار تکرار می‌شود، که مهمتر از همه، نمونه داده قبل از هر تکرار به هم ریخته می‌شود، که منجر به تقسیم متفاوت نمونه می‌شود.

تو در تو

اینجا جایی است که Cross-Validation k-fold در هر fold  از Cross-Validation انجام می‌شود. این کار اغلب برای انجام تنظیم هایپرپارامتر در طول ارزیابی مدل اتفاق می‌افتد. به این حالت nested Cross-Validation یا double Cross-Validation می‌گویند.

افزونه‌های آموزشی k-fold

این بخش از آموزش، مواردی را برای آموزش تکمیلی نام برده است که ممکن است بخواهید بررسی کنید.

  • 3 مقاله تحقیقاتی در زمینه یادگیری ماشین را پیدا کنید که از مقدارِ 10 برای Cross-Validation k-fold استفاده می‌کنند.
  • تابع خودتان را بنویسید تا یک نمونه داده را با استفاده k-fold Cross-Validation تقسیم کنید.
  • برای نشان دادن هر یک از انواع اصلی Cross-Validation که توسط scikit-learn پشتیبانی می‌شوند، مثال‌هایی ایجاد کنید.

کتاب‌هایی که درباره Cross-Validation مطالبی دارند

Applied Predictive Modeling, 2013.

An Introduction to Statistical Learning, 2013.

Artificial Intelligence: A Modern Approach (3rd Edition), 2009.

API

sklearn.model_selection.KFold() API

sklearn.model_selection: Model Selection API

مقالات درباره Cross-Validation

Resampling (statistics) on Wikipedia

Cross-Validation (statistics) on Wikipedia

خلاصه

در این آموزش، مقدمه ای اجمالی بر متد k-fold Cross-Validation برای تخمین مهارت مدل‌های یادگیری ماشین آموختید.

و به طور اخص، شما موارد زیر را یاد گرفتید:

Cross-Validation k-fold روشی است که برای تخمین مهارت مدل در داده‌های جدید استفاده می‌شود.

تاکتیک‌های رایجی وجود دارد که می‌توانید از آنها برای انتخاب مقدار k برای مجموعه داده خود استفاده کنید.

Cross-Validation انواع مختلفی مانند طبقه بندی شده و تکرار شده دارد که در scikit-learn موجود است.

اگر سؤال دیگری دارید، آن‌ها را در قسمت نظرات بپرسید و من تمام تلاش خود را می کنم تا پاسخگوی آن‌ها باشم.

منبع: machinelearningmastery  نویسنده: جیسون براون لی

Leave feedback about this

  • کیفیت
  • قیمت
  • خدمات

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video
X