Défi Rekko

Défi Rekko


Aujourd'hui, nous lançons le Rekko Challenge 2019 , un concours d'apprentissage automatique de la salle de cinéma en ligne Okko .


Nous vous suggérons de construire un système de recommandations sur les données réelles de l'un des plus grands cinémas en ligne russes. Nous sommes sûrs que cette tâche sera intéressante pour les débutants et les spécialistes expérimentés. Nous avons essayé de garder le maximum de créativité, sans vous surcharger avec des jeux de données gigaoctets avec des centaines de fonctionnalités pré-calculées.


En savoir plus sur Okko, la tâche, les données, les prix et les règles - ci-dessous.


Défi


Vous avez accès aux données de toutes les vues, classements et ajouts aux films et séries «mémorisés» par l'utilisateur pendant une période de N jours (N> 60), ainsi qu'à toutes les méta-informations sur le contenu. Il est nécessaire de prévoir quels films et séries l'utilisateur achètera ou regardera par abonnement au cours des 60 prochains jours.


Dans la section suivante, nous avons essayé de décrire le minimum de ce que vous devez savoir sur les cinémas en ligne afin de comprendre rapidement les données et de commencer à les analyser. Si ces informations ne vous concernent pas, vous pouvez immédiatement procéder à la description des données .


À propos de notre service


Si un utilisateur veut regarder légalement un film sur Internet, il a trois moyens principaux.


La première consiste à regarder gratuitement et à interrompre constamment les publicités ( AVOD , Advertising Video On Demand). La seconde consiste à acheter un film pour votre collection ou à le louer ( TVOD , Transactional Video On Demand). La troisième consiste à s'abonner pour une certaine période ( SVOD , Subscription Video On Demand).


Okko ne fonctionne que sur les modèles TVOD et SVOD. Il n'y a aucune publicité dans notre service.


Au total, le service compte un peu plus de 10 000 films et séries, environ 6 000 d'entre eux sont disponibles par abonnement, le reste est uniquement à l'achat ou à la location. Dans le même temps, presque tous les contenus d'abonnement peuvent être achetés. Une exception est, par exemple, les émissions de télévision Amediateka , elles ne peuvent être regardées que par abonnement.


Répartition du contenu par modèle de consommation


Selon le modèle sur lequel le film sera disponible, cela dépend en grande partie du studio qui détient les droits. Ils concluent un contrat avec les cinémas en ligne, qui stipule quand et pour quels droits le film sera disponible. En règle générale, les conditions sont les mêmes pour tous les acteurs du marché, mais parfois les studios font des concessions à certains cinémas ou offrent des conditions plus favorables pour plus d'argent. Il y a donc des exclusivités.


Par exemple, les principales innovations mondiales n'entrent pas dans l'abonnement immédiatement, mais seulement 2 à 3 mois après leur apparition dans le service. De plus, dans les premières semaines, ils ne peuvent même pas être loués, seule la possibilité d'acheter pour toujours est disponible. Mais les films russes peuvent être disponibles par abonnement immédiatement après la sortie et parfois même simultanément avec le début de la location dans les cinémas hors ligne.


À l'expiration du contrat, le film devient indisponible - jusqu'à la prolongation du contrat expiré ou la conclusion d'un nouveau.


Exemple de carte de film inaccessible


Les périodes d'absence de droits sur le contenu sont clairement visibles sur les graphiques du nombre de vues. Ci-dessous, par exemple, un tableau du film "John Wick 2". Tout d'abord, il peut sembler que le problème s'est arrêté pendant quelques mois, mais non: les droits étaient terminés.


Graphique des vues du film "John Wick 2"


