داده آموزش و آزمون
چرا داده را به 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
)
test_size=0.2:۲۰٪ برای Testrandom_state=42:ثابتکردن تصادف برای تکرارپذیریstratify=y:برای داده نامتوازن، حفظ نسبت کلاسها در هر دو تکه
نشت داده (Data Leakage) — دشمن خاموش
نشت داده یعنی اطلاعاتی از Test (یا آینده) به فرایند آموزش راه پیدا کند. نتیجه: ارزیابی غیرواقعی خوشبینانه و شوک در محیط واقعی!
مثالهای رایج نشت:
- پرکردن مقادیر گمشده با میانگین کل داده (باید فقط از Train محاسبه شود)
- مقیاسبندی با min/max کل داده (باید فقط از Train)
- انتخاب ویژگی با نگاه به کل داده
- وجود ویژگیای که «پاسخ» را لو میدهد (مثلاً ستونی که بعد از نتیجه ثبت شده)
قاعده طلایی: هر چیزی که از داده یاد میگیرید (میانگین، مقیاس، ویژگی)، فقط از Train بیاید؛ بعد روی Test اعمال شود.
اعتبارسنجی متقابل — قدم بعدی
وقتی داده کم است، یک تقسیم واحد ممکن است شانسی بد باشد. K-Fold Cross Validation داده را به K بخش میکند و هر بار یک بخش Test میشود؛ نتیجه، ارزیابی پایدارتر است. جزئیات در دوره ماشین لرنینگ.
جمعبندی
- تقسیم Train/Test برای ارزیابی صادقانه روی داده دیدهنشده
- train_test_split با test_size و random_state
- نشت داده = ارزیکیب غیرواقعی؛ هر آماری فقط از Train محاسبه شود
- برای داده کم، اعتبارسنجی متقابل پایدارتر است
این مبحث بخشی از دوره آموزش کامل علم داده است.