| فایل اولیهی سوال را میتوانید از [این لینک](/contest/assignments/91712/download_problem_initial_project/310800/) دانلود کنید.|
| :--: |
شرکت HonkHonk یک شرکت موفق تاکسی اینترنتی متمرکز در شهر نیویورک هست. این شرکت نزدیک به یک دهه بر روی بهبود دقت و منطق سیستم قیمتگذاری سفرهای خود تحقیق کرده و وقت گذاشته است. نتیجه این تلاشها، یک تابع قیمتگذار پویا با ۳۵۰۰ خط کد شده است.
کد این تابع به شدت محرمانه و حساس هست. به همین دلیل تنها یک نسخه از آن بر روی یک سرور خصوصی نزد مدیرعامل ذخیره شده است. جناب مدیرعامل این سرور در زیر میز خود نگه داشته است تا خیال همه راحت باشد.
یک روز که جناب مدیرعامل مشغول نوشیدن چای بود، طی یک حادثه ناگوار واژگونی لیوان چای آقای مدیرعامل باعث سوختن سرور و پاک شدن اطلاعات درون آن میشود.
حال آقای مدیرعامل برای جلوگیری از ورشکستگی شرکت تصمیم دارد یک سیستم جدید بسازد و جایگزین تابع قیمتگذار قبلی بکند. به همین منظور به کمک فوری شما برای رهایی از این چالش نیاز دارد.
تنها جمله زیر از نحوه کارکرد تابع قیمتگذار قبلی در دسترس است:
> این تابع قیمتگذاری پویا ارائه میداد. قیمت سفرها با توجه به فاکتورهای زمانی، مکانی، آبوهوا و ... محاسبه میشد.
جناب مدیرعامل پس از تلاشهای فراوان، توانسته یک مجموعه داده بسیار ارزشمند از سفرهای انجام شده در چند ماه متوالی در سال ۲۰۱۶ در شهر نیویورک، که توسط شرکت HonkHonk انجام شده و تابع قیمتگذار اصلی هزینه سفر را مشخص کرده است، تهیه کند و در اختیار شما قرار دهد. همینطور جناب مدیرعامل برای بررسی از کیفیت سیستم پیشنهادی شما، قسمتی از این مجموعه داده را نزد خود نگه داشته تا از کیفیت خروجی شما مطمئن باشد.
<details class="yellow">
<summary>**دادگان**</summary>
| نام ستون | توضیحات |
| :----------------------: | :-----------------------------: |
| `id` | یک شناسه منحصر به فرد برای هر سفر. |
| `pickup_datetime` | تاریخ و زمان شروع سفر. |
| `dropoff_datetime` | تاریخ و زمان پایان سفر. |
| `passenger_count` | تعداد مسافران در خودرو. |
| `pickup_longitude` | طول جغرافیایی مکان مبدا سفر. |
| `pickup_latitude` | عرض جغرافیایی مکان مبدا سفر. |
| `dropoff_longitude` | طول جغرافیایی مکان مقصد سفر. |
| `dropoff_latitude` | عرض جغرافیایی مکان مقصد سفر. |
| `store_and_fwd_flag` | نشاندهنده اینکه آیا اطلاعات سفر قبل از ارسال به سرور، در حافظه خودرو ذخیره شده بود یا خیر. (Y/N) |
| `trip_duration` | کل مدت زمان سفر به ثانیه. |
| `total_price` | **(متغیر هدف)** قیمت نهایی و کل سفر به دلار (فقط در `train.csv` موجود است). |
</details>
ماموریت شما این است که با استفاده از این مجموعه داده و تکنیکهای برنامهنویسی، هوش مصنوعی و یادگیری ماشین و همینطور جمعآوری دادههای کمکی مورد نیاز، یک سیستم قیمتگذار پویا برای شرکت HonkHonk طراحی کنید.
**برای این مأموریت آمادهاید؟!**
## معیار ارزیابی
عملکرد مدل شما بر اساس **خطای جذر میانگین مربعات (Root Mean Squared Error - RMSE)** ارزیابی میشود. برای تبدیل این خطا به یک «امتیاز» قابل مقایسه در بازه ۰ تا ۱۰۰، از یک تابع امتیازدهی غیرخطی استفاده میکنیم که در آن امتیاز بالاتر، نشاندهنده عملکرد برتر است.
این سیستم امتیازدهی، خطای مدل شما (RMSE) را در مقایسه با **انحراف معیار (Standard Deviation)** مقادیر واقعی (`std(Y_true)`) میسنجد. انحراف معیار، پراکندگی یا نوسان ذاتی دادههای ترافیک را اندازهگیری میکند. در نتیجه، یک مدل موفق نهتنها باید دقیق باشد، بلکه خطای آن باید نسبت به این نوسانات طبیعی، مقدار ناچیزی باشد.
\[
Score = 100 \times e^{\left(-\frac{\text{RMSE}}{\text{std}(Y_{\text{true}})}\right)}
\]
یک امتیاز ۱۰۰ به معنای پیشبینی کاملاً دقیق (خطای صفر) است. این فرمول به صورت نمایی عمل میکند؛ یعنی به مدلهایی که خطای آنها به مراتب کوچکتر از نوسانات طبیعی دادهها باشد، امتیاز بالایی اختصاص میدهد و با افزایش خطا، امتیاز به سرعت کاهش مییابد.
<details class="red">
<summary>
**توجه**
</summary>
در طول مسابقه امتیازی که مشاهده میکنید، فقط نتیجهی ارزیابی مدل شما روی ۳۰ درصد از دادههای آزمون است. بعد از پایان زمان مسابقه، **امتیاز نهایی** شما روی ۷۰ درصد مابقی محاسبه میشود.
این کار به منظور جلوگیری از بیشبرازش (`overfitting`) و حفظ عمومیت مدل انجام میشود تا مطمئن شویم مدلهایی که دچار بیشبرازش شدهاند، در امتیازدهی نهایی، افت میکنند.
</details>
## نحوهی ارسال پاسخ
برای پاسخ به این سوال ابتدا فایل نوتبوک قرار گرفته در فایل اولیه را باز کنید و سپس مراحل را مطابق آنچه که از شما خواسته شده انجام دهید. در نهایت، پس از اجرای سلول جوابساز (آخرین سلول فایل نوتبوک) فایل `result.zip` ساخته شده را ارسال نمایید.
<details class="red">
<summary>
**هشدار مهم**
</summary>
توجه داشته باشید که پیش از اجرای سلول جوابساز، تغییرات اعمال شده در نوتبوک را با استفاده از کلید میانبر `ctrl+s` ذخیره کرده باشید در غیر این صورت، در پایان مسابقه **نمره** شما به **صفر** تغییر خواهد کرد.
همچنین اگر از کولب برای اجرای این فایل نوتبوک استفاده میکنید، قبل از ارسال فایل `result.zip`، آخرین نسخهی نوتبوک خود را دانلود کرده و داخل فایل ارسالی قرار دهید.
</details>
| فایل اولیهی تمرین را میتوانید از [این لینک](/contest/assignments/91712/download_problem_initial_project/310797/) دانلود کنید. |
| :--: |
شرکت *AeroGen Dynamics* یکی از بزرگترین اپراتورهای مزارع بادی در منطقه است. قلب هر توربین بادی، یک مجموعه گیربکس پیچیده و گرانقیمت به نام **"مجموعه گیربکس سیارهای G-78"** است. خرابی ناگهانی این قطعه میتواند منجر به توقف کامل توربین برای هفتهها، هزینههای تعمیر چند صد هزار دلاری و آسیب به سایر اجزای توربین شود.
تاکنون، این شرکت از استراتژی نگهداری و تعمیرات پیشگیرانه (مبتنی بر برنامه زمانی ثابت) استفاده میکرده است که اغلب منجر به تعویض زودهنگام قطعات سالم و هزینههای غیرضروری میشود. اکنون، AeroGen Dynamics قصد دارد با استفاده از دادههای جمعآوری شده از سیستمهای مانیتورینگ (SCADA)، به سمت **نگهداری و تعمیرات پیشبینانه (Predictive Maintenance)** حرکت کند.
شما به دادههای عملیاتی ناشناسسازی شده از ناوگانی از توربینهای این شرکت دسترسی دارید. این دادهها شامل خوانشهای سری زمانی از سنسورهای مختلف (مانند دما، لرزش، فشار روغن و...) و همچنین مشخصات فنی هر توربین است. هدف شما ساختن یک مدل یادگیری ماشین است که بتواند با تحلیل تاریخچه دادههای یک توربین، **سطح ریسک عملیاتی** آن را در یکی از پنج دسته زیر طبقهبندی کند:
+ **کلاس 0 (ریسک پایین):** توربین در وضعیت عملیاتی سالم قرار دارد.
+ **کلاس 1 (هشدار اولیه):** سیگنالهای اولیه از فرسودگی مشاهده شده است. نیاز به نظارت بیشتر.
+ **کلاس 2 (ریسک متوسط):** فرسودگی به مرحله قابل توجهی رسیده است. برنامهریزی برای بازرسی در آینده نزدیک توصیه میشود.
+ **کلاس 3 (ریسک بالا):** علائم جدی خرابی مشاهده میشود. نیاز به بازرسی فوری.
+ **کلاس 4 (ریسک بحرانی):** خرابی قریبالوقوع است. توربین باید فوراً از مدار خارج شود.
مدل شما به شرکت کمک خواهد کرد تا با پیشبینی دقیق ریسک، تعمیرات را بهینهسازی کرده، عمر مفید قطعات را به حداکثر رسانده و از توقفهای فاجعهبار جلوگیری کند.