Le pic le plus élevé du graphique ci-dessus (marqué d'une ligne verticale) coïncide avec la date à laquelle le film a été ajouté à l'abonnement: il s'agit d'un comportement très caractéristique des nouveautés de haut niveau. Notre service compte 12 abonnements:


  • Huit thématiques
  • Série télévisée Amediateka,
  • Série télévisée ABC,
  • Films et séries russes du service START,
  • Films 4K.

Et deux forfaits d'abonnement: Optimal, qui comprend tous les abonnements thématiques, et Optimal + Amediateka.


Interface d'abonnement


Les plus populaires, bien sûr, sont les méta-packages. Parmi les abonnements thématiques, les utilisateurs préfèrent World Cinema et Our Cinema.



Peu d'utilisateurs ne regardent des films que par abonnement, la plupart achètent simplement des films ou achètent en plus de l'abonnement.


Le plus souvent, les utilisateurs choisissent d'acheter de nouveaux articles pour la location actuelle et les grandes premières de l'année dernière.


La source d'achat la plus populaire dans l'application est la section «Recommandations», suivie de «Recherche», «Actualités» et «Catalogue». Les utilisateurs achètent une partie des films de «similaires» et «mémorisés».



L'un des principaux problèmes que nous combattons activement chez Okko est le problème des utilisateurs qui choisissent le contenu. Si vous regardez le graphique de la probabilité de faire un achat par rapport au temps que vous avez passé dans le service (données de l'année dernière), il deviendra clair que les utilisateurs sont prêts à choisir et à acheter un film dans les 10 premières minutes, puis la probabilité d'achat diminue rapidement. Dans le même temps, il reste une part assez importante d'utilisateurs qui passent dans le service d'une demi-heure à une heure et ne peuvent pas choisir un contenu qui leur convient.


10 minutes - pas tant que ça. Pendant ce temps, l'utilisateur, purement physiquement incapable d'étudier le catalogue en détail et de sélectionner le contenu qu'il aime.


C'est là qu'intervient Rekko, le système de recommandation interne pour le cinéma en ligne Okko. Rekko opère actuellement dans deux sections du service - «Recommandations» et «Similaire».


Section de recommandation TV


Similaire à la télévision


Pour évaluer la satisfaction des utilisateurs avec le contenu, nous analysons le fait de l'achat, les vues par abonnement, le temps de visualisation, en ajoutant aux notes mémorisées et aux notes des utilisateurs.


L'échelle de notation à Okko est représentée par cinq astérisques avec des demi-divisions: elle prend des valeurs entières de 0 à 10.


Interface d'évaluation


L'utilisateur peut noter le film à tout moment, indépendamment du fait de l'achat ou de la visualisation. Le score peut être modifié un nombre illimité de fois, mais ne peut pas être annulé.


Vous pouvez "vous souvenir" d'un film à tout moment, puis il apparaîtra dans le "souvenir" du profil de l'utilisateur. De la même manière, il peut être retiré de là.


Interface de stockage


Films enregistrés dans le profil


Les travaux sur Rekko ont commencé il y a exactement un an et à l'heure actuelle, selon les tests A / B, cela nous a permis d'augmenter le nombre moyen d'achats de 4%, les revenus de transaction de 3%, la conversion en abonnement de 5% et les utilisateurs ont commencé à choisir des films 18% plus rapidement. .



Les données


Toutes les données, à l'exception du temps de visualisation et des évaluations, sont anonymisées ou déformées. Le temps est exprimé en unités abstraites pour lesquelles la relation d'ordre et de distance est préservée.


transactions.csv


Enregistrements de toutes les transactions et vues de contenu sur eux pendant la période de formation La transaction consiste ici à acheter un film pour toujours, soit en location, soit pour lancer la visualisation par abonnement.


element_uiduser_uidmode_consommationtsregardé_heuretype_appareilfabricant_appareil
33365177S44305181.21802064282050
481593316S44305180.6060276262989011
4128262355S44305180.41444582833050

  • element_uid - identifiant d'élément
  • user_uid - id utilisateur
  • consumption_mode - type de consommation ( P - achat, R - location, S - vue par abonnement)
  • ts - temps de transaction
  • watched_time - le nombre de secondes regardées par l'utilisateur pendant cette transaction secondes
  • device_type - type anonyme d'appareil à partir duquel la transaction a été effectuée
  • device_manufacturer - fabricant anonyme de l'appareil à partir duquel la transaction a été effectuée

Distribution watched_time


ratings.csv


Informations sur les évaluations des utilisateurs pour la période de formation. Les informations sont agrégées, c'est-à-dire si l'utilisateur a changé sa note, seule la dernière valeur sera présentée dans le tableau.


user_uidelement_uidnotets
57125213641044305174.26309871
6314030371044305139.28281821
4438174363844305136.20584908

  • element_uid - identifiant d'élément
  • user_uid - id utilisateur
  • rating - rating définie par l'utilisateur (de 0 à 10 )
  • ts - temps de classement

Répartition des notations


bookmarks.csv


