
Heute starten wir die Rekko Challenge 2019 , einen Wettbewerb für maschinelles Lernen aus dem Online-Kino von Okko .
Wir empfehlen Ihnen, ein Empfehlungssystem auf den realen Daten eines der größten russischen Online-Kinos aufzubauen. Wir sind sicher, dass diese Aufgabe sowohl für Anfänger als auch für erfahrene Spezialisten interessant sein wird. Wir haben versucht, den größtmöglichen Spielraum für Kreativität zu schaffen, ohne Sie mit Gigabyte-Datensätzen mit Hunderten von vorberechneten Funktionen zu überlasten.
Lesen Sie unten mehr über Okko, die Aufgabe, Daten, Preise und Regeln.
Herausforderung
Sie haben über einen Zeitraum von N Tagen (N> 60) Zugriff auf Daten zu allen Ansichten, Bewertungen und Ergänzungen der „gespeicherten“ Filme und Serien durch den Benutzer sowie auf alle Metainformationen zum Inhalt. Es muss vorhergesagt werden, welche Filme und Serien der Benutzer in den nächsten 60 Tagen im Abonnement kaufen oder ansehen wird.
Im nächsten Abschnitt haben wir versucht, das Minimum dessen zu beschreiben, was Sie über Online-Kinos wissen müssen, um die Daten schnell zu verstehen und mit der Analyse zu beginnen. Wenn diese Informationen für Sie nicht relevant sind, können Sie sofort mit der Beschreibung der Daten fortfahren.
Über unseren Service
Wenn ein Benutzer einen Film legal im Internet ansehen möchte, hat er drei Möglichkeiten.
Die erste Möglichkeit besteht darin, Werbespots kostenlos anzusehen und ständig zu unterbrechen ( AVOD , Advertising Video On Demand). Die zweite Möglichkeit besteht darin, einen Film für Ihre Sammlung oder Miete zu kaufen ( TVOD , Transactional Video On Demand). Die dritte Möglichkeit besteht darin , sich für einen bestimmten Zeitraum anzumelden ( SVOD , Subscription Video On Demand).
Okko funktioniert nur mit TVOD- und SVOD-Modellen. Es gibt überhaupt keine Werbung in unserem Service.
Insgesamt hat der Dienst etwas mehr als 10.000 Filme und Serien, von denen etwa 6.000 im Abonnement erhältlich sind, der Rest ist nur zum Kauf oder Verleih bestimmt. Gleichzeitig können fast alle Abonnementinhalte gekauft werden. Eine Ausnahme bilden beispielsweise Amediateka-TV-Sendungen , die nur im Abonnement angesehen werden können.

Nach welchem Modell der Film erhältlich sein wird, hängt weitgehend vom Studio ab, das die Rechte besitzt. Sie schließen einen Vertrag mit Online-Kinos, in dem festgelegt ist, wann und für welche Rechte der Film verfügbar sein wird. In der Regel sind die Bedingungen für alle Marktteilnehmer gleich, aber manchmal machen die Studios Zugeständnisse an einige Kinos oder bieten günstigere Bedingungen für mehr Geld. Es gibt also exklusive.
Beispielsweise werden wichtige globale Innovationen nicht sofort in das Abonnement aufgenommen, sondern erst 2-3 Monate nach dem Erscheinen im Service. Darüber hinaus können sie in den ersten Wochen nicht einmal gemietet werden, sondern es besteht nur die Möglichkeit, für immer zu kaufen. Russische Filme können jedoch unmittelbar nach der Veröffentlichung und manchmal sogar gleichzeitig mit dem Beginn des Verleihs in Offline-Kinos im Abonnement erhältlich sein.
Wenn der Vertrag ausläuft, ist der Film nicht mehr verfügbar - bis zur Verlängerung des abgelaufenen Vertrags oder bis zum Abschluss eines neuen.

Zeiträume ohne Rechte an Inhalten sind in den Diagrammen der Anzahl der Aufrufe deutlich sichtbar. Unten sehen Sie zum Beispiel eine Tabelle für den Film "John Wick 2". Zunächst scheint es, als hätte sich der Hadup für ein paar Monate zur Ruhe gelegt, aber nein: Die Rechte waren vorbei.

Der höchste Peak in der obigen Grafik (mit einer vertikalen Linie markiert) fällt mit dem Datum zusammen, an dem der Film zum Abonnement hinzugefügt wurde: Dies ist ein sehr charakteristisches Verhalten für hochkarätige Neuheiten. Unser Service hat 12 Abonnements:
- Acht Themen
- Fernsehserie Amediateka,
- Fernsehserie ABC,
- Russische Filme und Serien aus dem START-Dienst,
- 4K-Filme.
Und zwei Abonnement-Pakete: Optimal, das alle thematischen Abonnements enthält, und Optimal + Amediateka.