----------
## **شرح مجموعه دادهها**
مجموعه داده در اختیار شما به سه بخش اصلی تقسیم شده است: **آموزش (Train)، اعتبارسنجی (Validation) و آزمون (Test)**. هر بخش شامل فایلهای دادهای متفاوتی است که در ادامه توضیح داده میشوند.
**نکات کلیدی در مورد دادههای عملیاتی:**
1. **گمنامسازی دادهها (Anonymization):** به منظور حفظ اسرار تجاری، نام و عملکرد دقیق سنسورها و ویژگیها **ناشناس** شدهاند. شما با شناسههای عددی و حروفی به جای نامهای فیزیکی مواجه خواهید شد. این بدان معناست که شما باید الگوها را مستقیماً از روی دادهها و بدون دانش دامنه قبلی استخراج کنید.
2. **فرمت دادههای هیستوگرام:** بخشی از دادههای سنسورها به جای یک عدد واحد، در قالب **هیستوگرام** ارائه شدهاند. ستونهایی با پیشوند عددی یکسان (مانند`166_0`, `166_1`, `166_2`,...) همگی به **یک سنسور** تعلق دارند و با هم یک هیستوگرام را تشکیل میدهند. هر ستون (`166_0`, `166_1`,...) یک "**bin**" یا بازه از مقادیر آن سنسور را نشان میدهد. این ساختار به جای ثبت یک مقدار لحظهای، توزیع رفتار یک سنسور را در یک بازه زمانی کوتاه ثبت میکند و اطلاعات بسیار غنیتری در مورد نوسانات و الگوهای عملکردی آن ارائه میدهد.
متغیر هدف شما، یعنی همان **کلاسهای ریسک ۰ تا ۴**، بر اساس فاصله زمانی آخرین خوانش سنسور تا لحظه واقعی خرابی گیربکس تعریف شدهاند. این فاصله بر اساس یک «گام زمانی عملیاتی» (*Operational Time Step*) که میتواند معادل ساعت کارکرد باشد، محاسبه میشود:
+ **کلاس 0:** خوانش در فاصله **بیش از 48** گام زمانی قبل از خرابی قرار دارد.
+ **کلاس 1:** خوانش در فاصله **48 تا 24** گام زمانی قبل از خرابی قرار دارد.
+ **کلاس 2:** خوانش در فاصله **24 تا 12** گام زمانی قبل از خرابی قرار دارد.
+ **کلاس 3:** خوانش در فاصله **12 تا 6** گام زمانی قبل از خرابی قرار دارد.
+ **کلاس 4:** خوانش در فاصله **6 تا 0** گام زمانی قبل از خرابی قرار دارد.
در مجموعه آزمون، شما باید برای هر توربین یک برچسب کلاس پیشبینی کنید. برای اینکه مدل خود را آموزش دهید، باید بتوانید این برچسبها را برای دادههای آموزشی بسازید. فایل `train_time_to_event.csv` کلید این کار است. این فایل به شما میگوید که هر توربین در مجموع چه مدت کار کرده (`length_of_study_time_step`) و آیا در این مدت خراب شده است یا خیر (`in_study_repair`).
برای توربینهایی که دچار خرابی شدهاند، `length_of_study_time_step` لحظه دقیق خرابی است. با مقایسه `time_step` هر خوانش سنسور در فایل `train_operational_data.csv` با این لحظه خرابی، میتوانید "زمان باقیمانده تا خرابی" را برای **هر ردیف** محاسبه کرده و برچسب کلاس مربوطه را به آن اختصاص دهید. توربینهایی که هرگز خراب نشدهاند، همیشه در کلاس ۰ (ریسک پایین) قرار دارند.
<details class="blue">
<summary>
**ساختار فایلهای داده**
</summary>
1. **مجموعه داده آموزش (Train Set):**
+ **`train_operational_data.csv`**: این فایل اصلیترین و بزرگترین بخش دادههاست و شامل تاریخچه **کامل** خوانشهای سنسورها در طول زمان برای هر توربین است.
+ **`train_specifications.csv`**: این فایل شامل ویژگیهای **ثابت** و دستهای برای هر توربین است که مشخصات فنی آن را توصیف میکند. به عبارت سادهتر اینکه، هر توربین از چه قطعاتی ساخته شده است. توربین 7 قطعه اصلی دارد که در این فایل، ما میتوانیم ببینیم اون قطعه اصلی از چه نوعی است.
+ **`train_tte.csv`**: این فایل اطلاعات نهایی هر توربین را ارائه میدهد: کل طول عمر عملیاتی مشاهده شده و اینکه آیا در این دوره دچار خرابی شده است یا خیر. این فایل برای ساخت متغیر هدف در مجموعه آموزش استفاده میشود.
2. **مجموعه داده اعتبارسنجی (Validation Set):**
+ **`validation_operational_data.csv`**: برخلاف مجموعه آموزش، این فایل شامل تاریخچه **ناقص** دادههای عملیاتی است. برای هر توربین، دادهها در یک نقطه زمانی تصادفی قطع شدهاند تا یک سناریوی پیشبینی واقعی شبیهسازی شود.
+ **`validation_specifications.csv`**: مشخصات فنی توربینهای موجود در مجموعه اعتبارسنجی.
+ **`validation_labels.csv`**: این فایل حاوی برچسب کلاس واقعی (۰ تا ۴) برای **آخرین خوانش موجود** از هر توربین در مجموعه اعتبارسنجی است. شما از این فایل برای ارزیابی و تنظیم مدل خود استفاده خواهید کرد.
3. **مجموعه داده آزمون (Test Set):**
+ **`test_operational_data.csv`**: مشابه مجموعه اعتبارسنجی، این فایل نیز شامل تاریخچه **ناقص** دادههای عملیاتی برای مجموعهای جدید از توربینهاست.
+ **`test_specifications.csv`**: مشخصات فنی توربینهای موجود در مجموعه آزمون.
+ **خروجی نهایی شما**: شما باید برای **هر توربین** در این مجموعه، یک فایل خروجی با یک پیشبینی نهایی برای `class_label` ارائه دهید. عملکرد نهایی شما بر اساس همین پیشبینیها سنجیده خواهد شد.
</details>
----------
## **ارزیابی مسئله**
برای ارزیابی این مسئله و مدل شما، از »ماتریس هزینه و پاداش» زیر استفاده میکنیم. به ازای هر سطر مقدار امتیاز خام (*Raw Score*) شما محاسبه شده و در نهایت براساس فرمول ذکر شده امتیاز نهایی (*Final Score*) بدست میآید.
| کلاس واقعی (Actual) | پیشبینی 0 (سالم) | پیشبینی 1 (هشدار) | پیشبینی 2 (متوسط) | پیشبینی 3 (بالا) | پیشبینی 4 (بحرانی) |
| ------------------- | ----------------- | ------------------ | ------------------ | ----------------- | ------------------- |
| **0 (سالم)** | **2.5** | 2- | 4- | 8- | 12- |
| **1 (هشدار)** | 15- | **20+** | 3- | 6- | 10- |
| **2 (متوسط)** | 30- | 15- | **40+** | 5- | 8- |
| **3 (بالا)** | 50- | 30- | 15- | **80+** | 5- |
| **4 (بحرانی)** | 80- | 50- | 30- | 15- | **150+** |
**فرمول نهایی محاسبه امتیاز:**
\[
Final\ Score = 100 \times \frac{\max\!\left(0, Raw\ Score\right)}{Maximum\ Possible\ Score}
\]
----------
## **فرمت پاسخ**
شما باید با توجه به فایل **`test_operational_data.csv`**، به ازای هر *vehicle_id* موجود در دیتاست test، آخرین وضعیت دستگاه را (که در چه کلاسی قرار میگیرد) را پیشبینی کنید.
خروجی شما باید شامل یک فایل `submission.csv` باشد که آخرین وضعیت دستگاه را مشخص میکند. یعنی به ازای هر *vehicle_id* تنها یک سطر در فایل `submission.csv` باید داشته باشیم.
+ ستونها باید شامل `vehicle_id` و `class_label` باشند. همچنین فایل نهایی به ترتیب صعودی `vehicle_id` مرتب شده باشد.
| *vehicle_id* | *class_label* |
|:---------:|:----------:|
| 1 | ؟|
| 6 | ؟ |
| ... | ... |
| 33638 | ؟ |
> در نهایت `submission.csv` به همراه نوتبوک مربوطه را **zip** کرده و ارسال نمایید.
<details class="red">
<summary>
**توجه**
</summary>
در طول مسابقه امتیازی که مشاهده میکنید، فقط نتیجهی ارزیابی مدل شما روی ۳۰ درصد از دادههای آزمون است. بعد از پایان زمان مسابقه، **امتیاز نهایی** شما روی ۷۰ درصد مابقی محاسبه میشود.
این کار به منظور جلوگیری از بیشبرازش (`overfitting`) و حفظ عمومیت مدل انجام میشود تا مطمئن شویم مدلهایی که دچار بیشبرازش شدهاند، در امتیازدهی نهایی، افت میکنند.
</details>