
نطلق اليوم مسابقة Rekko Challenge 2019 ، وهي مسابقة تعلم الآلة من مسرح أفلام Okko عبر الإنترنت.
نقترح عليك بناء نظام توصيات على البيانات الحقيقية لإحدى أكبر دور السينما على الإنترنت الروسية. نحن على يقين من أن هذه المهمة ستكون ممتعة لكل من المبتدئين والمتخصصين ذوي الخبرة. لقد حاولنا الحفاظ على الحد الأقصى لنطاق الإبداع ، بينما لا نفرط في تحميلك بمجموعات بيانات غيغابايت مع مئات الميزات المحسوبة مسبقًا.
اقرأ المزيد عن Okko ، المهمة ، البيانات ، الجوائز والقواعد - أدناه.
التحدي
يمكنك الوصول إلى البيانات المتعلقة بجميع طرق العرض والتقييمات والإضافات إلى الأفلام والمسلسلات "المحفوظة" من قبل المستخدم لمدة N يوم (N> 60) ، وكذلك جميع المعلومات الوصفية حول المحتوى. من الضروري التنبؤ بالأفلام والمسلسلات التي سيشتريها المستخدم أو يشاهدها بالاشتراك على مدار 60 يومًا القادمة.
في القسم التالي ، حاولنا وصف الحد الأدنى لما تحتاج إلى معرفته عن دور السينما على الإنترنت لفهم البيانات بسرعة والبدء في تحليلها. إذا لم تكن هذه المعلومات مناسبة لك ، فيمكنك المتابعة فورًا إلى وصف البيانات .
حول خدمتنا
إذا أراد أحد المستخدمين مشاهدة فيلم بطريقة قانونية على الإنترنت ، فلديه ثلاث طرق رئيسية.
الطريقة الأولى هي المشاهدة مجانًا ، والمقاطعة المستمرة في الإعلانات التجارية ( AVOD ، إعلان فيديو عند الطلب). والثاني هو شراء فيلم لجمع الخاصة بك أو الإيجار ( TVOD ، Transactional Video On Demand). والثالث هو الاشتراك لفترة معينة ( SVOD ، اشتراك الفيديو عند الطلب).
Okko يعمل فقط على نماذج TVOD و SVOD. لا يوجد الإعلان على الإطلاق في خدمتنا.
في المجموع ، تحتوي الخدمة على أكثر من 10 آلاف فيلم ومسلسل ، حوالي 6 آلاف منهم متاح عن طريق الاشتراك ، والباقي فقط للشراء أو الإيجار. في الوقت نفسه ، يمكن شراء أي محتوى اشتراك تقريبًا. استثناء ، على سبيل المثال ، برامج Amediateka التلفزيونية ، يمكن مشاهدتها فقط عن طريق الاشتراك.

وفقًا لنموذج الفيلم الذي سيكون متاحًا ، فإنه يعتمد إلى حد كبير على امتلاك الاستوديو للحقوق. يبرمون عقدًا مع دور السينما على الإنترنت ، والذي ينص على متى ولأي حقوق سيتوفر الفيلم. كقاعدة عامة ، تكون الشروط هي نفسها بالنسبة لجميع اللاعبين في السوق ، ولكن في بعض الأحيان تقدم الاستوديوهات تنازلات لبعض دور السينما أو توفر ظروفًا أكثر ملاءمة لمزيد من المال. لذلك هناك الحصري.
على سبيل المثال ، لا تدخل الابتكارات العالمية الرئيسية في الاشتراك على الفور ، ولكن فقط بعد 2-3 أشهر من الظهور في الخدمة. علاوة على ذلك ، في الأسابيع القليلة الأولى لا يمكن حتى أن تكون مستأجرة ، فقط فرصة الشراء متاحة للأبد. لكن الأفلام الروسية قد تكون متاحة عن طريق الاشتراك مباشرة بعد الإصدار وأحيانًا في وقت واحد مع بدء الاستئجار في دور السينما غير المتصلة بالإنترنت.
عندما تنتهي مدة العقد ، يصبح الفيلم غير متاح - حتى تمديد العقد منتهي الصلاحية أو إبرام عقد جديد.