Am beliebtesten sind natürlich Metapakete. Von den thematischen Abonnements bevorzugen Benutzer World Cinema und Our Cinema.

Nur wenige Benutzer sehen Filme nur im Abonnement, die meisten kaufen entweder nur Filme oder zusätzlich zum Abonnement.
In den meisten Fällen entscheiden sich Benutzer für den Kauf neuer Artikel für die aktuelle Vermietung und die großen Premieren des letzten Jahres.
Die beliebteste Quelle für Einkäufe in der Anwendung ist der Abschnitt „Empfehlungen“, gefolgt von „Suchen“, „Nachrichten“ und „Katalog“. Benutzer kaufen einen Teil der Filme bei "Similar" und "Memorized".

Eines der Hauptprobleme, mit denen wir bei Okko aktiv kämpfen, ist das Problem, dass Benutzer Inhalte auswählen. Wenn Sie sich das Diagramm der Wahrscheinlichkeit eines Kaufs im Vergleich zu der Zeit ansehen, die Sie für den Service aufgewendet haben (Daten für das letzte Jahr), wird deutlich, dass Benutzer bereit sind, innerhalb der ersten 10 Minuten einen Film auszuwählen und zu kaufen. Dann sinkt die Wahrscheinlichkeit eines Kaufs schnell. Gleichzeitig bleibt ein ziemlich großer Teil der Benutzer übrig, die zwischen einer halben und einer Stunde im Dienst verbringen und keine für sich geeigneten Inhalte auswählen können.
10 Minuten - nicht so sehr. Während dieser Zeit ist der Benutzer rein physisch nicht in der Lage, den Katalog im Detail zu studieren und den Inhalt auszuwählen, den er mag.
Hier kommt Rekko ins Spiel, das interne Empfehlungssystem für das Okko-Online-Kino. Rekko ist derzeit in zwei Bereichen des Dienstes tätig - "Empfehlungen" und "Ähnlich".


Um die Zufriedenheit der Benutzer mit den Inhalten zu bewerten, analysieren wir die Tatsache des Kaufs, die Ansichten nach Abonnement, die Anzeigezeit, das Hinzufügen zu den gespeicherten Bewertungen und Benutzerbewertungen.
Die Bewertungsskala in Okko wird durch fünf Sternchen mit halben Unterteilungen dargestellt: Sie nimmt ganzzahlige Werte von 0 bis 10 an.

Der Benutzer kann den Film jederzeit bewerten, unabhängig von der Tatsache des Kaufs oder der Anzeige. Die Punktzahl kann unbegrenzt oft geändert, aber nicht rückgängig gemacht werden.
Sie können sich jederzeit an einen Film "erinnern". Dieser wird dann im Profil des Benutzers unter "Erinnert" angezeigt. Auf die gleiche Weise kann es von dort entfernt werden.


Die Arbeiten an Rekko begannen genau vor einem Jahr und laut A / B-Tests konnten wir derzeit die durchschnittliche Anzahl der Einkäufe um 4%, die Transaktionserlöse um 3%, die Umstellung auf Abonnements um 5% und die Auswahl der Filme um 18% beschleunigen .

Daten
Alle Daten mit Ausnahme der Anzeigezeit und der Bewertungen sind anonymisiert oder verzerrt. Die Zeit wird in abstrakten Einheiten ausgedrückt, für die das Verhältnis von Ordnung und Entfernung erhalten bleibt.
transaction.csv
Aufzeichnungen aller Transaktionen und Inhaltsansichten während des Schulungszeitraums. Die Transaktion hier ist der Kauf eines Films für immer, entweder zum Ausleihen oder um das Ansehen durch Abonnement zu initiieren.
element_uid
- Elementkennunguser_uid
- Benutzer-IDconsumption_mode
- Art des Verbrauchs ( P
- Kauf, R
- Miete, S
- Ansicht nach Abonnement)ts
- Transaktionszeitwatched_time
- Die Anzahl der Sekunden, die der Benutzer für diese Transaktionssekunden überwachtdevice_type
- anonymer Gerätetyp, von dem aus die Transaktion durchgeführt wurdedevice_manufacturer
- anonymer Hersteller des Geräts, von dem aus die Transaktion durchgeführt wurde

Bewertungen.csv
Informationen zu Benutzerbewertungen für den Trainingszeitraum. Informationen werden aggregiert, d.h. Wenn der Benutzer seine Bewertung geändert hat, wird nur der letzte Wert in der Tabelle angezeigt.
element_uid
- Elementkennunguser_uid
- Benutzer-IDrating
- benutzerdefinierte Bewertung (von 0
bis 10
)ts
- Rankingzeit

