در قسمت اول این مجموعه (لینک) یک دیتاست فروشگاهی واقعی رو معرفی کردم و در توضیحاتش گفتم که:
تراکنشهای این فروشگاه اینترنتی ناشناس که ظاهراً هدایای مناسبتی رو به صورت عمده میفروشه در بازه سالهای 2010 تا 2011 انجام شده و حاوی حدوداً 26000 تراکنشه که برای سفارش (یا کنسل کردن سفارش) بیش از 4000 محصول توسط حدود 4300 مشتری ثبت شده.
قبل از خوندن این مطلب، پیشنهاد میکنم حداقل پیشگفتار قسمت اول رو بخونید تا با سطر و ستونهای این دیتاست آشنا بشین.
کدهای این نوشته رو هم در اینجا میتونید ببینید.
اما اگه نخوندین، خیالتون راحت باشه که برای ادامه این نوشته، عمدتاً با سری زمانی که در شکل زیر رسم شده سر و کار داریم. این شکل روند فروش روزانه فروشگاه (مجموع همه فاکتورهای هر روز) رو نشون میده.
اگه ده روز اول سری زمانی رو رسم کنیم، شکل زیر رو خواهیم داشت که نشون میده این فروشگاه در نخستین روز دیتاست (به تاریخ 01-12-2010) حدوداً 46هزار دلار فروش داشته.
در مسئله پیشبینی سری زمانی هدف اینه که با دونستن مقادیر گذشته، مقادیر آینده رو پیشبینی کنیم. تفسیر این حرف برای دیتاست فروشگاهی که ما در اختیار داریم به این صورته: اگه میزان فروش روزهای گذشته رو بدونیم، احتمالاً در روزهای آینده چقدر فروش خواهیم داشت؟
دونستن فروش آینده برای ارضای حس کنجکاوی نیست؛ با دونستن این موضوع میشه نقدینگی فروشگاه رو مدیریت کرد و احتمالاً کلی برنامهریزیهای دیگه.
اما در این نوشته، من وارد جزییات آمادهسازی داده و آموزش مدل یادگیر نمیشم، چرا که مقالات آموزنده زیادی به فارسی و انگلیسی در دسترسه و در ادامه فقط یه سری چالشهایی که در این مسیر ممکنه باهاش مواجه بشیم رو مطرح میکنم.
چنانچه گفتم، قرار نیست در این نوشته پیشبینی سری زمانی رو آموزش بدم؛ فقط اجازه بدین تیتروار مراحل انجام کار رو که در اینجا طی کردم اشاره کنم. اگه تجربهی کار با سریهای زمانی رو داشتین از این بخش میتونید عبور کنید.
نتیجه این شده که مدل من (البته بدون ور رفتن با تنظیمات) تونسته روزهای آخر دیتاست رو به شکل زیر پیشبینی کنه، که اصلاً جالب نیست. مشخصه که فقط میانگین رو تشخیص داده!
حدس من اینه که دیتاست ما خیلی کوچیکه (حدود 300 سطر داره) و شاید یک مدل عمیق مثل LSTM واسه کار ما جواب نده! پس چه باید کرد؟
چند روز پیش یه مطلبی نوشتم درباره اهمیت هوش مصنوعی دادهمحور (لینک). گفته بودم که:
ایده اصلی رویکرد هوش مصنوعی دادهمحور اینه که دست از سر مدلهای یادگیر برداریم و کمی هم به دادهها توجه کنیم و حتی مهندسیشون بکنیم!
در این مسئله که ما نمیتونیم دیتای جدید اضافه کنیم (میشه؟)؛ اما شاید با در نظر گرفتن دانش موضوعی یا ساختن ویژگیهای مناسب بتونیم کار مدل رو یکم ساده کنیم.
مثلاً این که...
و ...
من یه سری از این جور ویژگیها اضافه کردم و خروجی پیشبینی با یک مدل غیر عمیق به فرم زیر حاصل شد که از خروجی قبلی بهتره (لینک).
نتیجه: استفاده از ویژگیهای خلاقانه عملکرد مدل یادگیر رو بهبود میده!
دلم نمیاد این نوشته به پایان برسه و از صحنه مبارزه همیشگی با نشتی اطلاعات نگم. نشتی اطلاعات یعنی دادههای تست هم در فرآیند آموزش یه جوری نقش ایفا کنن، که منجر بشه مدل اونا رو هم حفظ کنه.
مطابق معمول ما داده رو به دو بازه آموزش و تست تقسیمبندی میکنیم. تنها نکتهاش اینه که یه مقدار بین بازه آموزش و تست فاصله بندازیم، چون گاهی اوقات دادههای نزدیک به هم همبستگی آماری دارن و این یعنی نشتی اطلاعات.
نکته دیگه این که ما دادههای تست رو هم با مقادیر میانگین و واریانس دادههای آموزش نرمالیزه میکنیم. اگه این کارو نکنیم، انگار داریم داده تست رو با آمارهایی که از آینده اومده حساب میکنیم و این هم یعنی نشتی اطلاعات.
واقعیت اینه که منم در این شاخه از دانش در حال یادگیری هستم. در نتیجه، اگه ایرادی در انجام هر مرحله از این فرآیند به چشمتون خورد یا به نظرتون راه بهتری واسش وجود داره، خوشحال میشم منو از کامنت خودتون دریغ نکنین.
قسمت بعدی این مجموعه به خوشهبندی مشتریان میپردازه که احتمالاً آخرای سال آماده بشه. همچنین شاید در آینده نیمنگاهی به موضوع جذاب تولید سری زمانی بندازیم؛ پس اگه خواستین این مطالب رو از دست ندین این صفحه یا صفحه لینکدین منو دنبال کنید.
در پایان، حالا که سمت چپ مغزمون حسابی درگیر شد، چند بیت از شعر پاسخ سروده مهدی اخوان ثالث میتونه بازی رو به سمت راست زمین ببره.
که بود و کیست دشمنم؟
یگانه دشمن جهان
هم آشکار، هم نهان
همان روانِ بی امان
زمان، زمان، زمان، زمان
سپاه بیکران او
دقیقهها و لحظهها
غروب و بامدادها
گذشتهها و یادها
رفیقها و خویشها
خراشها و ریشها
سراب نوش و نیشها
فریب شاید و اگر