لطفاً کد جواب سوالات را در قالب فایل zip
که شامل ۵ فولدر به ازای هر سوال است در این قسمت آپلود کنید. آپلود نکردن جواب سوالات به منزلهی انصراف از مسابقه میباشد.
توجه: محدودیت سایز فایل زیپ ۲۰ مگابایت میباشد.
فرض کنید شما قرار است قیمتگذار کالاهای دیجیکالا باشید. با کمک گرفتن از دادههای محصولات مشابه و قیمتهای آنها، قیمت باقی محصولات را با توجه به نوع و ویژگیهای محصول محاسبه کنید.
فایل ورودی به نام train.csv
، دارای سه ستون است:
id
: شامل یک شماره یکتا به ازای هر سطر است.product_description
: به فرمت یک dictionary
میباشد و شامل دستهبندی، برند و سایر مشخصات محصول میباشد.price
: شامل قیمت محصول است.همچنین یک فایل به نام test.csv
به شما داده شده است که شامل دو ستون اول ذکر شده در بالا میباشد. از شما خواسته شده است مدلی طراحی کنید که قیمت این محصولات را تخمین بزند.
برای دریافت دادههای آموزش و آزمون روی این لینک کلیک کنید.
فایل خروجی باید دارای نام output.csv
باشد. این فایل باید دارای دو ستون id
و price
باشد. id
باید همان شماره یکتای محصولات فایل test
با همان ترتیب باشد و price
قیمت محاسبه شده توسط مدل شما برای آن محصول است.
توجه کنید که مغایرت نام فایل، نام ستونها، ترتیب محصولات، و یا آوردن دو قیمت برای یک محصول باعث میشود به طور کامل امتیاز این بخش را از دست بدهید.
برای ارزیابی خروجیهای شما از معیار ارزیابی Mean Absolute Percentage Error (MAPE) استفاده میشود، که این عدد هر چه به صفر نزدیکتر باشد عملکرد شما بهتر بوده است.
نمره این سوال بر اساس فرمول زیر محاسبه میشود که هر چه به صد در صد نزدیکتر باشد، یعنی شما بهتر عمل کردهاید و به همان نسبت امتیاز این سوال را کسب میکنید.
در پنل فروشندگان دیجیکالا هنگامیکه فروشندگان محصولات خود را برای فروش به وبسایت اضافه میکنند باید برای هر محصول، تعدادی از تصاویر آن محصول را نیز ارسال کنند؛ اما هر تصویر ممکن است مناسب نباشد زیرا تصاویر باید یک شرایط از قبل تعیینشدهای را رعایت کنند. یکی از این شرایط نبود هیچگونه واترمارک بر روی تصویر است. در این مسئله از شما میخواهیم با استفاده از دادههایی که در اختیار شما قرار داده شده است مدلی آموزش دهید که توانایی تشخیص وجود واترمارک را داشته باشد.
مجموعهدادهای که در اختیار شما قرار داده شده دارای دو بخش آموزش و آزمون میباشد که در بخش آموزش، مجموعهای از تصاویر که دارای واترمارک هستند در پوشهی positive
و مجموعهای از تصاویر که در آنها واترمارک دیده نمیشود در پوشهی negative
قرار گرفتهاند. شما باید با استفاده از این تصاویر، الگوریتم یادگیری ماشین خود را آموزش داده و سپس پیشبینی کنید که هرکدام از تصاویر موجود در پوشهی آزمون دارای واترمارک هستند یا خیر.
خروجیهای تولید شده برای تصاویر پوشهی آزمون را در قالب فایل output.csv
با فرمت نمونه زیر تولید کنید و سپس فایل output.csv
خود را با فرمت zip
فشرده کرده و آپلود کنید. دقت داشته باشید که در ستون predicted
مقدار 1 بیانگر وجود واترمارک بوده و مقدار 0 بیانگر عدم وجود واترمارک است.
احتمالاً شما هم از آن دست کاربرانی باشید که یک سری محصول خاص را بصورت دورهای مصرف میکنید و زمانی که آن محصول مصرف شد، نوبت خرید دوباره فرا میرسد. هدف ما در این مسأله تشخیص همین عادتهای خرید (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 |
در بخش قبلی اشاره شد که آخرین خرید هر جفت «کاربر-محصول» برای ارزیابی برداشته میشود و جواب شما نیز با همان آخرین خرید مقایسه خواهد شد. فرمول ارزیابی میانگین وزندار تفاوت پیشبینی شما از تاریخ خرید بعدی و تاریخ اصلی خرید بعدی هر جفت «کاربر-محصول» در نظر گرفته شده و طبق روند زیر محاسبه میشود:
در فرمول بالا:
score
است. score=100
) یعنی میانگین اختلاف روزهای پیشبینیشده ۰ بوده و بدترین جواب (score=0
) یعنی شما به طور میانگین ۱۰۰ روز از حالت واقعی فاصله داشتهاید. طبیعتاً شما باید تلاش کنید که score
به بیشترین مقدار (۱۰۰) برسد.score
خواهد بود. برای مثال اگر فردی تمامی تاریخها را ۵ روز دیرتر پیشبینی کرده باشد، مقدار score
وی برابر با ۹۵ خواهد بود.error
شما وزن بیشتری دریافت کند (به اصطلاح بیشتر punish شوید).برای ارسال جواب این سوال، شما میبایست تاریخ خرید بعدی هر جفت «کاربر-محصول» را درون جدول answer.csv
ذخیره کرده (بدون دو ستون اول) و این فایل را zip
کرده و آپلود کنید. به موارد زیر هنگام ساختن فایل خروجی دقت کنید:
next_purchase
نگهداری شود.answer.csv
باشد.header
ستون گذاشته شود.index
خودداری کنید.zip
اهمیتی ندارد.answer.csv
🔗فایل خروجی شما (answer.csv
) باید دارای یک ستون و ۳۱۸,۰۵۰ ردیف (بدون احتساب header
) باشد. همچنین ترتیب تاریخهای نوشتهشده باید مثل همان ترتیب اولیه در فایل answer.csv
باشد وگرنه نمرهی شما اشتباه محاسبه خواهد شد.
دیجیکالا تعداد زیادی انبار در مکانهای مختلف دارد. در یکی از شبها دزدی وارد یکی از انبارهای دیجیکالا شده و چند جعبه از انبار خارج کرده است. از آنجا که این دزد بسیار باهوش بوده به شکلی این کار را انجام داده است که از راه دوربینهای انبار قابل ردیابی نباشد. در این سوال میخواهیم بدانیم اگر به همین شکل از بقیهی انبارها دزدی شود حداکثر چند جعبه میتواند از هر انبار خارج شود. فرض کنید هر انبار یک مستطیل n×m
است که میتوان با یک ماتریس تعداد جعبههای هر خانه را نشان داد. همچنین فرض کنید هر شب از هر انبار سه عکس گرفته میشود؛ از جلو، بغل و بالا.
برای مثال برای انبار زیر:
این عکسها گرفته میشود:
و یک دزد میتواند از این انبار به شکل زیر حداکثر ۹ جعبه را بردارد و بقیه را طوری جابجا کند که از دوربینها همان عکسهای بالا گرفته شود.
در اول خط اول ۲ عدد صحیح r
و c
که به ترتیب طول و عرض انبار هستند داده میشود. در r
خط بعدی در هر خط c
عدد داده میشود که هر کدام تعداد جعبهها هستند.
در خروجی بیشترین جعبهای که میتواند از انبار خارج شود طوری که از عکس دوربینها مشخص نباشد را چاپ کنید.
معیار normalized Discounted Cumulative Gain یا به اختصار nDCG یک معیار (metric) رایج جهت ارزیابی خروجی یک موتور جستجوگر یا هر سیستم رنکینگ دیگر است. مقدار این متریک عددی بین صفر و یک است که از جمله ویژگیهای آن، اندازهگیری میزان درستی در مرتبسازی نتایج میباشد.
این معیار نرمالایز شدهی معیار DCG میباشد. برای محاسبهی DCG از رابطهی زیر استفاده میشود:
همانطور که مشاهده میکنید این معیار میتواند برای کوئریهای مختلف، اسیکلهای مختلف داشته باشد. به همین دلیل معیار nDCG معرفی میشود که برای محاسبهی آن از رابطهی زیر استفاده میکنیم.
در رابطهی بالا IDCG برابر است با مقدار DCG برای حالت ایدهآل مرتبسازی:
برای اطلاعات بیشتر دربارهی این متریک میتوانید اینجا کلیک کنید.
ما در دیجیکالا برای محاسبه این متریک از دادهی کلیک کاربران به روی نتایج موتور جستجوگر استفاده میکنیم. فرض کنید جدول زیر موجود باشد. در این جدول هر سطر نشانگر تعداد کلیک بروی نتیجهی سرچ یک کوئری در پوزیشنِ مربوطه است.
query | click_count | position |
---|---|---|
pocox3 | 89 | 1 |
pocox3 | 88 | 2 |
iphone13 | 100 | 1 |
... | ... | ... |
در این مسئله شما باید با استفاده از این دادهها و طراحی یک کوئری sql مناسب، این متریک را برای دادگان کلیک کاربران محاسبه کنید. نمونه فایل دادگان و خروجی مورد نظر در ادامه آورده شده است:
دریافت نمونه فایل دادگان (demo_testset.zip)
در این فایل دیتابیس sqlite
با نام testset.sqlite
شامل جدولی با نام dk_table
در اختیار شما قرار گرفته است. همچنین خروجیی که با اجرای درست کوئری تولید میشود نیز در فایلی به نام testset_gt.csv
به شما داده شده است.
در این مسئله شما باید کوئری خود را در قالب یک فایل با فرمت sql (مانند query.sql) در سایت بارگذاری کنید.
خروجی شما باید شرایط زیر را داشته باشد:
query
و دیگری ndcg
نامیده شود.query
رشته و برای ستون ndcg
عدد اعشاری float باشد.query
داپلیکت نداشته باشد.query
ها محاسبه شده باشد. خروجی کد sql شما با خروجی کد زیر مقایسه میشود:
برای داشتن تابع لگاریتم در sqlite میتوانید کانکشن را به صورت زیر بسازید:
نکته: در این سوال از ورژن 3.31 دیتابیس sqlite استفاده شده است.