تقسیم داده: Train و Test
چرا داده را تقسیم میکنیم؟ آموزش train_test_split، نسبتهای مناسب و جلوگیری از نشت داده
چرا داده را تقسیم میکنیم؟
اگر مدل را روی همان دادهای که با آن آموزش دیده ارزیابی کنیم، مثل برگزاری امتحان از سؤالاتی است که دانشآموز از قبل جوابشان را دیده! نمره بالا میگیرد ولی واقعاً یاد نگرفته.
پس داده را دو قسمت میکنیم:
- داده آموزش (Train): مدل از آن یاد میگیرد — معمولاً ۷۰ تا ۸۰ درصد
- داده تست (Test): فقط برای ارزیابی نهایی — معمولاً ۲۰ تا ۳۰ درصد
train_test_split در scikit-learn
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2, # ۲۰٪ برای تست
random_state=42, # برای تکرارپذیری
stratify=y # حفظ نسبت کلاسها (برای دستهبندی)
)
پارامترهای مهم
| پارامتر | کاربرد |
|---|---|
test_size | سهم داده تست (۰.۲ یا ۰.۳) |
random_state | ثابت نگهداشتن تصادفی بودن برای تکرارپذیری |
stratify | حفظ نسبت کلاسها در هر دو بخش (مهم برای داده نامتوازن) |
چرا stratify مهم است؟
اگر ۹۰٪ داده کلاس «سالم» و ۱۰٪ «بیمار» باشد، شاید داده تست هیچ بیماری نداشته باشد! با stratify=y نسبت ۹۰-۱۰ در هر دو بخش حفظ میشود.
داده اعتبارسنجی (Validation)
در پروژههای جدی، سه قسمت داریم:
- Train: آموزش مدل
- Validation: تنظیم هایپرپارامترها و مقایسه مدلها
- Test: ارزیابی نهایی فقط یکبار!
نشت داده (Data Leakage)
هر اطلاعاتی از داده تست که قبل از ارزیابی به مدل برسد، «نشت» است و دقت را غیرواقعی بالا میبرد. مثالها: fit کردن scaler روی کل داده، حذف گمشدهها قبل از تقسیم، استفاده از ویژگیای که در آینده قابل محاسبه نیست.
قاعده طلایی
داده تست را تا آخرین لحظه لمس نکنید! آن را در کشو بگذارید و فقط برای امتحان نهایی بیرون بیاورید.
جمعبندی
- همیشه داده را به آموزش و تست تقسیم کنید
- ۸۰/۲۰ نسبت رایج است؛
random_stateرا ثابت کنید - برای دستهبندی از
stratifyاستفاده کنید - مراقب نشت داده باشید
این مبحث بخشی از دوره آموزش کامل ماشین لرنینگ است.