
تا قبل از آشنا شدن با مفهوم data leakage فکر میکردم هر چی دقت مدل بالاتر باشه ؛ همه چی داره عالی کار میکنه و کارم رو درست انجام دادم .
اما بعداً متوجه شدم که مدل ما میتونه تقلب کنه و به نحوی به اطلاعاتی که نباید دسترسی داشته باشه ، دسترسی پیدا کرده و داره به کل من و مسیر پروژه رو گمراه میکنه . به این اتفاق Data Leakage (نشت داده) گفته میشه .
این داستان مشابه ممکنه که برای شما هم اتفاق افتاده باشه که وقتی مدل موقع test دقت 98 درصدی داشته و شما پیش خودتون میگفتین دیگه از این بهتر نمیشه یا شاید حتی خودتون رو رقیب حقیقی سم التمن خطاب کردین اما موقع deploy مدل به هیچ دردی نمیخوره و عملا بی فایده است .
دلیل این مشکل چیزی نیست جز نشت داده ، که یعنی مدل به کمک روش های مختلف تونسته به اطلاعاتی که بعد از وقوع رویداد مورد نظر در دسترس بود ، دسترسی پیدا کنه و یه جورایی از آینده تقلب کنه .
به زبان ساده Data Leakage یعنی نشت اطلاعات خارج از داده های آموزشی مدل به داخل مدل ، اطلاعاتی که که در دنیای واقعی در دسترس نخواهد بود .
برای اینکه بهتر این موضوع رو درک کنین یه مثال ساده میزنم : شما یک دانش اموز کنکوری هستین که در آزمون های جامع مراکز مختلف برای امادگی کنکور شرکت میکنین ؛ یکی از روز هایی که شما در محل برگزاری آزمون جامع هستید کنجکاوی شما باعث میشه که یکی از کشو های حوزه امتحان رو باز کنید و کلید پاسخ نامه آزمون اون روز رو پیدا کنید. در اون آزمون شما با حفظ کردن پاسخ ها درصد های عالی بدست میارید ، و این پروسه هر هفته تکرار میشه . همه معلم ها منتظر روز کنکور هستن تا با افتخار اعلام کنن که اونها به یه نخبه آموزش دادن و بنر موفقیت شما در کنکور رو سرتاسر شهر بزنن . اما... روز کنکور میرسه و شما موفق شدین توی کنکور جزو سه نفر اخر باشین . این مثالی که زدم مثال عملی نشت داده هایی بود که مدل در حال اموزش دیدن نباید بهشون دسترسی می داشت .
مدل موفق به رسیدن به درصد دقت های عالی میشه اما نه به خاطر یادگیری واقعی ؛ به خاطر تقلب .
در کل سه نوع نشت داده اصلی وجود داره که در این بخش به اختصار بهشون میپردازیم
1. نشت هدف (target leak) :
یه ویژگی در مدل داریم که مستقیما از برچسب هدف نشأت میگیره یا بعد از اون ثبت میشه
2 .آلودگی داده های آموزش و آزمون (train-test-contamination ):
اطلاعاتی از مجموعه آزمون قبل از آموزش وارد فرایند پیش پردازش یا مهندسی ویژگی میشه .
3 . نشت زمانی (time leakage ):
در داده های سری زمانی ، از اطلاعات آینده برای پیش بینی گذشته استفاده میشه .
رایج ترین مثال برای این نوع نشت اینه که میخوایم پیش بینی کنیم آیا یه نفر شامل بیمه درمانی میشه یا نه .
و در اطلاعات مشخص میکنیم که آیا شخص دارو مصرف کرده یا نه ؛ اما این نوع اطلاعات باید پس از پیش بینی مدل در دسترس مدل قرار بگیره نه هنگام اموزش .
مثال :

این نوع نشت معمولا نا خواسته اتفاق میافته و مشکل اینجاست که پیش پردازش رو قبل از تقسیم داده ها انجام میدیم :

بهترین راه حل برای رفع این مشکل اینه که همیشه از sklearn.pipline.Pipeline استفاده بکنیم . این کلاس تضمین میکنه که هر مرحله پردازش فقط روی داده های آموزشی تنظیم میشه نه آزمون .
وقتی با داده های سری زمانی کار میکنیم ، ترتیب زمان مهم و حیاتیه . استفاده از train_test_split معمولی ( که تصادفی تقسیم میکنه ) میتونه اطاعات آینده رو به گذشته نشت بده .
مثال :

که برای حل این مشکل هم از کلاس TimeSeriesSplit استفاده کردیم که جلوی مشکلات ناشی از نشت تصادفی رو بگیریم .
یکی از رایج ترین و خطر ناک ترین اشتباهات در دنیای machine learning نشت داده است ، چون کسی متوجه مشکل نیست تا وقتی که کار از کار گذشته باشه و نتایج و هدف پروژه رو کاملا گمراه میکنه .
در خوش بینانه ترین حالت فقط باعث شده که منابع و وقت هدر بره ؛ اما سناریو وقتی جدی میشه که یک سیستم مالی یا پزشکی بر اساس مدل های بی اعتبار تصمیم بگیره . راه حل این مشکل هم ساده است : قبل از هر چیز از خودت بپرس « آیا این ویژگی موقع پیش بینی موجوده ؟» و همیشه زنجیره پردازش بساز تا مدلت در محیط واقعی عم به خوبی روی کاغذ عمل کنه .
دفعه بعد که مدلت روی دادههای آزمون نتیجه درخشانی داد، یه لحظه مکث کن. از خودت بپرس: «آیا این مدل واقعاً یاد گرفته، یا فقط تقلب کرده؟» اون یه ثانیه تردید، ارزشش از ساعتها بهینهسازی بیشتره.
سخن پایانی : اگه این مقاله برات مفید بود، یه سوال ازت دارم: آیا تا حالا خودت با نشت داده دستوپنجه نرم کردی؟ تجربهات رو توی کامنتها بنویس — احتمالاً بقیه هم همون اشتباه رو کردن و از خوندنش چیزی یاد میگیرن.