
Hari ini kami meluncurkan Rekko Challenge 2019 , kompetisi pembelajaran mesin dari bioskop online Okko .
Kami menyarankan Anda membangun sistem rekomendasi pada data nyata dari salah satu bioskop online Rusia terbesar. Kami yakin bahwa tugas ini akan menarik bagi pemula dan spesialis berpengalaman. Kami mencoba mempertahankan ruang lingkup maksimum untuk kreativitas, sambil tidak membebani Anda dengan kumpulan data gigabyte dengan ratusan fitur yang telah dihitung sebelumnya.
Baca lebih lanjut tentang Okko, tugas, data, hadiah, dan aturan - di bawah ini.
Tantangan
Anda memiliki akses ke data pada semua tampilan, penilaian, dan penambahan pada film dan serial "Dihororis" oleh pengguna selama N hari (N> 60), serta semua meta-informasi tentang konten. Diperlukan untuk memprediksi film dan seri mana yang akan dibeli atau ditonton pengguna dengan berlangganan selama 60 hari ke depan.
Pada bagian selanjutnya, kami mencoba untuk menggambarkan apa yang perlu Anda ketahui tentang bioskop online minimum agar dapat dengan cepat memahami data dan mulai menganalisisnya. Jika informasi ini tidak relevan bagi Anda, Anda dapat langsung melanjutkan ke deskripsi data .
Tentang layanan kami
Jika pengguna ingin menonton film secara legal di Internet, ia memiliki tiga cara utama.
Cara pertama adalah menonton secara gratis, terus-menerus menginterupsi iklan ( AVOD , Advertising Video On Demand). Yang kedua adalah membeli film untuk koleksi atau sewa Anda ( TVOD , Transactional Video On Demand). Yang ketiga adalah berlangganan untuk periode tertentu ( SVOD , Berlangganan Video Sesuai Permintaan).
Okko hanya berfungsi pada model TVOD dan SVOD. Tidak ada iklan sama sekali dalam layanan kami.
Secara total, layanan ini memiliki sedikit lebih dari 10 ribu film dan seri, sekitar 6 ribu di antaranya tersedia dengan berlangganan, sisanya hanya untuk pembelian atau sewa. Pada saat yang sama, hampir semua konten berlangganan dapat dibeli. Pengecualian adalah, misalnya, acara TV Amediateka , mereka hanya bisa ditonton dengan berlangganan.

Menurut model mana film ini akan tersedia, sebagian besar tergantung pada studio yang memiliki hak. Mereka menyimpulkan kontrak dengan bioskop online, yang menentukan kapan dan untuk hak apa film itu akan tersedia. Sebagai aturan, kondisinya sama untuk semua pemain pasar, tetapi kadang-kadang studio membuat konsesi ke beberapa bioskop atau menawarkan kondisi yang lebih menguntungkan untuk lebih banyak uang. Jadi ada yang eksklusif.
Misalnya, inovasi global utama tidak segera masuk ke langganan, tetapi hanya setelah 2-3 bulan setelah muncul dalam layanan. Apalagi, dalam beberapa minggu pertama mereka bahkan tidak bisa disewa, hanya kesempatan untuk membeli selamanya tersedia. Tetapi film-film Rusia mungkin tersedia dengan berlangganan segera setelah rilis dan kadang-kadang bahkan bersamaan dengan dimulainya sewa di bioskop offline.
Ketika kontrak berakhir, film menjadi tidak tersedia - sampai perpanjangan kontrak berakhir atau kesimpulan yang baru.

Periode kurangnya hak atas konten terlihat jelas pada grafik jumlah tampilan. Di bawah ini, misalnya, adalah bagan untuk film "John Wick 2". Pertama-tama, kelihatannya bahwa hadup berbaring untuk beristirahat selama beberapa bulan, tetapi tidak: hak telah berakhir.

Puncak tertinggi dalam grafik di atas (ditandai dengan garis vertikal) bertepatan dengan tanggal film ditambahkan ke langganan: ini adalah perilaku yang sangat khas untuk hal baru profil tinggi. Layanan kami memiliki 12 langganan:
- Delapan tematik
- Serial TV Amediateka,
- Serial TV ABC,
- Film dan seri Rusia dari layanan START,
- Film 4K.
Dan dua paket berlangganan: Optimal, yang mencakup semua langganan tematik, dan Optimal + Amediateka.

