سود:
- توانایی تشخیص انواع نشت داده ها (هدف، زمان، پیش پردازش، ردیف گروه بندی شده) و پرس و جو از امتیاز "خیلی خوب برای واقعی بودن" به عنوان زنگ هشدار
- امکان جلوگیری از نشتی با جداسازی زودهنگام مجموعه آزمایش، خط لوله و تقسیم صحیح (زمانی/گروهی)
- امکان تکرار آنالیز با دانه های ثابت، کنترل نسخه و حذف مراحل دستی
دو اشتباه وجود دارد که بیشترین تلاش را در علم داده هدر می دهد، و هر دو موذی هستند زیرا درست زمانی که همه چیز "به نظر می رسد خوب است" منجر به فاجعه می شود. اولین مورد نشت داده است: مدل در مجموعه آزمایشی عالی کار می کند اما در تولید خراب می شود. دوم تکرار ناپذیری است: شش ماه بعد تجزیه و تحلیل انجام می دهید و نتیجه کاملاً متفاوتی می گیرید. این واحد به شناخت عمیق و اجتناب از این دو دام اختصاص دارد. هوش مصنوعی میتواند هر دو خطر را افزایش دهد (به سرعت ایجاد میکند، نشتهای پنهان را نشان میدهد، انجام مراحل دستی را برای شما آسانتر میکند) اما در صورت استفاده صحیح میتواند آنها را کاهش دهد. تفاوت در نظم و انضباط است.
نشت داده ها: مدل روشن بین
نشت داده زمانی است که مدل در حین آموزش اطلاعاتی را می بیند که در زمان پیش بینی واقعی نخواهد داشت. این مدل با این اطلاعات "تقلب" می کند، در مجموعه آزمایشی عالی به نظر می رسد، اما در تولید بدون آن اطلاعات خراب می شود. علامت نشت تقریباً همیشه یکسان است: خیلی خوب است که درست باشد. قبل از اینکه با دیدن دقت 99 درصد خوشحال شوید، باید به دنبال نشتی باشید.
انواع اصلی نشت عبارتند از:
1. نشت گل: یک ویژگی نتیجه هدف است. در پیشبینی «لغو شد»، ستونهای «تاریخ لغو» یا «مبلغ بازپرداخت» نتیجه هدف هستند. آنها فقط زمانی پر می شوند که نتیجه مشخص باشد.
2. نشت زمان: آوردن اطلاعات آینده به گذشته. هنگام محاسبه "میانگین 30 روز گذشته"، روزهای بعد از روز پیش بینی را در نظر بگیرید یا سری های زمانی را به طور تصادفی تقسیم کنید.
3. نشت پیش پردازش: یادگیری تحولات مانند مقیاس بندی، پر کردن، کدگذاری از تمام داده ها قبل از پارتیشن آموزش/آزمایش. میانگین گیری داده های آزمون در آموزش اختلال ایجاد می کند.
4. نشت ردیف تکراری/گروهی: ردیف های متعلق به یک فرد هم در آموزش و هم در آزمایش وجود دارد (دو ویزیت از یک بیمار در مجموعه های مختلف). مدل فرد را حفظ می کند.
نوع نشتی
چگونه متولد می شود
چگونه پیشگیری کنیم
نشت هدف
ستونی که حاصل هدف است
تست "آیا در زمان پیش بینی آن را دارم".
نشت زمان
آوردن آینده به گذشته
تقسیم زمانی، کنترل پنجره
نشت پیش پردازش
تبدیل پیش تقسیم
خط لوله، فقط از تمرین مناسب است
نشت ردیف گروهی
واحد مشابه در دو مجموعه
تقسیم بر اساس گروه (GroupKFold)
تنها نظم برای جلوگیری از نشت
راه حل رایج برای همه انواع نشت در یک جمله خلاصه می شود: مجموعه تست را هر چه زودتر برای تقلید از آینده واقعی جدا کنید، و چیزی به آن "آموزش" ندهید. در عمل، این به این معنی است: ابتدا تقسیم کنید، سپس تمام تحولات را فقط از آموزش یاد بگیرید و آنها را در یک خط لوله (ساختاری که تمام مراحل را در یک زنجیره جمع می کند) اعمال کنید. برای هر ویژگی، این سوال را بپرسید "آیا در زمان پیش بینی این اطلاعات را دارم؟" اگر زمان وجود دارد، آن را به ترتیب زمانی تقسیم کنید. اگر همان واحد تکراری است، به گروه تقسیم کنید.
احتیاط: خطرناک ترین جنبه نشت این است که خود را به عنوان یک موفقیت نشان می دهد. یک مدل بد بدیهی است که نتایج ضعیفی ایجاد می کند و مورد توجه قرار می گیرد. یک مدل فاش شده عالی کار میکند، همه را راضی میکند، و به تولید میرسد - اینجاست که سقوط شروع میشود. به همین دلیل است که یک نتیجه "بسیار خوب" دلیلی برای هشدار است، نه جشن.
تکرارپذیری: دوبار نتیجه یکسان بدست می آید
تکرارپذیری توانایی بدست آوردن همان نتیجه زمانی است که تجزیه و تحلیل را دوباره در زمان دیگری، روی ماشین دیگری اجرا می کنید. بدون این، تحلیل شما اتفاقی است نه علمی. علل و راه حل های اصلی که تکرارپذیری را مختل می کند:
مراحل دستی: تغییر دستی سلول در اکسل، ویرایش دستی نمودار. راه حل: هر مرحله را در کد داشته باشید.
تصادفی ثابت: آموزش مدل، نمونه گیری، تقسیم شامل تصادفی بودن است. راه حل: دانه تصادفی (مقدار اولیه مولد تصادفی) را ثابت کنید (حالت_تصادفی=42).
تغییر نسخه: نتیجه ممکن است با تغییر نسخه کتابخانه تغییر کند. راه حل: رفع وابستگی ها (requirements.txt، فایل محیطی).
عدم نگهداری سوابق: مشخص نیست از کدام داده، کدام کد و کدام پارامتر استفاده شده است. راه حل: کنترل نسخه (Git - سیستمی که تمام نسخه های کد را ذخیره می کند) و نسخه سازی داده ها.
"این فقط روی ماشین من کار می کند": راه حل: محیط را مستند کنید، در صورت امکان از کانتینرها (Docker) استفاده کنید.
سه کیف کوچک
مورد 1 - نشت هدف. یک تجزیه و تحلیل سلامت ستون "داروهای پس از ترخیص" را در پیش بینی "پذیرش مجدد بیمار" نشان داد. این ستون تنها پس از ترخیص بیمار پر شد. این مدل 96٪، در تولید 61٪ داد. پروژه 8 هفته ای زباله بود. درس: از هر ویژگی بپرسید "آیا در زمان پیش بینی وجود دارد؟"
مورد 2 - نشت پیش پردازش. یک تیم تمام داده ها را مقیاس بندی کرد و سپس آن ها را تقسیم کرد. میانگین داده های آزمون در مقیاس بندی نقش داشت. امتیاز CV 89٪، تولید واقعی 76٪. موفقیت جعلی زمانی ناپدید شد که من به Pipeline نقل مکان کردم و در مورد تحولات فقط از طریق آموزش یاد گرفتم. درس: اول تقسیم، بعد تبدیل کنید.
مورد 3 - عدم تکثیر. یک تحلیلگر می خواست نموداری را که سه ماه بعد به مدیریت ارائه کرده بود به روز کند، اما به یاد نمی آورد که چگونه آن را تولید کرده است. بسیاری از مراحل به صورت دستی در اکسل انجام شد. نتیجه به جایی نرسید و اعتماد متزلزل شد. درس: بدون مراحل دستی، همه چیز در کد و Git است.
چهار قالب قابل کپی
1) بازرسی نشتی:
نقش شما: بازرس نشت. هدف: "Churn" (0/1)، تاریخ مرجع پیشبینی: record_date. من این لیست از ویژگی ها را به شما می دهم. برای هر ویژگی: (الف) آیا نتیجه هدف است، (ب) آیا در زمان پیشبینی در دسترس من است، (ج) آیا پنجره زمانی شامل آینده میشود؟ آن را به عنوان «ناامن/مشکوک/نشتی» علامت بزنید و دلیل بنویسید. ویژگی ها: [لیست]
2) خط لوله بدون نشتی:
خط لوله sklearn را راهاندازی کنید: ابتدا قطار/آزمایش را تقسیم کنید (طبقهبندی شده، seed=42)، سپس تمام پیشپردازشها (تصویر، مقیاس، کدگذاری) را فقط از آموزش در خط لوله قرار دهید. توضیح دهید که چرا کد بدون نشت است، کدام مرحله از کجا یاد گرفته شده است.
3) کد چک لیست تکرارپذیری:
من می خواهم تجزیه و تحلیل خود را قابل تکرار کنم. کد/ساختاری را پیشنهاد دهید که اضافه میکند: (1) دانه سخت برای همه تصادفیها، (2) چاپ نسخههای کتابخانه استفادهشده، (3) برچسب تاریخ/نسخه برای دادهها و خروجیها. همچنین یک چک لیست به من بدهید تا مطمئن شوم که مراحل دستی وجود ندارد.
4) پارتیشن گروهی (همان نشت واحد):
در داده ها، همان customer_id در چندین ردیف وجود دارد. یک تقسیم (GroupKFold orGroupShuffleSplit، group = customer_id) ایجاد کنید که از حضور یک مشتری در آموزش و آزمایش جلوگیری کند. برای تأیید اینکه پس از تقسیم، هیچ مشتری در هر دو مجموعه وجود ندارد، کدی را وارد کنید.
اعلان ضعیف / اعلان قوی
اعلان ضعیف:
مدل من 98 درصد دقت را نشان داد، این عالی نیست؟ کد را بهینه کنید
جشن گرفتن 98 درصد نشت را پنهان می کند. قبل از بهینه سازی باید از واقعی بودن یا نبودن این امتیاز سوال کرد.
اعلان قدرتمند:
نقش شما: بازرس نشت. مدل من در مجموعه تست دقت 98 درصدی را برمیگرداند که به نظر من "خیلی خوب برای واقعی بودن" است. بررسی کنید: (1) آیا هر ویژگی نتیجه هدف است، (2) تبدیل هایی است که قبل از تقسیم انجام می شود، (3) واحد یکسانی در دو مجموعه است، (4) آیا هر گونه نشت زمانی وجود دارد. هر نقطه مشکوک را فهرست کنید؛ روی یافتن نشت تمرکز کنید، نه رفع امتیاز.
در اینجا، نمره بالا به عنوان نشانه ای برای زیر سوال رفتن تلقی می شود، نه تجلیل.
اشتباهات رایج
- جشن گرفتن نتیجه "بسیار خوب". نمره خیلی خوب تا واقعی یک هشدار نشت است، نه یک دستاورد.
- یادگیری تبدیل از تمام داده ها قبل از تقسیم. رایج ترین نشت؛ ابتدا با خط لوله تقسیم کنید.
- تقسیم سری زمانی به صورت تصادفی مدل آینده را می بیند. تقسیم زمانی ضروری است.
- ترک یک واحد در دو مجموعه. مدل فرد را حفظ می کند. بر اساس گروه تقسیم کنید.
- وارد نشدن به صورت دستی و نوشتن در کد. تجزیه و تحلیل غیر قابل تکرار می شود. همه چیز باید در کد و Git باشد.
نکته: در ابتدای پروژه خود دو جمله ای بنویسید "وعده افتخار": "قبل از اینکه مجموعه تست را در مرحله تولید ببینم به هیچ وجه دست نزده ام. هر مرحله در کد است و دانه ثابت است." اگر نمی توانید صادقانه این دو جمله را امضا کنید، نتیجه شما هنوز قابل اعتماد نیست.
به طور خلاصه
نشت داده ها و عدم تکرارپذیری دو خطای خاموش گران قیمت در علم داده هستند. نشت چشم انداز مدل از آینده است و خود را به عنوان موفقیت کاذب نشان می دهد. راه حل این است که مجموعه تست را زودتر تقسیم کنید، تحولات را فقط از طریق آموزش (خط لوله) یاد بگیرید، از هر ویژگی سوال بپرسید "آیا در زمان پیش بینی آن را دارم" و تقسیم بندی صحیح (وقتی/گروهی) انجام دهید. تکرارپذیری این است که بتوانیم یک نتیجه را دو بار بدست آوریم. راه حل او این است که به صورت دستی مراحل را بردارید، دانه را پین کنید، نسخه ها را فریز کنید، و همه چیز را در Git نگه دارید. هوش مصنوعی می تواند این خطرات را افزایش یا کاهش دهد. این رشته شماست که تعیین می کند.
وظیفه کاربردی
لیست ویژگی های مدلی را که ساخته اید (یا یک مدل فرضی) را در نظر بگیرید و از هر ویژگی این سوال را بپرسید که "آیا در زمان پیش بینی این اطلاعات را دارم؟" به صورت نوشتاری؛ حداقل یک نامزد نشت پیدا کنید. سپس یک چک لیست را پر کنید تا تجزیه و تحلیل شما قابل تکرار باشد: آیا دانه ثابت است، آیا مراحل دستی وجود دارد، آیا نسخه ها ثبت شده اند، آیا در Git هستند. نواقص را برطرف کنید.
چک لیست
- [ ] آیا امتیاز «خیلی خوب برای درست بودن» را به عنوان هشدار نشت پرس و جو کردم؟
- [ ] آیا من تمام تحولات پس از تقسیم را فقط از طریق آموزش یاد گرفتم؟
- [ ] آیا من بر اساس ساختار زمان/گروه (کرونولوژیک/GroupKFold) تقسیم کرده ام؟
- [ ] آیا من تمام تصادفی بودن را با دانه ثابت قابل تکرار کرده ام؟
- [ ] آیا مراحل دستی را حذف کردم و همه چیز را در کد و کنترل نسخه نگه داشتم؟