تكون فترات عدم وجود حقوق للمحتوى مرئية بوضوح على الرسوم البيانية لعدد مرات المشاهدة. فيما يلي ، على سبيل المثال ، مخطط لفيلم "John Wick 2". بادئ ذي بدء ، قد يبدو أن hadup يكمن في الراحة لبضعة أشهر ، ولكن لا: لقد انتهت الحقوق.

تتزامن أعلى قمة في الرسم البياني أعلاه (تم تمييزها بخط عمودي) مع تاريخ إضافة الفيلم إلى الاشتراك: هذا سلوك مميز للغاية بالنسبة إلى المستجدات البارزة. خدمتنا لديها 12 اشتراكات:
- ثمانية مواضيعية
- مسلسل تلفزيوني Amediateka ،
- مسلسل تلفزيوني ABC ،
- الأفلام والمسلسلات الروسية من خدمة ستارت ،
- أفلام 4K.
واثنين من حزم الاشتراك: Optimal ، والتي تشمل جميع الاشتراكات المواضيعية ، و Optimal + Amediateka.

الأكثر شعبية ، بالطبع ، هي حزم التعريف. من الاشتراكات المواضيعية ، يفضل المستخدمون سينما العالم و سينمانا.

عدد قليل من المستخدمين يشاهدون الأفلام فقط عن طريق الاشتراك ، ومعظمهم إما يشترون الأفلام أو يشترون بالإضافة إلى الاشتراك.
في معظم الأحيان ، يختار المستخدمون شراء عناصر جديدة للتأجير الحالي ولأول مرة في العام الماضي.
أكثر مصادر المشتريات شيوعًا في التطبيق هو قسم "التوصيات" ، يليه "البحث" و "الأخبار" و "الكتالوج". يقوم المستخدمون بشراء جزء من الأفلام من "مماثل" و "حفظ".

إحدى المشكلات الرئيسية التي نقاتلها بنشاط في Okko هي مشكلة اختيار المستخدمين للمحتوى. إذا نظرت إلى الرسم البياني لاحتمال إجراء عملية شراء مقابل الوقت الذي تقضيه في الخدمة (بيانات العام الماضي) ، فسيصبح من الواضح أن المستخدمين على استعداد لاختيار وشراء فيلم في غضون الدقائق العشرة الأولى ، ثم تقل احتمالية الشراء بسرعة. في الوقت نفسه ، لا يزال هناك جزء كبير إلى حد ما من المستخدمين الذين يقضون في الخدمة من نصف ساعة إلى ساعة ولا يمكنهم اختيار محتوى مناسب لأنفسهم.
10 دقائق - ليس كثيرا. خلال هذا الوقت ، المستخدم ، غير قادر جسديا بحتة على دراسة الكتالوج بالتفصيل وتحديد المحتوى الذي يحب.
هنا يأتي Rekko ، نظام التوصية الداخلي لمسرح Okko السينمائي عبر الإنترنت. تعمل Rekko حاليًا في قسمين من الخدمة - "توصيات" و "مماثلة".


لتقييم مدى رضاء المستخدم عن المحتوى ، نقوم بتحليل حقيقة الشراء ، المشاهدات عن طريق الاشتراك ، وقت المشاهدة ، إضافة إلى تصنيفات المستخدم والمحفوظة.
يتم تمثيل مقياس التصنيف في Okko بخمس علامات نجمية مع تقسيمات نصف: يأخذ القيم الصحيحة من 0 إلى 10.

يمكن للمستخدم تقييم الفيلم في أي وقت ، بغض النظر عن حقيقة الشراء أو المشاهدة. يمكن تغيير النتيجة عددًا غير محدود من المرات ، ولكن لا يمكن التراجع عنها.
يمكنك "تذكر" فيلم في أي وقت ، ثم سيظهر في "تذكر" في ملف تعريف المستخدم. بنفس الطريقة ، يمكن إزالته من هناك.


