احتمالاً شما هم از آن دست کاربرانی باشید که یک سری محصول خاص را بصورت دورهای مصرف میکنید و زمانی که آن محصول مصرف شد، نوبت خرید دوباره فرا میرسد. هدف ما در این مسأله تشخیص همین عادتهای خرید (Purchase Habits) و پیشنهاد خرید بعدی به کاربران است. با این کار کاربران زمان کمتری را صرف پیدا کردن محصولات موردنظرشان میکنند.
صورت مسئله
همانطور که گفته شد، هدف ما این است که دریابیم هر کاربر در دیجیکالا چه محصولاتی را بصورت دورهای خریداری میکند. بصورت دقیقتر، میخواهیم بفهمیم که کاربر U کالای P را هر چند روز یک بار خریداری میکند و وقتی که موعد خرید بعدیاش رسید، به وی پیشنهاد خرید کالا را بدهیم. طبیعتاً برای این کار به تاریخچهی خرید کاربرها نیاز داریم که در بخش بعدی در مورد آن صحبت خواهیم کرد.
شما ابتدا باید هر جفت «کاربر-محصول» را جدا کرده و سپس سعی کنید با تست کردن الگوریتمهای مختلف پیشبینی کنید که تاریخ خرید بعدی این کاربر از همین محصول چه زمانیست. روند مسأله ساده بوده و کار اصلی شما تلاش برای پیدا کردن دقیق دوره برای هر جفت «کاربر-محصول» و پیشنهاد تاریخ خرید بعدی است.
توجه
به عبارت «جفت» دقت کنید. در آخر شما باید به ازای هر جفت، یک تاریخ خروجی بدهید.
دادگان
ابتدا فایل تاریخچهی خرید و فرمت جوابی که باید آپلود کنید را از این لینک دریافت کنید. فایل purchase_history.csv بخشی از خریدهای کاربران و تاریخشان را شامل میشود (البته آخرین خرید آنها حذف و برای ارزیابی نگهداری شده است). شما میبایست عملیاتتان را روی فایل purchase_history.csv انجام داده و خروجی را درون فایل answer.csv ذخیره کنید. چند ردیف از فایل purchase_history.csv را در جدول زیر مشاهده میکنید:
| user_id | product_id | created_at |
|---|---|---|
| 6823506 | 1015421 | 2019-06-10 |
| 11886162 | 5622949 | 2019-11-27 |
ارزیابی
در بخش قبلی اشاره شد که آخرین خرید هر جفت «کاربر-محصول» برای ارزیابی برداشته میشود و جواب شما نیز با همان آخرین خرید مقایسه خواهد شد. فرمول ارزیابی میانگین وزندار تفاوت پیشبینی شما از تاریخ خرید بعدی و تاریخ اصلی خرید بعدی هر جفت «کاربر-محصول» در نظر گرفته شده و طبق روند زیر محاسبه میشود:
$$ error = abs(predicted_i - actual_i) $$ $$ total_error = \frac{\sum(error * 1.04^{error})}{\sum(1.04^{error})} $$ $$ score = max(100 - total_error, 0) $$
در فرمول بالا:
- مقدار $n$ تعداد نمونههای دادگان خروجیست.
- مقدار $predicted_i$ تاریخ پیشبینیشدهی ردیف $i$ام توسط شماست.
- مقدار $actual_i$ تاریخیست که مشتری ردیف $i$ کالای ردیف $i$ را خریده است.
- امتیاز شما در نهایت مقدار
scoreاست.
توضیحات
- بهترین جواب (
score=100) یعنی میانگین اختلاف روزهای پیشبینیشده ۰ بوده و بدترین جواب (score=0) یعنی شما به طور میانگین ۱۰۰ روز از حالت واقعی فاصله داشتهاید. طبیعتاً شما باید تلاش کنید کهscoreبه بیشترین مقدار (۱۰۰) برسد. - میانگین تفاوت بیشتر از ۱۰۰ روز در واقع برای ما ارزشی نداشته و به همین دلیل لحاظ نمیشوند و شما به ازای آن جوابها نمرهای دریافت نخواهید کرد.
- برای اختلافهای بیشتر از ۱۰۰ (x > 100)، همان وزن عدد ۱۰۰ را دریافت خواهید کرد. به بیانی دیگر، ماکسیمم مقدار وزن هر اختلاف (x) برابر با $1.04^{100}$ هست.
- امتیاز شما برای این سوال دقیقاً همین مقدار
scoreخواهد بود. برای مثال اگر فردی تمامی تاریخها را ۵ روز دیرتر پیشبینی کرده باشد، مقدارscoreوی برابر با ۹۵ خواهد بود. - منطق این نحوهی وزندهی بدین صورت است که برای اختلاف روزهای بیشتر،
errorشما وزن بیشتری دریافت کند (به اصطلاح بیشتر punish شوید).
خروجی
برای ارسال جواب این سوال، شما میبایست تاریخ خرید بعدی هر جفت «کاربر-محصول» را درون جدول answer.csv ذخیره کرده (بدون دو ستون اول) و این فایل را zip کرده و آپلود کنید. به موارد زیر هنگام ساختن فایل خروجی دقت کنید:
- پاسخ شما باید داخل ستون
next_purchaseنگهداری شود. - اسم فایل باید
answer.csvباشد. - حتماً
headerستون گذاشته شود. - از گذاشتن ستونی برای
indexخودداری کنید. - نام فایل نهایی
zipاهمیتی ندارد.
نمونهی فایل خروجی answer.csv
next_purchase
2019-09-14
2019-10-28
2019-01-01
توجه ویژه
فایل خروجی شما (answer.csv) باید دارای یک ستون و ۳۱۸,۰۵۰ ردیف (بدون احتساب header) باشد. همچنین ترتیب تاریخهای نوشتهشده باید مثل همان ترتیب اولیه در فایل answer.csv باشد وگرنه نمرهی شما اشتباه محاسبه خواهد شد.
ارسال پاسخ برای این سؤال