![توضیح تصویر](https://quera.ir/qbox/view/Ni5HRtrj4h/snap.png)
شرکتهای مختلف مجموعه اسنپ نیاز به استفاده از [سیستمهای پیشنهاددهنده](https://fa.wikipedia.org/wiki/%D8%B3%D8%A7%D9%85%D8%A7%D9%86%D9%87_%D8%AA%D9%88%D8%B5%DB%8C%D9%87%E2%80%8C%DA%AF%D8%B1)، جهت پیشنهاد محصول به مشتریان خود دارند. آنها میتوانند با استفاده از تاریخچه امتیاز مشتریان به محصولات مختلف، اقدام به پیشنهاد محصول بکنند، به گونهای که مشتری از محصول پیشنهاد شده استقبال بکند. 😎
بهعنوان مثال:
+ [اسنپتریپ](https://www.snapptrip.com) میتواند هتلهایی را به مسافران پیشنهاد دهد که مسافران مشابه، از آنها راضی بودهاند.
![توضیح تصویر](https://bayanbox.ir/view/8728630199104631117/snapptrip-rs.jpg)
+ [اسنپفود](https://bayanbox.ir/view/2316820097983697622/snappfood.png) میتواند بر اساس امتیاز مشتریان به رستورانها و یا غذاها اقدام به پیشنهاد رستوران/غذا به مشتریان دیگر بکند.
![توضیح تصویر](https://bayanbox.ir/view/2316820097983697622/snappfood.png)
+ [اسنپشاپ](https://snapp.ir/shop?utm_source=snapp-website) میتواند محصولاتی که سیستم پیشنهاددهنده احتمال میدهد امتیاز بالایی از سمت یک سری از مشتریان کسب کند را به آنها با تخفیف شخصیسازی شده، پیشنهاد بدهد.
![توضیح تصویر](https://bayanbox.ir/view/8947909089869372588/SnappShop.jpg)
<details class="pink">
<summary>
**چند دقیقه برای تفکر** 🤔
</summary>
به نظر شما، هر یک از شرکتهای دیگر مجموعه اسنپ که در زیر آورده شدهاند، چه استفادهای از یک سیستم پیشنهاددهنده میتوانند داشته باشند؟
+ [اسنپدکتر](https://snapp.ir/medical-services?utm_source=snapp-website)
+ [اسنپکب](https://snapp.ir/taxi-ride?utm_source=snapp-website)
+ [اسنپمارکت](https://snapp.market)
جواب سوال بالا، جزوی از سوال مسابقه نیست و **صرفا** جهت تفکر و آشنایی شماست. 🤗
</details>
توجه داشته باشید که حتی میتوان از روی تحلیل احساس نظرات (سوال ۳ این مسابقه)، برای محاسبه امتیازی که هر مشتری به یک محصول میدهد، استفاده کرد. 😉
<details class="blue">
<summary>
**بیشتر بدانید** 📚
</summary>
سیستمهای پیشنهاددهنده دارای سابقه طولانی هستند. به عنوان مثال، میتوانید [از اینجا](https://en.wikipedia.org/wiki/Netflix_Prize) در مورد مسابقه سیستم پیشنهاددهنده شرکت پخش فیلم [Netflix](https://fa.wikipedia.org/wiki/%D9%86%D8%AA%D9%81%D9%84%DB%8C%DA%A9%D8%B3) که در سال ۲۰۰۶ شروع شد، مطالعه کنید.
</details>
# دادگان
در این سوال، شما به تاریخچه امتیازهای مشتریان به محصولات مختلف در طول زمان [از اینجا](https://drive.google.com/file/d/1-BivapOkCSDZclmOGAonw3jxRD4Fm4s5/view?usp=sharing) دسترسی دارید. هنگامی که این فایل را از حالت فشرده خارج کنید. پوشه `data` را میبینید. در صورتی که وارد این پوشه شوید، فایلهای آموزش (`train.csv`) و آزمایش (`test.csv`) در اختیار شما خواهند بود. فایل آموزش، اطلاعات امتیازدهی مشتریان به محصولات مختلف در یک بازه حدودا ۷.۵ سال را نشان میدهد.
جزییات فایل آموزش، در جدول زیر آمدهاست:
| نام ستون | توضیحات ستون |
|:----------|:------------------:|
| userId |شناسه مشتری|
| itemId |شناسه محصول|
| rating |امتیازی که مشتری به محصول مربوطه دادهاست که میتواند یکی از اعداد ۴،۳،۲،۱ یا ۵ باشد|
| date |زمانی که مشتری به محصول مربوطه، امتیاز دادهاست|
فایل آزمایش، برای یک بازه حدودا ۶ ماهه، بعد از زمان دادگان فایل آموزش است و دارای اطلاعات مشتریانی است که به محصولات مختلف در آن بازه، امتیاز دادهاند. توجه داشته باشید که این فایل دارای ستون `rating` نیست و همچنین تنها مشتریان و محصولاتی در آن موجودند که هر دوی آنها، قبلا در دادگان آموزش وجود داشته باشند.
# صورت مسئله
با استفاده از دادگان آموزش، یک مُدل برای یک سیستم پیشنهاددهنده بسازید که برای سهتایی (شناسهمشتری، شناسه محصول و زمان امتیاز دادن) دادگان آزمایش، امتیازی که مشتری میدهد را پیشبینی کند. بدین صورت، مجموعه شرکتهای اسنپ میتوانند محصولی را به یک مشتری پیشنهاد دهند که مطمئن هستند امتیاز بالایی را از سمت مشتری دریافت خواهد کرد. 🥳
<details class="pink">
<summary>
**راهنمایی**
</summary>
**شاید** روشهای زیر، بتوانند به شما در حل این مسئله کمک بکنند:
+ استفاده از روشهای مستقل از زمان/ترتیب مانند `collaborative filtering` و `content based` و یا ترکیبی از هر دو
+ استفاده از الگوریتمهای وابسته به زمان/ترتیب مانند `sequence neural networks` و `convolutional neural networks`
+ استفاده از هر روش مرتبط دیگر با تحلیل داده، سیستمهای پیشنهاددهنده، یادگیری ماشین و یادگیری عمیق
</details>
# ارزیابی
برای ارزیابی مُدل شما از معیار `Root Mean Square Error` یا به اختصار `RMSE` به شرح زیر استفاده میشود:
$$RMSE=\sqrt{\frac{\sum_{i=1}^{n}(r_i-\hat{r}_i)^2}{n}}$$
در فرمول بالا، $r_i$ مقدار واقعی `rating` برای سطر $i$ است و $\hat{r}_i$ نیز مقدار پیشبینی شده مُدل شما برای آن `rating` است. همچنین تعداد نمونههای دادگان را از شماره ۱ تا $n$ در نظر بگیرید. در نهایت، امتیاز شما از این مرحله بر اساس فرمول زیر محاسبه میگردد:
$$score=(1.04-RMSE)\times\frac{100}{104}\times200$$
<details class="green">
<summary>
**توضیحات**
</summary>
یک تابع تصادفی یا تابعی که همیشه یک امتیاز ثابت را پیش بینی میکند، حداقل `RMSE` برابر با ۱.۰۴ برای دادگان این سوال دارد. پس، مدلهایی که `RMSE` آنها ۱.۰۴ یا بزرگتر از آن باشد، به عنوان مدل مناسب این مسئله، مورد قبول قرار نمیگیرند و هرمدلی که چنین عملکردی را روی دادگان آزمایش داشتهباشد، امتیازی از این سوال کسب نمیکند.
</details>
<details class="yellow">
<summary>
**توجه**
</summary>
لطفا در هنگام کار با این دادگان، به نکات زیر توجه داشته باشید:
+ مقدار `RMSE` مدل شما، تا سه رقم اعشار محاسبه (رُند) و در فرمول امتیازدهی بالا، قرار داده میشود.
+ این سوال، امتیاز منفی ندارد. حتی اگر `score` شما، منفی شود. از این سوال حداقل **صفر** امتیاز میگیرید. 😜
+ بیشترین امتیاز ممکن از این سوال ۲۰۰ و کمترین امتیاز ممکن، صفر است.
</details>
# خروجی
پیشبینیهای مدل خود بر روی دادگان آزمایش (`test.csv`) را در فایلی با نام `output.csv` قرار دهید. این فایل باید دارای یک ستون با نام `prediction` باشد که ردیف iام آن، پیشبینی شما برای سطر iام دادگان آزمایش باشد (دقت کنید که این ستون باید حتما دارای `header` باشد).
بعد از آمادهسازی فایل `output.csv`، آن را برای ما بارگذاری کنید.
## نمونه خروجی فایل `output.csv` (فقط سه خط اول به همراه نام ستون)
```
prediction
5
1
3
```
<details class="yellow">
<summary>
**توجه**
</summary>
حتما فایل `output.csv` باید دارای ۱۳۱,۳۵۸ سطر (بدون در نظر گرفتن `header`) و یک ستون باشد.
همچنین نام ستون بایستی بدون `space` در قبل و بعد از نام آن، باشد. در غیر این صورت، سیستم داوری نمرهای به شما نخواهد داد.
پیشبینیهای شما از `rating`ها، میتوانند به صورت عدد اعشاری نیز ارسال بشوند.
</details>
<details class="red">
<summary>
**هشدار 😱**
</summary>
فراموش نکنید که **قبل از پایان زمان مسابقه**، **بایستی** تمامی کدهای این مسابقه را از قسمت **بارگذاری کُد** برای ما ارسال کنید. در غیر این صورت، شما از این مسابقه، امتیازی کسب نمی کنید.
توجه داشته باشید که اگر از `jupter notebook` استفاده می کنید بایستی همانند توضیحات قسمت **بارگذاری کُد**، خروجی `.py` را دریافت و برای ارسال در نظر بگیرید. ارسال فایلهای `jupyter` همانند `.ipynb` مورد قبول واقع نخواهند شد.
</details>
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.