Les faits que les utilisateurs ajoutent un film au "souvenir". Les informations sont agrégées, c'est-à-dire si l'utilisateur a supprimé le film du "Enregistré", il n'y aura aucun enregistrement de l'ajouter là dans le tableau.


user_uidelement_uidts
301135718544305161.30743926
301135408344305160.01187332
3011351015844305157.74463292

  • element_uid - identifiant d'élément
  • user_uid - id utilisateur
  • ts - il est temps d'ajouter le film au «souvenir»

catalogue.json


Méta-informations sur tous les éléments recommandés: films, séries et films en série.


 { "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 - prend les valeurs de movie , multipart_movie ou series
  • duration - la durée en minutes, arrondie à des dizaines (la durée de la série pour les séries et les films en série)
  • availability - droits disponibles sur le contenu (peut contenir les valeurs d' purchase , de rent et d' subscription )
  • attributes - un sac de quelques attributs anonymisés
  • feature_1..5 - cinq fonctionnalités anonymes et matérielles anonymes

Les droits disponibles sont indiqués à la fin de la formation et au début du test.


Important: dans json, les clés de dictionnaire ne peuvent être que des chaînes, assurez-vous donc de les convertir en nombre si vous lisez les identificateurs dans les tableaux sous forme de nombres (faites-le pour économiser de la mémoire).


Répartition des caractéristiques dans le catalogue


Métrique


En tant que métrique, nous utilisons la précision moyenne moyenne (MAP) pour 20 éléments, mais légèrement modifiée. Pendant la période de test, l'utilisateur pourrait consommer moins de 20 films. Si dans ce cas, nous considérons une MAP honnête, la limite supérieure de la métrique sera inférieure à un et les valeurs seront petites. Par conséquent, si l'utilisateur a consommé moins de 20 éléments, nous normalisons par leur nombre, et non par 20.


 mboxMNAP@20= frac1 lvertU rvert sumu inU frac1 min(nu,20) sumi=120ru(i)pu@i


pu@k= frac1k sumi=1kru(i)


ru(i)- est situé ie élément prédit dans l'ensemble des éléments consommés pendant la période de test par l'utilisateur u, nuEst la taille de cet ensemble. Si soudainement les mesures de qualité de classement sont oubliées, il y a un excellent article à leur sujet sur le hub


Code métrique en Cython
 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) 

Prix ​​et règlement


Le fonds de prix est de 600 mille roubles:


  • 300 mille recevront le gagnant,
  • 200 mille - le participant en deuxième place
  • 100 mille - un participant à la troisième place.

Les règles sont standard: ne perturbez pas la plateforme, utilisez un seul compte, évitez l'échange de code privé avec les autres participants et ne soyez pas un employé d'Okko et de Rambler.


Comment commencer


Il peut être difficile, même pour des professionnels expérimentés, de commencer à participer au concours: vous devez rapidement trouver un nouveau domaine, comprendre et analyser les données et trier de nouvelles bibliothèques.


Nous espérons que dans cet article, nous avons pu vous plonger dans le sujet du cinéma en ligne et décrire les données de manière suffisamment détaillée. Dans l'archive avec la tâche, vous trouverez le fichier baseline.ipynb , qui contient le code de chargement des données et un exemple de solution simple utilisant l'algorithme de K voisins les plus proches.


Si des points de la description des données et du domaine restent flous, nous serons heureux de répondre à vos questions dans les commentaires. Vous pouvez également poser des questions sur la chaîne de télégramme @boosterspro - la discussion principale du concours s'y tiendra.


Alors, comment commencer:


  1. Inscrivez-vous à boosters.pro et rejoignez @boosterspro ;
  2. Téléchargez les données sur la page du concours ou ici ;
  3. Ouvrez baseline.ipynb , installez les packages nécessaires, exécutez tout le code et téléchargez votre première solution;
  4. Essayez de modifier la ligne de base pour améliorer les performances;
  5. Expérimentez!

Le défi Rekko démarre aujourd'hui, le 18 février. Les décisions sont prises jusqu'au 18 avril à 23 h 59 min 59 s, heure de Moscou.


Nous attendons tout le monde et bonne chance!


Soit dit en passant, nous recherchons des employés . Y compris le développeur de systèmes de recommandation.


UPD 26/02/2019: Trouvé un bug dans la formation des données de test, les a remplacées et le fichier test_users.json . Tous les participants ont des tentatives supplémentaires.

Source: https://habr.com/ru/post/fr439180/


All Articles