مراحل یک پروژهی واقعی
جواب کوتاه
یه پروژهی واقعی یادگیری ماشین معمولا هفت مرحله داره. اول دقیق میگیم سوالمون چیه و از کجا میفهمیم موفق شدیم. بعد داده رو پیدا میکنیم، میفهمیم و تمیز میکنیم؛ که بیشترین وقت همینجا میره. بعد یه مدل ساده میسازیم، با یه خط پایه و روی دادهای که مدل ندیده میسنجیمش، و کمکم بهترش میکنیم. بعد مدل رو به کار میذاریم تا آدمهای واقعی ازش استفاده کنن، و همیشه زیر نظرش داریم، چون دنیا عوض میشه. این مرحلهها یه خط صاف نیستن؛ مدام بینشون رفت و برگشت میکنیم.
نقشه
فرض کنید یه نونوایی هر شب باید تصمیم بگیره فردا چند تا نون بپزه. کم بپزه، مشتری دست خالی میره؛ زیاد بپزه، آخر شب نون دور ریخته میشه. صاحبش از شما میخواد با یادگیری ماشین کمکش کنید.
توی درس اولین پروژه، داده آماده بود و سوال هم روشن. توی دنیای واقعی هیچکدوم از اینها آماده نیست. یه پروژهی واقعی معمولا این هفت مرحله رو داره: سوال و معیار، داده، مدل ساده، سنجش، بهتر کردن، به کار گذاشتن، و پایش.
این فهرست چیز تازهای نیست. پرکاربردترین الگویی که برای پروژههای داده نوشته شده، تقریبا همین مرحلهها رو داره، و یه نکتهی مهم هم میگه: ترتیبش سفت نیست. وسط کار مدام برمیگردید عقب. مثلا موقع سنجش میفهمید داده یه مشکلی داشته و برمیگردید سراغ داده؛ یا بعد از پایش، میفهمید سوال رو باید یه جور دیگه میپرسیدید. خطچینهای تصویر همین برگشتهان.
این الگو به هیچ ابزار و صنعت خاصی وابسته نیست؛ چه نونوایی باشه، چه بیمارستان، چه یه فروشگاه اینترنتی. بیاید با همون نونوایی، مرحله به مرحله بریم.
سوال و معیار
مهمترین مرحله، و اونی که بیشتر از همه جا میافته، اولیه. قبل از اینکه به داده و مدل فکر کنید، باید دقیق بدونید چی میخواید:
«فروش رو پیشبینی کن» کافی نیست. دقیقترش اینه: «هر شب، برای فردا، تعداد نونهایی که فروش میره رو حدس بزن.» حالا معلومه ورودی چیه، خروجی چیه، و کی لازمه؛ یعنی شب قبل، نه صبح همون روز.
بعد، معیار: از کجا بفهمیم کارمون خوبه؟ اینجا یه چیز جالب پیدا میشه. برای نونوا، کم آوردن و زیاد آوردن شاید یه اندازه بد نباشن. اگه مشتری دست خالی بره و دیگه برنگرده، کم آوردن خیلی بدتره؛ اگه نون گرون باشه و دور ریختنش ضرر زیادی داشته باشه، زیاد آوردن. این رو فقط خود نونوا میدونه، نه شما. پس باید باهاش بشینید و بپرسید.
یه سوال دیگه هم همین اول باید پرسید: اصلا یادگیری ماشین لازمه؟ شاید یه قانون ساده، مثل «جمعهها بیشتر بپز»، همین الان کافی باشه. اگه قانون ساده جواب میده، همون رو بذارید؛ مدل فقط وقتی ارزش داره که از اون بهتر باشه.
داده
حالا داده. توی کلاس و درسها، داده یه فایل تمیزه. توی دنیای واقعی، این مرحله بیشترین وقت پروژه رو میگیره:
کسایی که با داده کار میکنن، معمولا بیشتر وقتشون صرف آماده کردن داده میشه تا خود تحلیل و مدل. چرا؟ چون دادهی واقعی از جاهای مختلف میاد و هر کدوم یه جوره. فروش نونوایی شاید توی دفتر دستی نوشته شده، شاید توی صندوق فروشگاه، و شاید چند ماهش گم شده.
اولین کار اینه که بفهمید هر ستون دقیقا یعنی چی، و بهترین راهش پرسیدن از کسیه که داده مال اونه. مثلا «فروش» یعنی نونی که فروخته شده، یا نونی که پخته شده؟ روزهایی که نون زود تموم شده، فروش واقعی نیست؛ شاید اگه بیشتر داشتید، بیشتر میفروختید. اینجور نکتهها رو هیچ مدلی خودش نمیفهمه.
بعد تمیز کردن: روزهای خالی، عددهای عجیب، چیزهایی که دو بار ثبت شدن. هر چیز نامعتبری رو یا درست میکنید، یا کنار میذارید، یا یه دستهی «نامعلوم» براش میسازید. بعد هم ویژگیها رو میسازید: روز هفته، تعطیلی، شاید هوا. هر چیزی که فکر میکنید روی فروش اثر داره.
یه نونوایی ساختگی، با عدد
تا اینجا نونوایی فقط یه مثال بود. برای اینکه مرحلهها رو با عدد ببینیم، با پایتون یه نونوایی ساختگی ساختیم: دو سال فروش روزانه. هر روز هفته یه میانگین داره، مثلا پنجشنبهها بیشتر از همه، ۹۵ نون؛ فروش هر سال ۱۰ درصد بیشتر میشه؛ هر روز یه کم شانسی بالا پایین میره؛ و ۸ روز در این دو سال تعطیل بوده و فروشش صفر ثبت شده. همهی این عددها ساختگیان؛ فقط برای اینه که ببینیم هر تصمیم چقدر فرق میکنه.
اون ۸ روز تعطیل یه درس کوچیک ولی مهم دارن. توی فایل، فروش اون روزها صفره؛ ولی صفر اینجا یعنی «بسته بودیم»، نه «هیچکس نون نخرید». اگه این رو ندونیم و حدس فردا رو از میانگین چند روز گذشته بسازیم، اون صفرها میانگین رو پایین میکشن. توی آزمایش ما، حدسی که از میانگین ۴ همین روز اخیر ساخته میشد، با صفرها ۵٫۵ نون در روز اشتباه داشت و با کنار گذاشتن روزهای تعطیل ۵٫۱. فرق کمیه، چون فقط ۸ روز تعطیل بود؛ ولی تو دادهی واقعی که گاهی دهها روز اینجوریان، میتونه کل مدل رو کج کنه. این همون چیزیه که فقط با پرسیدن از نونوا میفهمید.
فقط چیزی که شب قبل داریم
موقع ساختن ویژگیها یه تلهی رایج هست. سوال ما این بود: «هر شب، برای فردا». پس هر ویژگیای که مدل استفاده میکنه، باید شب قبل در دسترس باشه. مثلا هوای واقعی فردا رو شب قبل نداریم؛ فقط پیشبینی هوا رو داریم. اگه مدل رو با هوای واقعی آموزش بدید، روی آزمون عالی به نظر میاد، ولی شب قبل، که فقط پیشبینی هوا هست، بدتر کار میکنه.
یا یه مثال بدتر: ستونی به اسم «ساعتی که نون تموم شد». این ستون خیلی خوب فروش همون روز رو لو میده؛ نون زود تموم شده یعنی فروش زیاد بوده. ولی این عدد آخر همون روز معلوم میشه، نه شب قبلش. مدلی که باهاش آموزش ببینه، روی آزمون خیلی خوب میشه و توی کار واقعی هیچوقت این ستون رو نداره. به این نشت داده میگن. یه سوال ساده جلوش رو میگیره: برای هر ستون بپرسید «شبی که میخوام برای فردا حدس بزنم، این عدد رو دارم؟» اگه نه، کنارش بذارید.
اول ساده
وسوسه میشید مستقیم برید سراغ بزرگترین و جدیدترین مدل. نکنید. اول سادهترین حدس ممکن:
برای نونوایی، یه حدس خیلی ساده اینه: «فردا همونقدر میفروشیم که همین روز هفتهی پیش فروختیم.» این خط پایهست. هیچ یادگیریای نداره، ولی خیلی وقتها از چیزی که فکر میکنید بهتره، چون فروش نون هر هفته یه شکل تکراری داره.
بعد یه مدل ساده، مثلا رگرسیون خطی یا یه درخت تصمیم. مدل ساده زود ساخته میشه، زود فهمیده میشه، و اگه از خط پایه بهتر نبود، یعنی یه جای کار، احتمالا توی داده، ایراد داره. اگه بهتر بود، حالا یه نقطهی شروع دارید که هر مدل پیچیدهتری باید ازش بهتر باشه.
چهار تا حدس، کنار هم
حالا خط پایهها. ۸ هفتهی آخر رو برای آزمون نگه داشتیم و چهار جور حدس رو امتحان کردیم. برای هر روز، اختلاف حدس با فروش واقعی رو گرفتیم و میانگینش رو حساب کردیم:
سادهترین حدس، یعنی میانگین همهی روزهای گذشته، روزی ۱۲٫۴ نون اشتباه داشت؛ چون نمیدونه امروز چه روزیه. «همین روز هفتهی پیش» یکدفعه به ۷٫۱ رسید. میانگین ۴ همین روز اخیر، که شانس یه روز عجیب رو صاف میکنه، ۵٫۱. و یه مدل که از کل دو سال آموزش، میانگین هر روز هفته رو یاد گرفت، ۶٫۴؛ بدتر از حدس سادهتر. چرا؟ چون فروش هر سال بیشتر میشه، و میانگین کل دو سال، فروش امروز رو کمتر از واقعیت حدس میزنه. یعنی «مدل» همیشه از «حدس ساده» بهتر نیست؛ اینجا حدسی برنده شد که فقط به هفتههای اخیر نگاه میکرد. اگه خط پایه نداشتیم، شاید با خیال راحت مدل بدتر رو تحویل میدادیم.
سنجش
توی درسهای قبل گفتیم مدل رو باید روی دادهای سنجید که ندیده. ولی وقتی داده به ترتیب زمانه، این کار یه نکتهی ظریف داره:
اگه ماههای آزمون رو شانسی انتخاب کنید، مدل موقع آموزش ماههای قبل و بعد هر کدوم رو دیده. مثلا اگه یه ماه وسط سال آزمون باشه، مدل ماه قبل و ماه بعدش رو میشناسه و راحت حدس میزنه. نمرهش زیادی خوب درمیاد، و روز اولی که واقعا آینده رو پیشبینی کنه، ناامیدتون میکنه.
کار درست اینه که همون شرایط واقعی رو بسازید: با گذشته آموزش بدید و با آخرین ماهها، که مدل هیچوقت ندیده، بسنجید. یعنی دقیقا مثل روزی که مدل رو به کار میذارید و فردا رو ازش میپرسید. همین فکر برای هر چیزی کار میکنه: آزمونتون باید تا جایی که میشه شبیه کار واقعی باشه.
و معیار رو همون چیزی بذارید که اول کار با نونوا توافق کردید، نه هر عددی که کتابخونه راحتتر میده. اگه کم آوردن براش بدتره، معیار باید کم آوردن رو بیشتر جریمه کنه.
تقسیم شانسی، با عدد
همین حرف رو با عدد هم ببینیم. همون مدل میانگین روز هفته رو یه بار با ۸ هفتهی آخر سنجیدیم و یه بار با ۵۶ روز شانسی از کل دو سال. با تقسیم زمانی، اشتباه ۶٫۴ بود؛ با تقسیم شانسی، ۴٫۹. یعنی تقسیم شانسی مدل رو حدود یکچهارم بهتر از واقعیت نشون داد، چون مدل موقع آموزش روزهای قبل و بعد از هر روز آزمون رو دیده بود و رشد فروش رو میشناخت. اگه بر اساس اون ۴٫۹ تصمیم میگرفتید، روز اول کار واقعی میدیدید مدل اونقدر که فکر میکردید خوب نیست.
بهتر کردن
حالا وقت بهتر کردنه. ولی نه با عوض کردن ده تا چیز با هم:
هر بار یه چیز رو عوض کنید و دوباره بسنجید. یه ویژگی تازه اضافه کنید، مثلا تعطیلیها؛ خطا کم شد؟ نگهش دارید. هوا؛ کم شد؟ نگهش دارید. یه مدل پیچیدهتر؛ بدتر شد؟ برگردید. اگه چند چیز رو با هم عوض کنید، دیگه نمیفهمید کدوم کمک کرد و کدوم ضرر زد.
توی این مرحله معمولا بیشترین بهتر شدن از داده و ویژگی میاد، نه از مدل. برای همین مدام برمیگردید عقب، سراغ مرحلهی داده؛ همون خطچینهای تصویر اول. یادتون هم باشه مدلی که روی آزمون خیلی خوب شده، شاید فقط بیشبرازش کرده باشه، مخصوصا اگه بارها با همون آزمون سنجیده باشیدش.
کی دست بکشید؟ وقتی مدل به اندازهای خوب شد که برای نونوا ارزش داشته باشه. صد بار بهتر کردن یه درصد، شاید ارزش وقتش رو نداشته باشه.
یه چیز در هر بار، با عدد
بیایید «هر بار یه چیز رو عوض کنید» رو روی نونوایی امتحان کنیم. اون حدس «میانگین چند همین روز اخیر» یه پیچ داره: چند هفته به عقب نگاه کنه؟ فقط همین یه پیچ رو چرخوندیم. با ۱ هفته، اشتباه ۷٫۱ بود؛ ۲ هفته ۵٫۷؛ ۴ هفته ۵٫۱؛ ۸ هفته ۴٫۸؛ ۱۶ هفته ۴٫۷؛ و با ۵۲ هفته، یعنی یه سال، دوباره ۴٫۸.
چرا اول بهتر و بعد بدتر؟ هر چی هفتههای بیشتری رو میانگین بگیریم، شانس یه روز عجیب بیشتر صاف میشه؛ ولی هفتههای خیلی قدیمی مال زمانیه که فروش کمتر بود، و حدس رو عقب نگه میدارن. یه جایی این دو تا به تعادل میرسن؛ اینجا حدود ۱۶ هفته. این عدد رو هیچ کتابی بهتون نمیگه؛ باید با دادهی خودتون امتحانش کنید، و فقط با تغییر دادن همین یه چیز، میفهمید اثرش چیه.
یه تغییر دیگه، جدا: اون مدل میانگین روز هفته که با کل دو سال آموزش دیده بود و ۶٫۴ اشتباه داشت، این بار فقط با ۱۲ هفتهی آخر آموزش دادیم. اشتباه رسید به ۴٫۶؛ بهترین عدد این درس. یعنی مشکل اون مدل خود ایده نبود، دادهای بود که بهش دادیم. اگه همزمان مدل رو عوض کرده بودیم و داده رو، نمیفهمیدیم کدوم کمک کرد. این دقیقا همون حرفیه که بیشترین بهتر شدن معمولا از داده میاد، نه از مدل پیچیدهتر.
کم بپزیم یا زیاد؟
یادتونه اول کار گفتیم باید از نونوا بپرسیم کدوم اشتباه بدتره. فرض کنید جواب داده هر نونی که اضافه بمونه، یه واحد ضرر داره، و هر مشتری که دست خالی بره، سه واحد؛ این عددها هم ساختگیان. حالا بهجای اینکه دقیقا به اندازهی حدس بپزیم، چند نون بیشتر میپزیم و ضرر روزانه رو حساب میکنیم:
اگه دقیقا به اندازهی حدس بپزیم، ضرر روزانه ۱۰٫۴ واحده. با ۴ یا ۵ نون بیشتر، به ۸٫۴ میرسه؛ حدود ۲۰ درصد کمتر. و از اون به بعد دوباره بالا میره، چون نونهای اضافه زیاد میشن. یعنی بهترین تصمیم، حدس دقیق نیست؛ حدسیه که اندازهی ضرر دو طرف رو حساب کرده.
این مسئله یه اسم قدیمی داره: مسئلهی روزنامهفروش. کنت ارو، تئودور هریس و جیکوب مارشاک سال ۱۹۵۱ حسابش رو نوشتن. جواب کلیش اینه که وقتی کم آوردن سه برابر زیاد آوردن ضرر داره، باید اونقدر بپزید که حدود سه روز از چهار روز کم نیارید. چیزی که اینجا مهمه اینه که این تصمیم ربطی به مدل نداره؛ همون مدل، با یه سوال درست از نونوا، ضرر رو یکپنجم کم کرد. خیلی وقتها بیشترین ارزش پروژه همینجاست، نه توی مدل پیچیدهتر.
تحویل و پایش
مدلی که توی دفترچهی شما خوبه، تا وقتی نونوا ازش استفاده نکنه، هیچ فایدهای نداره:
به کار گذاشتن یعنی مدل رو جایی بذارید که هر شب، خودش، با دادهی همون روز، عدد فردا رو بده؛ مثلا روی گوشی نونوا. این کار خودش یه پروژهست: دادهی هر روز باید خودکار برسه، همونطور تمیز بشه که موقع آموزش تمیز شده بود، و اگه یه شب چیزی خراب شد، یکی باخبر بشه. درس بعد مفصلتر دربارهش میگه.
و آخر، پایش. مدل امروز با دادهی دیروز ساخته شده، ولی دنیا عوض میشه. یه نونوایی تازه سر کوچه باز میشه، قیمتها عوض میشه، عادتهای مردم عوض میشه. خطای مدل آرومآروم بالا میره. اگه خطا رو هر روز نگاه کنید و یه مرز هشدار براش بذارید، میفهمید کی وقتشه با دادهی تازه دوباره آموزشش بدید. به این کهنه شدن میگن رانش داده.
برای همین آدمهایی که مدل رو توی کار واقعی نگه میدارن، چند تا عادت دارن: هر نسخهی داده و مدل و کد رو نگه میدارن تا اگه لازم شد برگردن، مدل رو مدام زیر نظر دارن، و آموزش و سنجش دوباره رو تا جای ممکن خودکار میکنن. یه مقالهی معروف سال ۲۰۱۵ نشون داد که نگه داشتن یه سیستم یادگیری ماشین توی کار واقعی، خیلی سختتر از ساختنشه.
آروم تحویل بدید
یه راه امن برای تحویل اینه که مدل اول چند هفته کنار روش قبلی کار کنه، بی اینکه کسی ازش استفاده کنه؛ فقط حدسش ثبت میشه. نونوا مثل همیشه نون میپزه، و شما آخر هر روز میبینید اگه به حرف مدل گوش داده بود، چی میشد. اگه چند هفته بهتر بود، حالا با خیال راحت جاش رو بهش میدید. اینجوری اگه یه جای کار ایراد داشته باشه، مثلا دادهی هر روز با دادهی آموزش فرق داشته باشه، قبل از اینکه ضرری بزنه پیداش میکنید.
یه کار دیگه هم هست که خیلیها فراموش میکنن: نوشتن. یه صفحه که بگه مدل برای چیه، با چه دادهای ساخته شده، روی آزمون چقدر اشتباه داشته، و کجاها خوب کار نمیکنه؛ مثلا «برای روزهای تعطیل رسمی امتحان نشده». مارگارت میچل و همکارهاش سال ۲۰۱۹ به این صفحه گفتن کارت مدل. شش ماه بعد که خودتون یا یکی دیگه سراغ مدل میاد، همین یه صفحه کلی دردسر رو کم میکنه.
چند نکته
اول سوال، بعد مدل؛ سوالی که دقیق تعریف نشده، با هیچ مدلی درست جواب داده نمیشه. با صاحب کار حرف بزنید، چون معنی داده و اینکه کدوم اشتباه بدتره رو فقط اون میدونه؛ دیدیم همین یه سوال، ضرر نونوایی رو حدود یکپنجم کم کرد. برای داده وقت بذارید، چون بیشتر کار همینجاست و بیشتر بهتر شدن هم از همینجا میاد. همیشه یه خط پایه داشته باشید. آزمون رو شبیه کار واقعی بسازید و برای پیشبینی آینده، با آینده بسنجید. و یادتون باشه تحویل آخر کار نیست؛ مدل رو زیر نظر داشته باشید و آمادهی آموزش دوباره باشید.
اشتباههای رایج
رایجترینش شروع از مدل بهجای سوال. بعدی باور کردن داده بی پرسیدن معنیش؛ مثل صفرهای روز تعطیل. بعدی نداشتن خط پایه، که باعث میشه مدل بدتر از یه حدس ساده رو با افتخار تحویل بدید. بعدی تقسیم شانسی دادهی زمانی، که دیدیم مدل رو یکچهارم بهتر از واقعیت نشون داد. بعدی معیاری که با ضرر واقعی کسبوکار جور نیست. و آخری، تحویل یکباره و بی پایش، که تا اولین خرابی کسی نمیفهمه.
از کجا اومد
این مرحلهها رو آدمها کمکم و با تجربه یاد گرفتن:
حساب «کم بیارم یا زیاد» سال ۱۹۵۱ نوشته شد. نقشهی ششمرحلهای که بالاتر دیدیم، از سال ۱۹۹۶ با همکاری چند شرکت شکل گرفت و هنوز پرکاربردترین نقشهی پروژههای دادهست. سال ۲۰۱۵ دیوید اسکالی و همکارهاش نشون دادن که نگه داشتن یه سیستم یادگیری ماشین خیلی سختتر از ساختنشه، و سال ۲۰۱۹ کارت مدل پیشنهاد شد.
درس بعد یکی از این مرحلهها رو باز میکنه: مدلی که ساختید چطوری از دفترچه بیرون میاد و توی یه برنامهی واقعی کار میکنه؟به کار گذاشتن مدل.
جمعبندی. آنچه از این درس با خودتان میبرید.
- اول سوال و معیار، بعد مدل.
- بیشتر وقت پای داده میره.
- همیشه با یه خط پایهی ساده مقایسه کن.
- برای پیشبینی آینده، با آخرین ماهها بسنج.
- کار با تحویل تموم نمیشه؛ پایش لازمه.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.