بدأ العمل على Rekko قبل عام تمامًا وفي الوقت الحالي ، وفقًا لاختبارات A / B ، فقد سمح لنا بزيادة متوسط عدد المشتريات بنسبة 4٪ ، وإيرادات المعاملة بنسبة 3٪ ، والتحويل إلى الاشتراك بنسبة 5٪ ، وبدأ المستخدمون في اختيار الأفلام بنسبة 18٪ بشكل أسرع .

البيانات
جميع البيانات ، باستثناء وقت المشاهدة والتقييمات ، مجهولة المصدر أو مشوهة. يتم التعبير عن الوقت بوحدات تجريدية يتم من خلالها الحفاظ على علاقة النظام والمسافة.
المعاملات
سجلات جميع المعاملات وجهات النظر المحتوى عليها خلال فترة التدريب. المعاملة هنا هي شراء فيلم للأبد ، إما للإيجار أو لبدء المشاهدة عن طريق الاشتراك.
element_uid
- معرف العنصرuser_uid
- معرف المستخدمconsumption_mode
- نوع الاستهلاك ( P
- شراء ، R
- تأجير ، S
- عرض عن طريق الاشتراك)ts
- وقت المعاملةwatched_time
- عدد الثواني التي شاهدها المستخدم لثوان المعاملة هذهdevice_type
- نوع مجهول من الجهاز تم إجراء المعاملة منهdevice_manufacturer
- الشركة المصنعة المجهولة للجهاز الذي تم إجراء المعاملة منه

التقييم
معلومات حول تصنيفات المستخدمين لفترة التدريب. يتم تجميع المعلومات ، أي إذا غير المستخدم تقييمه ، فسيتم تقديم القيمة الأخيرة فقط في الجدول.
element_uid
- معرف العنصرuser_uid
- معرف المستخدمrating
- rating
المعرفة من قبل المستخدم (من 0
إلى 10
)ts
- ترتيب الوقت

bookmarks.csv
الحقائق التي يقوم المستخدمون بإضافة فيلم إلى "تذكرها". يتم تجميع المعلومات ، أي إذا حذف المستخدم الفيلم من "تم الحفظ" ، فلن يكون هناك سجل لإضافته هناك في الجدول.
element_uid
- معرف العنصرuser_uid
- معرف المستخدمts
- الوقت لإضافة الفيلم إلى "تذكر"
catalogue.json
معلومات التعريف حول جميع العناصر الموصى بها: الأفلام والمسلسلات والأفلام التسلسلية.
{ "1983": { "type": "movie", "availability": ["purchase", "rent", "subscription"], "duration": 140, "feature_1": 1657223.396513469, "feature_2": 0.7536096584, "feature_3": 39, "feature_4": 1.1194091265, "feature_5": 0.0, "attributes": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...] }, "2166": { "type": "movie", "availability": ["purchase", "rent"], "duration": 110, "feature_1": 36764165.87817783, "feature_2": 0.7360206399, "feature_3": 11, "feature_4": 1.1386044027, "feature_5": 0.6547073468, "attributes": [16738, 13697, 1066, 1089, 7, 5318, 308, 54, 170, 33, ...] }, ... }
type
- يأخذ قيم movie
أو multipart_movie
أو series
duration
- المدة بالدقائق ، تقريبًا إلى عشرات (مدة السلسلة للأفلام والأفلام التسلسلية)availability
- الحقوق المتاحة للمحتوى (قد تحتوي على قيم purchase
rent
subscription
)attributes
- حقيبة من بعض السمات مجهولة المصدرfeature_1..5
- خمس مواد مجهولة الهوية وميزات ترتيبية
يشار إلى الحقوق المتاحة في نهاية فترة التدريب وبداية الاختبار.
هام: في json ، يمكن أن تكون مفاتيح القاموس عبارة عن سلاسل فقط ، لذا تأكد من إرسالها إلى رقم إذا قرأت المعرفات في الجداول كأرقام (قم بذلك لحفظ الذاكرة).