bookmarks.csv
Die Fakten, dass Benutzer einen Film zum "Erinnerten" hinzufügen. Informationen werden aggregiert, d.h. Wenn der Benutzer den Film aus "Gespeichert" gelöscht hat, wird nicht aufgezeichnet, ob er dort in der Tabelle hinzugefügt wurde.
element_uid
- Elementkennunguser_uid
- Benutzer-IDts
- Zeit, den Film zum "erinnerten" hinzuzufügen
catalogue.json
Meta-Informationen zu allen empfohlenen Elementen: Filme, Serien und Serienfilme.
{ "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
- Nimmt die Werte von movie
, multipart_movie
oder series
duration
- die Dauer in Minuten, auf zehn gerundet (die Dauer der Serie für Serien- und Serienfilme)availability
- verfügbare Rechte an den Inhalten (kann die Werte von purchase
, rent
und subscription
)attributes
- eine Tasche mit einigen anonymisierten Attributenfeature_1..5
- fünf anonymisierte Material- und Ordnungsmerkmale
Die verfügbaren Rechte werden am Ende des Trainingszeitraums und zu Beginn des Tests angegeben.
Wichtig: In JSON können Wörterbuchschlüssel nur Zeichenfolgen sein. Denken Sie also daran, sie in eine Zahl umzuwandeln, wenn Sie Bezeichner in Tabellen als Zahlen lesen (tun Sie dies, um Speicherplatz zu sparen).

Metrisch
Als Metrik verwenden wir die mittlere durchschnittliche Genauigkeit (MAP) für 20 Elemente, die jedoch leicht modifiziert ist. Während des Testzeitraums könnte der Benutzer weniger als 20 Filme konsumieren. Wenn wir in diesem Fall einen ehrlichen MAP betrachten, ist die Obergrenze der Metrik kleiner als eins und die Werte sind klein. Wenn der Benutzer weniger als 20 Elemente verbraucht hat, normalisieren wir daher nach ihrer Anzahl und nicht nach 20.
- befindet Das vorhergesagte Element in der Gruppe von Elementen, die während des Testzeitraums vom Benutzer verbraucht wurden , Ist die Größe dieses Sets. Wenn plötzlich die Ranking-Qualitätsmetriken vergessen werden, gibt es im Hub einen ausgezeichneten Artikel darüber
Metrikcode in 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)
Preise und Regeln
Der Preisfonds beträgt 600 Tausend Rubel:
- 300 Tausend erhalten den Gewinner,
- 200 Tausend - der Teilnehmer auf dem zweiten Platz
- 100.000 - ein Teilnehmer auf dem dritten Platz.
Die Regeln sind Standard: Unterbrechen Sie nicht die Plattform, verwenden Sie nur ein Konto, vermeiden Sie den Austausch von privatem Code mit anderen Teilnehmern und seien Sie kein Mitarbeiter von Okko und Rambler.
Wie fange ich an?
Selbst für erfahrene Fachleute kann es schwierig sein, an dem Wettbewerb teilzunehmen: Sie müssen schnell einen neuen Domänenbereich herausfinden, Daten verstehen und analysieren und neue Bibliotheken sortieren.
Wir hoffen, dass wir Sie in diesem Artikel in das Thema Online-Kino eintauchen und die Daten ausreichend detailliert beschreiben konnten. Im Archiv mit der Aufgabe finden Sie die Datei baseline.ipynb
, die Code zum Laden von Daten und ein Beispiel für eine einfache Lösung mit dem K-Algorithmus für die nächsten Nachbarn enthält.
Sollten Punkte aus der Beschreibung der Daten- und Domain-Domain unklar bleiben, beantworten wir Ihre Fragen gerne in den Kommentaren. Sie können auch Fragen im Telegrammkanal @boosterspro stellen - dort findet die Hauptdiskussion des Wettbewerbs statt.
So fangen Sie an:
- Melden Sie sich bei boosters.pro an und treten Sie @boosterspro bei .
- Laden Sie die Daten auf der Wettbewerbsseite oder hier herunter.
- Öffnen Sie
baseline.ipynb
, installieren Sie die erforderlichen Pakete, führen Sie den gesamten Code aus und laden Sie Ihre erste Lösung herunter. - Versuchen Sie, die Basislinie zu ändern, um die Leistung zu verbessern.
- Experimentieren Sie!
Die Rekko Challenge beginnt heute, am 18. Februar. Entscheidungen werden bis zum 18. April, 23:59:59 Uhr Moskauer Zeit getroffen.
Wir warten auf alle und viel Glück!
Wir suchen übrigens Mitarbeiter . Einschließlich des Entwicklers von Empfehlungssystemen.
UPD 26.02.2019: Es wurde ein Fehler bei der Erstellung von Testdaten gefunden, diese ersetzt und die Datei test_users.json . Alle Teilnehmer erhalten zusätzliche Versuche.