movie recmmender system

Membuat Movie Recommender System Dengan Python

Pada artikel sebelumnya telah saya bahas sekilas serba-serbi recommender system. Kali ini kita akan coba membuat movie recommender system yang akan merekomendasikan film yang belum pernah ditonton seorang user berdasarkan riwayat film yang telah dia rating sebelumnya (Content-Based Filtering). Implementasi recommender system ini akan menggunakan Python.

Step by Step Content-Based Recommender System

Sebelum kita mulai coding, saya akan tunjukkan perhitungan Content-based recommender system langkah per langkah. Sebenarnya ada banyak pengembangan dan metode lain yang dapat digunakan tapi untuk kali ini saya akan tunjukkan konsep dasar yang paling sederhana.

1. Buat matrix riwayat user

Content-based menggunakan riwayat user dan profil item sebagai bahan dasar saat merekomendasikan. Untuk movie recommender, pertama-tama kita buat matrix atau tabel yang barisnya merupakan daftar semua film yang telah dirating oleh user, dan kolomnya ada semua “fitur” atau profil dari sebuah film.

“Fitur” atau profil film ini dapat kita tentukan sendiri dengan beragam cara dari yang sederhana hingga rumit. Yang paling sederhana adalah dengan mengekstrak secara manual profil sebuah film yang biasanya menjadi pertimbangan dalam menonton. Misalnya saya contohkan pada tabel di bawah adalah genre sebuah film.

MysterySci-FiDramaThrillerHorrorRating
Unbreakable1118.5
The Sixth Sense1115
Gone Girl1118
Alien116.5
Memento118

Pada contoh di atas saya menggunakan fitur 5 genre film (Misteri, Sci-Fi, Drama, Thriller, Horror). Ketika sebuah film masuk dalam salah satu genre tersebut maka diberi angka 1 pada sel yang bersesuaian (one-hot encoding). Sedangkan kolom rating adalah kolom “target” yang menjadi acuan suka tidaknya user terhadap sebuah film. Rating diberikan antara 1-10.

2. Dapatkan vektor profil user

Vektor profil user adalah sebuah vektor (array 1 dimensi) yang merangkum matrix riwayatnya. Paling sederhana adalah dengan menjumlahkan semua nilai pada kolom fitur yang sama (tidak termasuk kolom rating), seperti berikut:

MysterySci-fiDramaThrillerHorror
User A42322

Tetapi metode menjumlahkan tentu tidak “merangkum” dengan baik. Tampak nilai pada kolom Sci-fi, Thriller, dan Horror adalah sama tanpa menunjukkan mana yang lebih disukai. Metode ini juga bisa menghasilkan bias. Seorang user bisa jadi dianggap menyukai kategori yang sering dia tonton, walaupun dia selalu memberi rating dengan nilai buruk pada kategori tersebut.

Metode lain yang dapat digunakan adalah dengan merata-rata rating setiap kolom fiturnya. Untuk memudahkan secara notasi matematika matrix ini kita beri nama matrix $M$ dengan $m_{ij}$ merujuk pada film ke-$i$ fitur ke-$j$. Sedangkan, bagian rating kita beri nama $R$ dengan $r_i$ merujuk pada rating film ke-$i$. Dengan menganggap milai matrix yang kosong dengan angka 0, proses merata-rata fitur ke-$j$ bisa dirumuskan sebagai berikut:

$$ ProfilFitur_j = \frac {\sum_i m_{ij} \times r_i} {\sum_i m_{ij}} $$

Sebagai contoh, untuk kolom Sci-Fi nilai akhirnya dihitung dengan cara:

$$ SciFi = \frac{(1 \times 8.5) + (0 \times 5) + (0 \times 8) + (1 \times 6.5) + (0 \times 8)}{1 + 0 + 0 +1 + 0} = 7.5 $$

Sehingga diperoleh profil user dari matrix di atas adalah:

MysterySci-fiDramaThrillerHorror
User A7.377.57.1785.75