متري
كمقياس ، نستخدم متوسط الدقة المتوسط (MAP) لـ 20 عنصرًا ، لكن تم تعديله قليلاً. خلال فترة الاختبار ، يمكن أن يستهلك المستخدم أقل من 20 فيلما. إذا نظرنا في هذه الحالة إلى خريطة MAP صادقة ، سيكون الحد الأعلى للقياس أقل من واحد ، وستكون القيم صغيرة. لذلك ، إذا كان المستخدم قد استهلك أقل من 20 عنصرًا ، فنحن نطبيعها بعددها وليس 20.
- يقع العنصر المتوقع في مجموعة العناصر التي يستهلكها المستخدم خلال فترة الاختبار ، هو حجم هذه المجموعة. إذا تم نسيان فجأة مقاييس جودة التصنيف ، فهناك مقال ممتاز عنها على المحور
كود متري في سيثون def average_precision( dict data_true, dict data_predicted, const unsigned long int k ) -> float: cdef: unsigned long int n_items_predicted unsigned long int n_items_true unsigned long int n_correct_items unsigned long int item_idx double average_precision_sum double precision set items_true list items_predicted if not data_true: raise ValueError('data_true is empty') average_precision_sum = 0.0 for key, items_true in data_true.items(): items_predicted = data_predicted.get(key, []) n_items_true = len(items_true) n_items_predicted = min(len(items_predicted), k) if n_items_true == 0 or n_items_predicted == 0: continue n_correct_items = 0 precision = 0.0 for item_idx in range(n_items_predicted): if items_predicted[item_idx] in items_true: n_correct_items += 1 precision += <double>n_correct_items / <double>(item_idx + 1) average_precision_sum += <double>precision / <double>min(n_items_true, k) return average_precision_sum / <double>len(data_true) def metric(true_data, predicted_data, k=20): true_data_set = {k: set(v) for k, v in true_data.items()} return average_precision(true_data_set, predicted_data, k=k)
الجوائز والقواعد
تبلغ قيمة الجائزة 600 ألف روبل:
- 300 ألف سيحصلون على الفائز ،
- 200 ألف - المشارك في المركز الثاني
- 100 ألف - مشارك في المركز الثالث.
القواعد معيارية: لا تقم بتعطيل النظام الأساسي ، واستخدم حسابًا واحدًا فقط ، وتجنب تبادل التعليمات البرمجية الخاصة مع المشاركين الآخرين ولا تكون موظفًا في Okko و Rambler.
كيف تبدأ
قد يكون من الصعب حتى بالنسبة للمهنيين ذوي الخبرة أن يبدؤوا في المشاركة في المسابقة: عليك أن تعرف بسرعة مجالًا جديدًا ، وتفهم البيانات وتحللها ، وتصنيف مكتبات جديدة.
نأمل أن نتمكن في هذه المقالة من الانغماس في موضوع السينما عبر الإنترنت ووصف البيانات بتفاصيل كافية. في الأرشيف الذي يحتوي على المهمة ، ستجد ملف baseline.ipynb
، الذي يحتوي على رمز لتحميل البيانات ومثال على حل بسيط باستخدام خوارزمية K أقرب جيران.
إذا بقيت أي نقاط من وصف البيانات ونطاق المجال غير واضحة ، فسيسعدنا الإجابة على أسئلتك في التعليقات. يمكنك أيضًا طرح الأسئلة في قناة telegramboosterspro - ستُعقد المناقشة الرئيسية للمنافسة هناك.
فكيف تبدأ:
- الاشتراك في boosters.pro والانضمام إلىboosterspro ؛
- قم بتنزيل البيانات الموجودة على صفحة المسابقة أو هنا ؛
- افتح
baseline.ipynb
، وقم بتثبيت الحزم اللازمة ، وتنفيذ جميع التعليمات البرمجية وتنزيل الحل الأول ؛ - حاول تعديل الأساس لتحسين الأداء ؛
- التجربة!
ينطلق تحدي Rekko اليوم ، 18 فبراير. يتم اتخاذ القرارات حتى 18 أبريل ، 23:59:59 بتوقيت موسكو.
نحن في انتظار الجميع ونتمنى لك التوفيق!
بالمناسبة ، نحن نبحث عن موظفين . بما في ذلك المطور من أنظمة التوصية.
UPD 02/26/2019: العثور على خطأ في تشكيل بيانات الاختبار ، واستبدالها وملف test_users.json . يتم إعطاء جميع المشاركين محاولات إضافية.