تعریف مسئله:
روزانه صدها هزار کاربر و خریدار آنلاین به موتور جستجو ترب مراجعه می کنند تا کالاهای موردنظر خود را از بین بیش از ۱۰ میلیون محصول و ۱۵ هزار فروشنده آنلاین فعال پیدا کنند و قیمت و شرایط فروش فروشندگان مختلف را با یکدیگر مقایسه کنند. یکی از پرکاربردترین مسیرهای پیدا کردن یک کالا توسط کاربران در ترب، جستجو نام محصول موردنظر است؛ بنابراین کیفیت نتایج جستجو از اهمیت بسیار بالایی برخوردار است و موتور جستجو ترب همیشه سعی می کند به بهترین نحو منظور کاربران را متوجه بشود و مرتبط ترین نتایج جستجو را به آن ها نمایش دهد.
با این حال، تشخیص خودکار میزان ارتباط بین محصولات با عبارت جستجو وارد شده توسط کاربر، و همچنین تعیین ترتیب نمایش محصولات مرتبط در نتایج جستجو، ساده نیست و عموما مسالهای چالشی است! اینجاست که شما به عنوان یکی از شرکت کنندگان «چالش دیتا ترب ۲۰۲۳» این فرصت را دارید تا توانمندیها و مهارتهای دیتایی خود را در یک مساله دنیای واقعی با دیتا کاملا واقعی محک بزنید.
در این چالش، بخشی از اطلاعات جستجوهای کاربران ترب و کلیک های آن ها روی نتایج جستجو در یک بازه زمانی مشخص به شما داده شده است و از شما خواسته شده است تا برای تعدادی عبارت جستجو جدید و محصولات مرتبط با آنها، بهترین رتبه بندی محصولات در نتایج جستجو را پیدا کنید.
برای مثال، فرض کنید تعدادی از رکوردهای جستجو داده شده متعلق به جستجو عبارت «آیفون» یا «قاب آیفون» باشند و همچنین اطلاعات مربوط به محصولات کلیک شده توسط کاربران در این جستجوها نیز داده شده باشد. بر اساس این اطلاعات، شما باید روشی را پیاده سازی کنید که بتواند برای عبارت جستجو «آیفون ۱۳»، که ممکن است در داده های آزمایشی (تست) باشد، و محصولات مرتبط با آن، بهترین رتبه بندی محصولات را پیشبینی کند به طوری که تعداد کلیک های دریافتی محصولات از رتبه اول تا آخر، نزولی باشد.
بدین صورت، با استفاده از این مدل می توانیم نتایج جستجو یک عبارت را به شکلی مرتب کنیم و به کاربر نمایش دهیم که مرتبطترین و محبوبترین محصولات (یا پرکلیکترین محصولات) در ابتدای نتایج جستجو نمایش داده شوند. در نتیجه می توانیم اطمینان خاطر داشته باشیم که کیفیت نتایج جستجو از سطح بالایی برخوردار است و منجر به رضایت کاربران و تجربه کاربری بهتری برای آن ها خواهد شد.
به طور دقیق تر، به این مساله در حوزه هوش مصنوعی و یادگیری ماشین، اصطلاحا «یادگیری رتبهبندی» یا Learning to rank (اختصارا LTR) گفته می شود. در این دسته از مسائل به دنبال آموزش یک مدل «یادگیری» (ranking) بر اساس دیتا آموزشی هستیم که شامل لیستی از آیتم ها (مانند نتایج جستجو در یک موتور جستجو، کلیپ های ویدیویی در یک شبکه اجتماعی، فیلم و موسیقی در یک سرویس پخش آنلاین و …) با ترتیب جزئی است. این ترتیب جزئی بر اساس یک معیار «ارتباط» (relevancy) تعریف می شود که خود این معیار در کاربردهای مختلف می تواند تعاریف متفاوتی داشته باشد. در این چالش، آیتم های موردنظر برای رتبهبندی، محصولات نتایج جستجو ترب است و معیار «ارتباط» نیز «کلیک های کاربران» بر روی محصولات در نتایج جستجو میباشد.
این چالش در دو مرحله برگزار می شود:
- مرحله آفلاین: در این مرحله که دو ماه به طول خواهد انجامید، شما با دیگر شرکتکنندگان رقابت خواهید کرد، بدین شکل که با در اختیار داشتن داده های آموزشی، بهترین رتبهبندی را برای تعدادی نمونه آزمایشی (تست) پیدا کنید. در این مرحله، شما فقط جواب های خود را برای نمونه های آزمایشی داده شده، از طریق پلتفرم RoboEpics ارسال می کنید که به صورت خودکار تصحیح می شوند و لحظاتی بعد می توانید دقت جواب خود را مشاهده کنید. توجه کنید که برای جلوگیری از overfit شدن مدل ها بر روی داده های تست جدول امتیازات به دو جدول عمومی و خصوصی (public leaderboard و private leaderboard) تقسیم می شود. جدول عمومی در طول زمان برگزاری مسابقه برای همه شرکت کنندهها قابل دیدن است ولی دقت جواب های ارسالی شما را فقط بر روی تقریبا ۳۰ درصد از نمونه های آزمایشی نمایش میدهد.
- در حالی که جدول خصوصی فقط بعد از اتمام مسابقه قابل دیدن خواهد بود و دقت جواب ها را بر روی ۷۰ درصد باقی مانده از نمونههای آزمایشی نمایش میدهد. همچنین ملاک انتخاب تیم های برتر برای مرحله بعد، امتیاز و رتبه آن ها در جدول امتیازات خصوصی خواهد بود. این روند مشابه دیگر پلتفرم های آنلاین مسابقات دیتا خواهد بود. به عنوان مثال مسابقه ای از کگل در این لینک را ببینید.
- مرحله آنلاین: در این مرحله، تیم های برتر مرحله آفلاین کدهای پیاده سازی شده خود را برای برگزارکنندگان ارسال می کنند و بعد از بررسی و تایید کدهای ارسالی توسط تیم برگزاری مسابقه، مرحله آنلاین چالش آغاز می شود. در این مرحله، عملکرد مدلهای تیمهای برتر به صورت آنلاین بر روی اپلیکیشن ترب ارزیابی می شود بدین صورت که برای تعدادی از عبارتهای جستجو و محصولات مرتبط با آن ها، نتایج پیشبینی شده توسط مدلهای شرکت کنندگان بر روی اپلیکیشن ترب نمایش داده می شود و بر اساس کلیک های کاربران بر روی نتایج نشان داده شده، تیم های برتر معرفی میشوند.
لطفا حتما پیش از شروع، شرایط و قوانین شرکت در مسابقه، توصیف ساختار داده ها، نحوه ارزیابی و فرمت خروجی را به دقت مطالعه کنید. برای آشنایی بیشتر با دادههای مسابقه، نوتبوکی تحت عنوان EDA و نوتبوک دیگری با راه حل بیس لاین برای شما تهیه شده است. توصیه می کنیم این دو نوتبوک را ابتدا مطالعه و اجرا کنید تا دید و فهم بهتری نسبت به چالش و دیتای آن داشته باشید.
ساختار داده ها:
تمامی داده های چالش به صورت فایل هایی با فرمت JSON Lines در اختیار شما قرار گرفتهاند. این فرمت بسیار مشابه با فرمت JSON است، تنها با این تفاوت که هر آیتم/رکورد به صورت جداگانه در یک خط قرار گرفته است. مثال:
{"field1": value, "field2": value, "field3": value, …., "fieldN": value}
{"field1": value, "field2": value, "field3": value, …., "fieldN": value}
{"field1": value, "field2": value, "field3": value, …., "fieldN": value}
{"field1": value, "field2": value, "field3": value, …., "fieldN": value}
در نوت بوک پیاده سازی راه حل بیس لاین یک تابع به نام read_json_lines
پیاده سازی شده است که می تواند فایل های با این فرمت را خط به خط بخواند. شما نیز می توانید از همین تابع استفاده کنید.
دیتا چالش به صورت یک فایل فشرده با فرمت 7z در اختیار شما قرار گرفته است که شامل سه فایل می باشد:
- فایل
torob-search-data_v1.jsonl
: این فایل شامل بخشی از اطلاعات جستجو کاربران و کلیک های آن ها بر روی نتایج جستجو می باشد. هر رکورد از این فایل مربوط به یک جستجو انجام شده توسط یک کاربر است. جدول زیر فیلدهای هر یک از رکوردهای موجود در این فایل را توضیح می دهد:
توضیحات | نوع | نام فیلد |
---|---|---|
عبارت جستجو (کوئری) خام وارد شده توسط کاربر بدون هیچ گونه پردازش اضافی بر روی آن. | string | raw_query |
آیدی محصولات نمایش داده شده در نتایج جستجو به صورت مرتب (اولین آیدی لیست، اولین محصول نمایش داده شده است). اگر اطلاعات یک محصول موجود نباشد، به جای آیدی آن مقدار None در نظر گرفته شده است. | list(int) | result |
آیدی محصولات کلیک شده در این جستجو. اگر هیچ محصولی کلیک نشده باشد، مقدار این فیلد یک لیست خالی خواهد بود. | list(int) | clicked_result |
رتبه محصولات در نتایج جستجو که کلیک شده اند. دقت کنید که اولین محصول در نتایج جستجو رتبه صفر دارد. همچنین اگر هیچ محصولی کلیک نشده باشد، مقدار این فیلد یک لیست خالی خواهد بود. | list(int) | clicked_rank |
تاریخ و زمان انجام جستجو. به صورت فرمت iso نمایش داده شده است (در پایتون معادل با خروجی datetime.isoformat است). | string | timestamp |
- فایل
products-info_v1.jsonl
: این فایل شامل اطلاعات مربوط به محصولات است. هر رکورد از این فایل مربوط به یک محصول یکتا می باشد. جدول زیر فیلدهای هر یک از رکوردهای موجود در این فایل را توضیح می دهد:
توضیحات | نوع | نام فیلد |
---|---|---|
آیدی یکتای محصول. | int | id |
نام دسته بندی محصول. | string | category_name |
هر محصول ممکن است چندین فروشنده مختلف داشته باشد و هر کدام از این فروشنده ها یک عنوان متفاوت برای محصول در نظر گرفته باشد. این فیلد حاوی لیستی از عناوین مختلفی است که این محصول دارد. | list(string) | titles |
حداقل قیمت نشان داده شده به کاربران در نتایج جستجو برای این محصول در طول بازه زمانی جمع آوری دیتا. اگر یک محصول در این بازه زمانی هیچ فروشنده ای نداشته باشد (به صورت «ناموجود» در نتایج جستجو نمایش داده می شود)، حداقل قیمت آن برابر null خواهد بود. | int | null | min_price |
حداکثر قیمت نشان داده شده به کاربران در نتایج جستجو برای این محصول در طول بازه زمانی جمع آوری دیتا. اگر یک محصول در این بازه زمانی هیچ فروشنده ای نداشته باشد (به صورت «ناموجود» در نتایج جستجو نمایش داده می شود)، حداکثر قیمت آن برابر null خواهد بود. | int | null | max_price |
میانگین قیمت نشان داده شده به کاربران در نتایج جستجو برای این محصول در طول بازه زمانی جمع آوری دیتا. اگر یک محصول در این بازه زمانی هیچ فروشنده ای نداشته باشد (به صورت «ناموجود» در نتایج جستجو نمایش داده می شود)، میانگین قیمت آن برابر null خواهد بود. | int | null | avg_price |
حداقل تعداد فروشندگان این محصول در طول بازه زمانی جمع آوری دیتا. اگر یک محصول در این بازه زمانی هیچ فروشنده ای نداشته باشد (به صورت «ناموجود» در نتایج جستجو نمایش داده می شود)، حداقل تعداد فروشنده های آن برابر صفر خواهد بود. | int | min_num_shops |
حداکثر تعداد فروشندگان این محصول در طول بازه زمانی جمع آوری دیتا. اگر یک محصول در این بازه زمانی هیچ فروشنده ای نداشته باشد (به صورت «ناموجود» در نتایج جستجو نمایش داده میشود)، حداکثر تعداد فروشنده های آن برابر صفر خواهد بود. | int | max_num_shops |
میانگین تعداد فروشندگان این محصول در طول بازه زمانی جمع آوری دیتا. اگر یک محصول در این بازه زمانی هیچ فروشنده ای نداشته باشد (به صورت «ناموجود» در نتایج جستجو نمایش داده میشود)، میانگین تعداد فروشنده های آن برابر صفر خواهد بود. | int | avg_num_shops |
- فایل
test-offline-data_v1.jsonl
: این فایل شامل اطلاعات نمونه های آزمایشی (تست) است. پاسخ های ارسالی توسط شرکتکنندگان براساس نمونه های موجود در این فایل خواهد بود. هر رکورد از فایل مربوط به یک نمونه آزمایشی است. جدول زیر فیلدهای هر یک از رکوردهای موجود در این فایل را توضیح می دهد:
توضیحات | نوع | نام فیلد |
---|---|---|
عبارت (کوئری) جستجو خام. | string | raw_query |
لیست نامرتب (بدون رتبه بندی) محصولات مرتبط با عبارت جستجو. دقت کنید که برای نمونه های آزمایشی مختلف، تعداد محصولات داده شده در این لیست لزوما با هم برابر نیست و می توانند متفاوت باشند. | list(int) | result_not_ranked |
ساختار خروجی:
فایل ارسالی توسط شما باید حتما با نام predictions.txt
باشد. لازم است در هر خط از آن، به همان ترتیبی که نمونه های آزمایشی (تست) داده شده اند، بهترین رتبه بندی محصولات هر نمونه تست آورده شود به طوری که آیدی محصولات در هر خط با کاراکتر کاما انگلیسی (,) از هم جدا شده باشند. به نمونه زیر توجه کنید:
100,50,789,97272,902,192
89,900,3453,1827,29013,19282,18382,182,18
7382,2502,82403,2842,28473,53274,274,89100
در مثال فوق، برای نمونه اول (خط اول)، محصول با آیدی ۱۰۰ بهترین و مرتبطترین محصول است (رتبه یک نتایج جستجو) و محصول آیدی ۵۰ در رتبه بعدی (رتبه دو نتایج جستجو) قرار میگیرد و به همین ترتیب آیدی محصولات رتبههای بعدی نوشته شده اند.
به عبارت دیگر، تعداد خطوط فایل ارسالی باید به اندازه تعداد نمونه های آزمایشی باشد. در غیر این صورت، فایل ارسالی به صورت خودکار تصحیح نخواهد شد. به علاوه، برای هر نمونه آزمایشی باید دقیقا همگی آیدی های محصولات داده شده استفاده و رتبهبندی شوند، در غیر این صورت باز هم فایل ارسالی تصحیح نخواهد شد. برای ذخیره پیشبینی ها در داخل یک فایل، یک تابع به نام write_test_predictions
در انتهای نوت بوک بیس لاین قرار داده شده است که می توانید از آن استفاده کنید.
نحوه ارزیابی:
یکی از رایج ترین معیارها برای سنجش عملکرد الگوریتم های رتبهبندی، استفاده از معیار Normalized Discounted Cumulative Gain یا به اختصار NDCG می باشد. برای تعریف NDCG ابتدا باید DCG را محاسبه کنیم. مقدار DCG برای یک نمونه آزمایشی که شامل عبارت جستجو Q و لیست محصولات مرتب شده P شامل k محصول می باشد، به صورت زیر تعریف میشود:

در اینجا تابع ����(�)relQ(p) نشان دهنده میزان «ارتباط» (relevance) محصول p با عبارت جستجو Q می باشد. در این چالش، مقدار این تابع را برابر با کل تعداد کلیک های محصول p در جستجوهای عبارت Q در طول بازه زمانی جمع آوری دیتا تعریف می کنیم.
به جهت نرمالایز کردن مقدار ����DCGQ در بازه صفر تا یک، آن را بر مقدار DCG رتبه بندی ایده آل یا بهینه (یعنی رتبهبندی که مقادیر relevance یا همان کلیک محصولات به صورت نزولی باشد)، که آن را با IDCG نمایش می دهند، تقسیم می کنند تا مقدار NDCG محاسبه شود:
�����=���������NDCGQ=IDCGQDCGQ
در این صورت برای پیش بینی های هر نمونه آزمایشی یک مقدار بین صفر تا یک خواهیم داشت، که نشان دهنده میزان خوب بودن یا به عبارتی نزدیکی آن به رتبه بندی ایده آل می باشد. نهایتا لازم است تا تمامی این مقادیر به ازای کوئری های مختلف تجمیع گردند تا یک مقدار نهایی که نشان دهنده کیفیت رتبه بندی مدل است، به دست آید. برای محاسبه این مقدار نهایی، یک میانگین وزن دار از تمامی مقادیر NDCG به ازای تمامی عبارت های جستجو محاسبه می کنیم:
�����=∑���.�����∑���score=∑qwq∑qwq.NDCGq
در اینجا وزن هر نمونه آزمایشی، که با ��wq نمایش داده شده است، برابر است با مجموع تعداد کلیک های محصولات داده شده برای آن نمونه. در نتیجه، هر نمونه آزمایشی با توجه به اهمیت و محبوبیت آن، که عملا با تعداد کلیک های محصولات آن نمونه رابطه مستقیم دارد، در امتیاز نهایی اثرگذار است. هر چه تعداد کلیک های محصولات یک نمونه یا عبارت جستجو بیشتر باشد، اثرگذاری آن در امتیاز نهایی نیز بیشتر است.
جدول امتیازات عمومی و خصوصی
به علاوه باید دقت داشته باشید که برای جلوگیری ازoverfit شدن مدل ها بر روی داده های تست جدول امتیازات به دو جدول عمومی و خصوصی (public leaderboard و private leaderboard) تقسیم می شود. جدول عمومی در طول زمان برگزاری مسابقه برای همه شرکت کنندهها قابل دیدن است ولی دقت جواب های ارسالی شما را (مقدار NDCG Score که در بالا توضیح داده شد) فقط بر روی تقریبا ۳۰ درصد از نمونه های آزمایشی (۳۰ درصد کوئری ها) نمایش می دهد. در عوض، جدول خصوصی فقط بعد از اتمام مرحله اول مسابقه قابل دیدن خواهد بود و دقت جواب ها را بر روی ۷۰ درصد باقیمانده از نمونه های آزمایشی نمایش می دهد. همچنین ملاک انتخاب تیم های برتر برای مرحله بعد، امتیاز و رتبه آن ها در جدول امتیازات خصوصی خواهد بود. واضح است که اگر تیمی بدون توجه به قدرت تعمیم پذیری مدل خود (model generalization)، با تعداد ارسال زیاد و tune کردن بیش از حد مدل خود سعی در overfit کردن آن روی داده های تست داشته باشد، تنها در جدول عمومی امتیازات رتبه خوبی خواهد داشت و در جدول خصوصی به احتمال زیاد شاهد کاهش رتبه خود خواهد بود.
مراحل مختلف مسابقه
یکی از چالشهایی که در مسائل و دیتاستهای یادگیری رتبهبندی وجود دارد، مسئله بایاس جایگاه (position bias) است. این مسئله از این قرار است که با توجه به اینکه نتایج جستجو با ترتیب خاصی به کاربر نمایش داده شده است، احتمال کلیک کاربر بر آیتمهای نخستین بیشتر از احتمال کلیک بر نتایجی است که در رتبههای پایینتر نمایش داده شدهاند. در واقع احتمال کلیک بر روی یک نتیجه جستجو علاوه بر اینکه تابع میزان مقبولیت نتیجه برای کاربر است، تابع جایگاه محصول در نتایج جستجو نیز میباشد. برای اثر دادن این موضوع در چالش دیتا ترب و انتخاب منصفانه بهترین الگوریتم، تیم برگزاری تصمیم گرفتند که چالش امسال همانند سال قبل طی دو مرحله ارزیابی شود:
- مرحله اول (آفلاین): مرحله اول، مانند همه مسابقات حوزه علم داده به صورت آفلاین انجام میشود. به این صورت که در طول مسابقه پاسخ های ارسالی شرکتکنندگان طبق معیاری که در بالا توضیح داده شد، سنجیده می شوند. به این ترتیب که فایل ارسال شده توسط کاربران به ازای هر نمونه آزمایشی با رتبه بندی بهینه مقایسه شده و امتیاز هر ارسال مشخص می شود و در جدول امتیازات قابل مشاهده است. بعد از تمام شدن این مرحله، تعدادی از تیم های برتر به مرحله بعدی راه پیدا می کنند.
- مرحله دوم (آنلاین): با توجه به مسئله بایاس جایگاه که در مقدمه به آن اشاره شد، نمی توان اطمینان داشت که ارزیابی آفلاین بهترین الگوریتم رتبهبندی را مشخص می کند (البته این موضوع، مساله ای بوده است که در تمام مسابقات مشابه برگزار شده وجود داشته است). به همین دلیل الگوریتم های برتر وارد مرحله دوم چالش، یعنی سنجش آنلاین می شوند. عملکرد الگوریتمهای انتخاب شده در این مرحله بر روی موتور جستجو ترب به صورت آنلاین برای تعدادی از عبارتهای جستجو ارزیابی می شود تا مشخص شود با توجه به کلیکهای کاربران کدامیک از روش ها رتبهبندی بهتری برای محصولات ارائه می کند.
ویدئو توضیحات
یک راه حل برای محدودیت های گوگل کولب استفاده از kaggle kernel است.
کتابخانه gdown برای ما داده ها را از گوگل درایو دانلود میکند.
فایل تولیدی از نوع 7z هست که باید تبدیل شود.
نوع داده jasonlines:
تفاوت با json در این است که هر داده در یک خط ذخیره می شود
در مورد learning to rank
Learning to rank[1] or machine-learned ranking (MLR) is the application of machine learning, typically supervised, semi-supervised or reinforcement learning, in the construction of ranking models for information retrieval systems.[2]
یک مدل بازیابی اطلاعات یا سورت کردن آنها
Training data consists of lists of items with some partial order specified between items in each list. This order is typically induced by giving a numerical or ordinal score or a binary judgment (e.g. “relevant” or “not relevant”) for each item.
هدف رنک کردن است.
The goal of constructing the ranking model is to rank new, unseen lists in a similar way to rankings in the training data.