Yang paling populer, tentu saja, adalah paket meta. Dari langganan tematik, pengguna lebih memilih World Cinema dan Our Cinema.

Beberapa pengguna menonton film hanya dengan berlangganan, sebagian besar hanya membeli film atau membeli di samping berlangganan.
Paling sering, pengguna memilih untuk membeli barang baru untuk sewa saat ini dan pemutaran perdana tahun lalu.
Sumber pembelian paling populer dalam aplikasi adalah bagian "Rekomendasi", diikuti oleh "Pencarian", "Berita" dan "Katalog". Pengguna membeli sebagian film dari "Mirip" dan "Hafalkan".

Salah satu masalah utama yang kami perjuangkan secara aktif di Okko adalah masalah pengguna memilih konten. Jika Anda melihat grafik kemungkinan melakukan pembelian versus waktu yang Anda habiskan dalam layanan (data untuk tahun lalu), akan menjadi jelas bahwa pengguna siap untuk memilih dan membeli film dalam 10 menit pertama, maka kemungkinan pembelian dengan cepat berkurang. Pada saat yang sama, masih ada sebagian besar pengguna yang menghabiskan dalam layanan dari setengah jam hingga satu jam dan tidak dapat memilih konten yang cocok untuk diri mereka sendiri.
10 menit - tidak terlalu banyak. Selama waktu ini, pengguna tidak dapat secara fisik memeriksa katalog secara terperinci dan memilih konten yang disukainya.
Di sinilah Rekko, sistem rekomendasi internal untuk teater film online Okko, masuk. Rekko saat ini beroperasi di dua bagian layanan - "Rekomendasi" dan "Serupa".


Untuk menilai kepuasan pengguna dengan konten, kami menganalisis fakta pembelian, tampilan berdasarkan langganan, waktu menonton, menambah peringkat Dihafal dan pengguna.
Skala peringkat di Okko diwakili oleh lima tanda bintang dengan setengah divisi: dibutuhkan nilai integer dari 0 hingga 10.

Pengguna dapat menilai film kapan saja, terlepas dari fakta pembelian atau tontonan. Skor dapat diubah berkali-kali tanpa batas, tetapi tidak dapat dibatalkan.
Anda dapat "mengingat" film kapan saja, maka itu akan muncul di "ingat" di profil pengguna. Dengan cara yang sama, dapat dihapus dari sana.


Pengerjaan Rekko dimulai tepat setahun yang lalu dan saat ini, menurut tes A / B, itu memungkinkan kami untuk meningkatkan jumlah pembelian rata-rata sebesar 4%, pendapatan transaksi sebesar 3%, konversi ke langganan sebesar 5%, dan pengguna mulai memilih film 18% lebih cepat .

Data
Semua data, kecuali untuk melihat waktu dan peringkat, dianonimkan atau didistorsi. Waktu dinyatakan dalam satuan-satuan abstrak di mana hubungan keteraturan dan jarak dipertahankan.
transaction.csv
Rekaman semua transaksi dan tampilan konten pada mereka selama periode pelatihan. Transaksi di sini adalah pembelian film selamanya, baik untuk disewakan atau untuk memulai menonton dengan berlangganan.
element_uid
- pengidentifikasi elemenuser_uid
- id penggunaconsumption_mode
- jenis konsumsi ( P
- beli, R
- rental, S
- view by berlangganan)ts
- waktu transaksiwatched_time
- jumlah detik yang ditonton oleh pengguna untuk detik transaksi inidevice_type
- jenis perangkat anonim tempat transaksi dilakukandevice_manufacturer
- produsen anonim dari perangkat tempat transaksi dilakukan

ratings.csv
Informasi tentang peringkat pengguna untuk periode pelatihan. Informasi dikumpulkan, mis. jika pengguna mengubah peringkatnya, hanya nilai terakhir yang akan disajikan dalam tabel.
element_uid
- pengidentifikasi elemenuser_uid
- id penggunarating
- rating
ditentukan pengguna (dari 0
hingga 10
)ts
- peringkat waktu

