
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.

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.

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.

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.

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».


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.

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à.


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_uid
- identifiant d'élémentuser_uid
- id utilisateurconsumption_mode
- type de consommation ( P
- achat, R
- location, S
- vue par abonnement)ts
- temps de transactionwatched_time
- le nombre de secondes regardées par l'utilisateur pendant cette transaction secondesdevice_type
- type anonyme d'appareil à partir duquel la transaction a été effectuéedevice_manufacturer
- fabricant anonyme de l'appareil à partir duquel la transaction a été effectuée

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.
element_uid
- identifiant d'élémentuser_uid
- id utilisateurrating
- rating
définie par l'utilisateur (de 0
à 10
)ts
- temps de classement

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.
element_uid
- identifiant d'élémentuser_uid
- id utilisateurts
- 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ésfeature_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).

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.
- est situé e élément prédit dans l'ensemble des éléments consommés pendant la période de test par l'utilisateur , Est 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:
- Inscrivez-vous à boosters.pro et rejoignez @boosterspro ;
- Téléchargez les données sur la page du concours ou ici ;
- Ouvrez
baseline.ipynb
, installez les packages nécessaires, exécutez tout le code et téléchargez votre première solution; - Essayez de modifier la ligne de base pour améliorer les performances;
- 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.