از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
Scikit-Learn’s train_test_split() – مجموعه های آموزش، تست و اعتبار سنجی
سرفصلهای مطلب
معرفی
Scikit-Learn یکی از پرکاربردترین کتابخانه های یادگیری ماشین در پایتون است. بهینه و کارآمد است – و API سطح بالای آن ساده و آسان برای استفاده است.
Scikit-Learn ابزارها و روشهای متعددی دارد که پیشپردازش، ارزیابی و سایر فرآیندهای پر زحمت را به آسانی فراخوانی یک روش و تقسیم دادهها بین آموزش و آزمایش کردن مجموعه نیز از این قاعده مستثنی نیست.
به طور کلی، قاعده کلی برای تقسیم داده ها 80/20 است – جایی که 80٪ از داده ها برای آموزش یک مدل، در حالی که 20٪ برای آزمایش آن استفاده می شود. این بستگی دارد روی مجموعه داده ای که با آن کار می کنید، اما تقسیم 80/20 بسیار رایج است و شما را به خوبی از طریق اکثر مجموعه داده ها عبور می دهد.
در این راهنما – ما نگاهی به روش استفاده از آن خواهیم انداخت split_train_test()
روش در Scikit-Learn، و روش پیکربندی پارامترها به طوری که شما بر تقسیم کردن کنترل داشته باشید. process.
نصب Scikit-Learn
با فرض اینکه قبلاً نصب نشده باشد – Scikit-Learn را می توان به راحتی از طریق نصب کرد pip
:
$ pip install scikit-learn
پس از نصب، می توانید import خود کتابخانه از طریق:
import sklearn
در بیشتر موارد، مردم از وارد کردن کل کتابخانه اجتناب میکنند، زیرا بسیار وسیع است و import کلاس ها یا ماژول های خاصی که آنها به طور خاص از آنها استفاده خواهند کرد.
توجه داشته باشید: این به این معنی است که مردم دارای وضعیت سنگینی هستند import هنگام استفاده از Scikit-Learn لیست کنید.
اهمیت مجموعه های آموزشی و آزمایشی
متداولترین رویه هنگام آموزش یک مدل (پایه) در یادگیری ماشین از همان طرح کلی پیروی میکند:
- اکتساب و پردازش داده هایی که در یک مدل قرار می دهیم.
Scikit-Learn مجموعه داده های مختلفی دارد که باید برای آموزش مدل بارگذاری و استفاده شود (عنبیه، دیابت، انگشتان …)، عمدتاً برای محک زدن/یادگیری.
- تقسیم مجموعه ها به مجموعه های آموزشی و آزمایشی
- ساخت مدل و تعریف معماری
- تدوین مدل
- آموزش مدل
- بررسی نتایج
این مجموعه آموزشی زیرمجموعه ای از کل مجموعه داده است و ما معمولاً مدلی را آموزش نمی دهیم روی را تمامیت از داده ها در مدلهای غیر مولد، یک مجموعه آموزشی معمولاً شامل حدود 80 درصد از دادههای مجموعه داده اصلی است. همانطور که از نام آن پیداست برای آموزش مدل استفاده می شود. به این روش نیز گفته می شود برازش مدل.
اگرچه استثناهایی برای این قاعده وجود دارد.
به عنوان مثال، هنگام آموزش شبکه های متخاصم مولد (GAN) که تصاویر را تولید می کند – چطور؟ تست نتایج؟ آنها در برخی موارد بسیار ذهنی هستند، همانطور که نشان می دهند جدید نمونه هایی که قبلا دیده نشده بود که در اکثر مدلهای مولد، حداقل در حال حاضر، معمولاً به یک انسان نیاز است تا خروجیها را قضاوت کند، در این موارد، یک تست مجموعه کاملا زائد است
علاوه بر این، گاهی اوقات برای آزمایش بیشتر یا کمتر از 20٪ نیاز دارید، و اگر از تکنیک هایی مانند اعتبار سنجی متقابل، ممکن است بخواهید داده های تست کمی کمتری داشته باشید تا بیش از حد از داده های آموزشی “برداشتن” نشوید. به عنوان مثال، اگر شما 1.000.000 نمونه در یک مجموعه داده دارید، تنها 5٪ برای یک مجموعه آزمایشی به 50.000 نمونه می رسد، که به احتمال زیاد است. بیش از اندازه کافی برای هر مدلی که باید آزمایش شود روی.
این مجموعه تست زیرمجموعه ای از کل مجموعه داده است و برای ارزیابی مدل و بررسی میزان یادگیری آن از مجموعه آموزشی استفاده می شود.
مدل نباید قبل از ارزیابی با هم تعامل داشته باشد یا مجموعه تست را ببیند. داده ها باید هنگام اولین ارزیابی ناشناخته باشند، در غیر این صورت اینطور نیست واقعا تست مدل
در مورد مجموعه های اعتبار سنجی چطور؟
مجموعههای اعتبارسنجی یک دیدگاه رایج در مدلهای حرفهای و آکادمیک هستند. مجموعههای اعتبارسنجی از مجموعه آموزشی خارج میشوند و استفاده میشوند در طول آموزش برای تایید دقت مدل تقریبا.
مجموعه تست کاملاً قطع می شود تا زمانی که آموزش مدل به پایان برسد – اما مجموعه اعتبارسنجی برای اعتبارسنجی آن استفاده می شود در حین آموزش.
توجه داشته باشید: مجموعه اعتبار سنجی استفاده نمی شود برای آموزش، و مدل آموزش نمی دهد روی داده. این فقط دوران فعلی را تأیید می کند. این راه – آن غیر مستقیم قطارها روی داده ها، همانطور که بر باورهای قبلی آن تأثیر می گذارد، بنابراین مجموعه اعتبار سنجی نمی تواند برای آزمایش استفاده شود.
مشابه این که اگر نادرست بودن دانش خود را بشنوید – حتی اگر دلیل آن را ندانید، بیشتر در مورد دانش خود یاد خواهید گرفت. به همین دلیل است که مجموعه های اعتبار سنجی تقریبی دقت یک مدل و مجموعههای آزمایشی، حتی زمانی که از یک مجموعه اعتبارسنجی استفاده میشود، همچنان مورد نیاز است.
آنها به تقریب عملکرد واقعی یک مدل در طول تمرین کمک می کنند، بنابراین بدون اینکه متوجه شوید پس از آزمایش آن از طریق یک مجموعه آزمایشی، با یک مدل اضافه برازش توهمی مواجه نشوید. همچنین می توانید از مجموعه های اعتبارسنجی برای تنظیم مدل ها و ارزیابی تقریباً توانایی آنها استفاده کنید بدون آنها را در معرض یک مجموعه آزمایش قرار دهید.
فریمورک های Deep Learning مانند Keras می توانند a val_accuracy
علاوه بر تمرینات منظم شما accuracy
به عنوان نشانه خوبی از تناسب بیش از حد. اگر آنها شروع به واگرایی کنند، مدل شما در طول تمرین بیش از حد مناسب است، و لازم نیست زمانی که آنها به اندازه کافی واگرا می شوند، زمان بیشتری را برای آموزش آن تلف کنید. علاوه بر این، تماس های پاسخ مانند EarlyStopping
می توان برای توقف خودکار آموزش مدل استفاده کرد اگر val_accuracy
بعد از آن بهبود نمی یابد n
دوره ها، حتی اگر accuracy
در حال افزایش است.
ایجاد مجموعه اعتبارسنجی آسان است.
شما می توانید به معنای واقعی کلمه فقط آن را اجرا کنید train_test_split()
روش روی را مجموعه آموزشی، که قبلا توسط گروه تقسیم شده بود train_test_split()
روش و یک مجموعه اعتبارسنجی از آن استخراج کنید. از طرف دیگر، می توانید به صورت دستی یک مجموعه اعتبار سنجی ایجاد کنید.
اندازه مجموعه اعتبار سنجی معمولاً مشابه یک مجموعه آزمایشی تقسیم می شود – هر جایی بین 10-20٪ از مجموعه آموزشی معمولی است. برای مجموعه دادههای بزرگ، میتوانید بسیار کمتر از این کار کنید، اما برای مجموعه دادههای کوچک، میتوانید مقدار زیادی از دادهها را حذف کنید، و این کار را برای مدل سخت میکند که دادهها را در مجموعه آموزشی قرار دهد.
در بخشهای بعدی، یک را نیز حذف میکنیم مجموعه اعتبار سنجی با استفاده از همان
train_test_split()
روش.
ماژول مجموعه داده های Scikit-Learn
چندین مجموعه داده تمیز و محبوب به صورت داخلی در Scikit-Learn موجود است که معمولاً در طول یادگیری و برای مدلهای محک استفاده میشود. روی کارهای ساده
اگر تا به حال منابعی در مورد یادگیری ماشین در پایتون خوانده اید – احتمالاً برخی از این مجموعه داده های محبوب را دیده اید:
- عنبیه – مجموعه ای از 3 کلاس (گل)، با 50 نمونه در هر کلاس، برای طبقه بندی استفاده می شود.
- دیابت – مجموعه ای با مجموع 442 نمونه، برای رگرسیون استفاده می شود.
- ارقام – مجموعه ای از 10 کلاس (رقم دست نویس)، با 180 نمونه در هر کلاس، برای طبقه بندی استفاده می شود.
- شراب – مجموعه ای از 3 کلاس (شراب)، با مجموع 178 نمونه، برای طبقه بندی استفاده می شود.
هر یک از این مجموعه داده ها را می توان از طریق بارگذاری کرد datasets
ماژول با عملکرد مربوطه خود:
from sklearn import datasets
X_iris, y_iris = datasets.load_iris(return_X_y=True)
X_diabetes, y_diabetes = datasets.load_diabetes(return_X_y=True)
X_digits, y_digits = datasets.load_digits(return_X_y=True)
X_wine, y_wine = datasets.load_wine(return_X_y=True)
در عوض، می توانید به جای آن توابع خاص را بارگیری کنید:
from sklearn.datasets import load_iris
from sklearn.datasets import load_diabetes
from sklearn.datasets import load_digits
from sklearn.datasets import load_wine
X_iris, y_iris = load_iris(return_X_y=True)
X_diabetes, y_diabetes = load_diabetes(return_X_y=True)
X_digits, y_digits = load_digits(return_X_y=True)
X_wine, y_wine = load_wine(return_X_y=True)
به طور پیش فرض، این روش ها a را برمی گرداند Bunch
شی، حاوی داده ها و اهداف (داده ها و کلاس های آنها)، با این حال، اگر شما را تنظیم کنید return_X_y
استدلال به True
، یک تاپیک از (data, targets)
برگردانده می شود، نشان دهنده داده هایی است که شما آموزش می دهید روی و کلاسهای هدفی که میخواهید مدل طبقهبندیکننده/رگرسیون شما به آن برسد.
تقسیم یک مجموعه داده با train_test_split()
این train_test_split()
روش ساکن در sklearn.model_selection
مدول:
from sklearn.model_selection import train_test_split
چندین آرگومان وجود دارد که می توانیم در حین کار با این روش تنظیم کنیم – و پیش فرض بسیار معقول است و تقسیم 75/25 را انجام می دهد. در عمل، همه مقادیر پیشفرض Scikit-Learn نسبتاً معقول هستند و بهخوبی مورد استفاده قرار میگیرند اکثر وظایف با این حال، شایان ذکر است که این پیشفرضها چه هستند، در مواردی که به خوبی کار نمیکنند.
دو استدلال اصلی هستند train_size
و test_size
، که در آن مقادیر آنها بین 0
و 1
و مجموع آنها باید باشد 1
. مقادیر آنها نشان دهنده درصد نسبت مجموعه داده است، بنابراین حتی اگر فقط یکی را تعریف کنید، مانند train_size
، test_size
برابر است با 1 - train_size
، و بالعکس.
تنظیم کردن اندازه_ قطار و اندازه_تست استدلال ها
این رایج ترین رویکرد است که ما را با 4 زیر مجموعه می گذارد – X_train
، X_test
، y_train
و y_test
:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
بدون تنظیم هم train_size
یا test_size
مقادیر پیشفرض وارد میشوند و مقدار را تنظیم میکنند test_size
به 0.25
و مکمل (0.75
) train_size
:
(112, 4)
(38, 4)
(112,)
(38,)
همانطور که می بینید، مجموعه های قطار و تست 75٪/25٪ تقسیم می شوند، زیرا 112 نمونه در X_train
مجموعه، و 38 نمونه در X_test
تنظیم.
برخی دیگر از نسبت های تقسیم شده عبارتند از: 80%/20% (بسیار رایج)، 67%/33% و به ندرت 50%/50%.
تنظیم هر یک از اینها به تعریف یک یا هر دو آرگومان موجود در آن خلاصه می شود train_test_split()
روش:
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
هر سه این تقسیمبندی منجر به تقسیم یکسانی از موارد زیر میشود:
(120, 4)
(30, 4)
(120,)
(30,)
ایجاد مجموعه اعتبارسنجی با train_test_split()
مجموعه های اعتبار سنجی واقعاً در طول آموزش مفید هستند و زندگی شما را به عنوان یک دانشمند داده به طور قابل توجهی آسان تر می کنند.
در صورت امکان، سعی کنید از یک مجموعه اعتبار سنجی استفاده کنید.
هیچ تابع داخلی برای استخراج یک مجموعه اعتبار سنجی از یک مجموعه آموزشی وجود ندارد، با این حال، زیرا این به تقسیم آن مانند قبل خلاصه می شود – چرا از همان استفاده نکنید train_test_split()
روش؟
بیایید دوباره از آن استفاده کنیم تا به دستمان برسد روی یک مجموعه اعتبار سنجی، که 10٪ از داده ها را از مجموعه آموزشی می گیرد:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, train_size=0.9)
print(X_train.shape)
print(X_test.shape)
print(X_valid.shape)
این یک تقسیم 70٪ -20٪ -10٪ ایجاد نمی کند، زیرا ما در حال تقسیم 10٪ از قبلا تقسیم شده است X_train
بنابراین ما در واقع با یک تقسیم 72-20-8٪ در اینجا به پایان می رسیم:
(108, 4)
(30, 4)
(12, 4)
برای محاسبه این، شما می توانید هر دو به صورت دستی با انتظار این، یک عدد متفاوت تنظیم کنید، یا شما می توانید نسبت های خود را از قبل تعریف کنید و یک تقسیم به روز را برای ارجاع به آن محاسبه کنید اصلی اندازه، به جای اندازه از قبل کوتاه شده است.
برای تقسیم کردن داده ها به یک مجموعه آموزشی، آزمایشی و اعتبارسنجی – باید آن را تنظیم کنیم test_size
بحث و جدل روی دومین فراخوانی تابع به:
$$
test_s = اعتبار_r/(train_r+test_r)
$$
بیایید مجموعه داده دیابت را بارگذاری کنیم، زیرا نمونه های بیشتری دارد (به دلیل گرد کردن، مجموعه داده های کوچک اغلب حتی با نسبت های یکسان، تقسیم های کمی متفاوت ایجاد می کنند):
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
X, y = load_diabetes(return_X_y=True)
print(X.shape)
(442, 10)
بگوییم که ما به دنبال تقسیم 80٪/10٪/10٪ هستیم – ما می خواهیم داشته باشیم 352
، 45
و 45
به ترتیب موارد بیایید این سهمیه ها را تعریف کنیم و مجموعه داده را به یک مجموعه آموزشی، آزمایشی و اعتبار سنجی تقسیم کنیم train_test_split()
تابع:
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
train_ratio = 0.80
test_ratio = 0.10
validation_ratio = 0.10
X, y = load_diabetes(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_ratio)
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=validation_ratio/(train_ratio+test_ratio))
print(X_train.shape)
print(X_test.shape)
print(X_valid.shape)
این نتیجه در:
(352, 10)
(45, 10)
(45, 10)
عالی! مجموعه داده ما با موفقیت به سه مجموعه تقسیم شده است، که اکنون میتوانیم آنها را به یک مدل وارد کنیم و اعتبارسنجی را در طول آموزش برای تنظیم فراپارامترها انجام دهیم.
تقسیم طبقه بندی شده
گاهی اوقات، تعداد متفاوتی از نمونه ها برای هر کلاس در یک مجموعه داده وجود دارد. مثلاً، یک کلاس 100 نمونه دارد، کلاس دوم 50، کلاس سوم 30 نمونه، و غیره. تقسیم بدون در نظر گرفتن این موضوع زمانی که در حال آموزش یک مدل طبقهبندی هستید، مشکل ایجاد میکند (البته، مدلهای رگرسیون از این مشکل رنج نمیبرند).
بهتر است مجموعه را به نحوی تقسیم کنید تا تناسب طبقات حفظ شود. این هست یک تقسیم طبقه بندی شده.
خوشبختانه روش train_test_split
یک آرگومان به نام دارد stratify
که آرایه ای می گیرد که تعداد نمونه ها را بر اساس کلاس تعریف می کند، در هنگام تقسیم، متناسب بماند:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
در بسیاری از موارد، شما می توانید به سادگی از آن استفاده کنید y
آرایه NumPy از مجموعه داده های شما برای خوبی stratify
آرایه تقسیم شده این تضمین میکند که مدل شما میتواند با عدم تعادل بین نمونههای کلاسها مبارزه کند و نسبت به برخی کمتر تعصبی پیدا کند.
نتیجه
در این راهنما، با برخی از کتابخانه Scikit-Learn و آن آشنا شدیم datasets
مدول. شما آموختهاید که مجموعههای آموزشی، آزمایشی و اعتبارسنجی چیست، کجا اعمال میشوند و مزایای اعتبارسنجی مدلهای شما.
ما نگاهی به روش به کارگیری آن انداخته ایم train_test_split()
روشی برای تقسیم داده های خود به یک مجموعه آموزشی و آزمایشی، و همچنین روش جداسازی یک مجموعه اعتبار سنجی، با حفظ پویا نسبت های این مجموعه ها.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-08 06:18:03