bookmarks.csv
Fakta bahwa pengguna menambahkan film ke "diingat". Informasi dikumpulkan, mis. jika pengguna menghapus film dari "Tersimpan", tidak akan ada catatan untuk menambahkannya di tabel.
element_uid
- pengidentifikasi elemenuser_uid
- id penggunats
- waktu untuk menambahkan film ke "ingat"
catalogue.json
Meta-informasi tentang semua elemen yang direkomendasikan: film, seri, dan film serial.
{ "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
- mengambil nilai movie
, multipart_movie
atau series
duration
- durasi dalam hitungan menit, dibulatkan menjadi puluhan (durasi seri untuk film seri dan serial)availability
- hak yang tersedia untuk konten (mungkin mengandung nilai purchase
, rent
, dan subscription
)attributes
- tas beberapa atribut anonimfeature_1..5
- lima bahan anonim dan fitur ordinal
Hak-hak yang tersedia ditunjukkan pada akhir periode pelatihan dan awal ujian.
Penting: di json, kunci kamus hanya berupa string, jadi pastikan untuk melemparkannya ke nomor jika Anda membaca pengidentifikasi dalam tabel sebagai angka (lakukan ini untuk menghemat memori).

Metrik
Sebagai metrik, kami menggunakan Mean Average Precision (MAP) untuk 20 elemen, tetapi sedikit dimodifikasi. Selama periode pengujian, pengguna dapat mengonsumsi kurang dari 20 film. Jika dalam hal ini kami menganggap PETA yang jujur, batas atas metrik akan kurang dari satu, dan nilainya akan kecil. Oleh karena itu, jika pengguna telah mengonsumsi kurang dari 20 elemen, kami menormalkan dengan jumlah mereka, dan bukan oleh 20.
- terletak Elemen prediksi dalam himpunan elemen yang dikonsumsi selama periode pengujian oleh pengguna , Apakah ukuran set ini. Jika tiba-tiba metrik kualitas peringkat dilupakan, ada artikel bagus tentang mereka di hub
Kode Metrik dalam 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)
Hadiah dan aturan
Dana hadiah adalah 600 ribu rubel:
- 300 ribu akan menerima pemenang,
- 200 ribu - peserta di tempat kedua
- 100 ribu - peserta di tempat ketiga.
Aturannya standar: jangan mengganggu platform, gunakan hanya satu akun, hindari pertukaran kode pribadi dengan peserta lain dan jangan menjadi karyawan Okko dan Rambler.
Bagaimana memulainya
Bahkan mungkin sulit bagi profesional berpengalaman untuk mulai berpartisipasi dalam kompetisi: Anda perlu dengan cepat mengetahui area domain baru, memahami dan menganalisis data, dan memilah perpustakaan baru.
Kami berharap bahwa dalam artikel ini kami dapat membenamkan Anda dalam subjek sinema online dan mendeskripsikan datanya dengan cukup detail. Dalam arsip dengan tugas, Anda akan menemukan file baseline.ipynb
, yang berisi kode untuk memuat data dan contoh solusi sederhana menggunakan algoritma K tetangga terdekat.
Jika ada poin dari deskripsi data dan domain domain tetap tidak jelas, kami akan dengan senang hati menjawab pertanyaan Anda di komentar. Anda juga dapat mengajukan pertanyaan di saluran telegram @boosterspro - akan ada diskusi utama kompetisi.
Jadi bagaimana memulainya:
- Daftar ke boosters.pro dan bergabunglah dengan @boosterspro ;
- Unduh data di halaman kompetisi atau di sini ;
- Buka
baseline.ipynb
, instal paket yang diperlukan, jalankan semua kode dan unduh solusi pertama Anda; - Coba ubah baseline untuk meningkatkan kinerja;
- Eksperimen!
Tantangan Rekko dimulai hari ini, 18 Februari. Keputusan dibuat sampai 18 April, 23:59:59 waktu Moskow.
Kami menunggu semua orang dan semoga sukses!
Ngomong-ngomong, kami mencari karyawan . Termasuk pengembang sistem rekomendasi.
UPD 02/26/2019: Menemukan bug dalam pembentukan data uji, menggantinya dan file test_users.json . Semua peserta diberikan upaya tambahan.