3. Prediksi rating film berdasarkan profil

Setelah diperoleh vektor profil user, kita dapat memprediksi film mana yang akan disukai oleh user. Misalnya jika diketahui dua film berikut, kira-kira mana yang lebih disukai?

MysterySci-fiDramaThrillerHorror
Bad Times at the El Royale11
Angels and Demons11

Kita bisa hitung perkiraan rating yang akan diberikan oleh user A dengan cara yang mirip dengan sebelumnya. Yakni merata-rata hasil perkalian profil film tersebut dengan profil user (rata-rata dilakukan per-film/per-baris):

$$ BadTimes = \frac {(1 \times 7.37) + (0 \times 7.5) + (1 \times 7.17) + (0 \times 8) + (0 \times 5.75)}{1 + 0 + 1 + 0 + 0} = 7.27$$

$$ AngelsD = \frac {(1 \times 7.37) + (0 \times 7.5) + (0 \times 7.17) + (1 \times 8) + (0 \times 5.75)}{1 + 0 + 0 + 1 + 0} = 7.68$$

Dari perhitungan di atas dapat diprediksi user A akan lebih menyukai film Angels and Demons.

Dataset

Untuk implementasi ini saya akan menggunakan dataset yang dimodifikasi dari MovieLens. Dataset original MovieLens yang bisa didownload di sini (saya menggunakan yang “ml-latest-small.zip”). Dataset tersebut terdiri dari beberapa file yang masing-masing deskripsinya bisa dibaca di bagian README.

Dataset tersebut saya modifikasi untuk memudahkan dengan penggabungan fitur-fitur (serta penambahan melalui crawling) yang dirasa perlu pada satu file dataset. Karena kita akan membuat content-based recommender system untuk satu user, maka dataset yang saya modifikasi juga berfokus hanya riwayat rating satu user saja.

Dataset yang telah dimodifikasi dapat didownload di sini yang merupakan bagian dari repository github tutorial ini. Dataset yang tersedia telah terbagi menjadi dua bagian, yakni data train yang berisi rating beserta profil film yang telah dirating oleh seorang user sebelum tahun 2017 dan data test yang merupakan rating beserta profil film yang telah dirating oleh user yang sama pada tahun 2017-2018.

Implementasi

Karena kodenya tidak terlalu panjang, saya tidak akan menuliskan secara detail di artikel ini. Kode lengkap bisa lihat di repo github berikut pada file recommender.py. Saya menggunakan pandas sebagai library utama untuk manipulasi matrix.

Di kode tersebut saya menggunakan 21 fitur: 19 fitur pertama adalah genre film, dan 2 fitur berikutnya adalah aktor utama pada film tersebut (2 nama ini dipilih dari 2 nama aktor yang filmnya paling sering dirating oleh user pada data train), dapat dilihat pada variabel list features.

Lalu inti dari kode tersebut terbagi menjadi tiga bagian (dapat dibaca di comment section kode tersebut):

  1. Memformat dataset, karena dataset yang tersedia bukan one-hotencoded seperti tabel contoh di atas maka perlu penyesuaian terlebih dahulu.
  2. Membuat user profile, sesuai dengan rumus di atas menggunakan rata-rata rating tiap fitur
  3. Memprediksi hasil pada data test, sesuai dengan cara di atas menggunakan rata-rata juga..

Hasil prediksi dapat dilihat di file result.csv setelah program dijalankan. Jika diperhatikan hasilnya belum terlalu bagus, tetapi beberapa film yang di rating oleh user dengan hasil yang tinggi juga berhasil terprediksi dengan nilai yang tinggi.

Masih ada banyak metode yang dapat digunakan untuk meningkatkan kualitas recommender ini, yang jika ada kesempatan akan saya bahas. Sekian, semoga bermanfaat 🙂

Sumber gambar cover: flickr

About the author

Rian Adam

View all posts

Leave a Reply

Your email address will not be published. Required fields are marked *