Saturday, April 17, 2021

Sistem rekomendasi Non-personalized vs Personalized

Di akhir pekan bulan Ramadhan ini kembali lagi saya akan share tentang salah satu topik menarik di sistem rekomendasi yaitu tentang personalisasi. Secara umum sistem rekomendasi terbagi menjadi tipe personalized dan non-personalized.

Sedangkan menurut Kim Falk dalam bukunya "Practical Recommender System" (silahkan bisa tulis alamat email di comment jika ingin versi PDF nya 😉), menjelaskan terdapat 3 tipe level dalam personalisasi ini, yaitu sebagai berikut:

Kim Falk - Practical Recommender System

Mari kita bahas lebih mendalam satu-persatu

1. Non-personalized

Merupakan tipe personalisasi yang sederhana, dimana hasil generate dari teknik rekomendasi ini tidak membedakan antar pengguna. Semua pengguna akan mendapatkan item rekomendasi yang sama. Biasanya digunakan untuk menampilkan item favorit pada film, produk terlaris di e-commerce atau top hits music chart di sistem rekomendasi musik. 

Pada tipe ini kita tidak perlu mengetahui informasi khusus tentang preferensi pengguna. Jadi, kita tidak mengumpulkan data historis dari penilaian atau pembelian pengguna untuk menghasilkan rekomendasi. Pada e-commerce biasanya terdapat juga mode rekomendasi seperti ini "People who buy X also buy Y", misalkan, Orang yang membeli Smartphone juga membeli Phone Cover.

Rekomendasi Non-personalized pada Amazon


Umumnya teknik rekomendasi yang digunakan pada Non-pesonalized yaitu IMDb weight rating atau Content-based filtering

2. Semi/Segment-personalized

Berikutnya adalah personalisasi dengan segmentasi khusus, sebagai contoh pengguna dengan kesamaan usia, lokasi, distinct pattern seperti pengusaha atau pelajar, akan mendapatkan rekomendasi yang sama berdasarkan segment tersebut.

Contoh lainnya adalah seperti pada sistem rekomendasi music yang dijalankan pada smartphone, dimana aplikasi tersebut dapat mendeteksi apakah pengguna sedang bergerak(jogging, running, cycling atau sedang mengemudi) atau pengguna tidak beraktifitas, seperti menikmati kopi di cafe sambil mendengarkan musik, maka item rekomendasi yang dihasilkan akan berbeda dari kedua segment tersebut.

Sistem ini tidak menggunakan history dari data anda, tetapi karena anda berada pada group atau segment tertentu maka akan mendapatkan item rekomendasi yang sama pada setiap segment. Metode yang digunakan pada tipe ini masih sama seperti pada tipe sebelumnya yaitu Non-personalized, dimana dengan tambahan filter berdasarkan segment yang bisa diambil dari informasi pengguna.

3. Personalized

Personalized recommendation ini didasarkan pada data tentang pengguna yang menunjukkan bagaimana pengguna telah berinteraksi dengan sistem sebelumnya. Dengan kata lain, pada rekomendasi ini akan dihasilkan item yang khusus pada masing-masing pengguna.

Tipe rekomendasi ini paling banyak digunakan pada beberapa layanan populer seperti Amazon, Netflix, Youtube, dsb. Hal ini dirasa paling sesuai dengan filter yang dibutuhkan setiap pengguna sehingga sangat perlu di implementasikan pada layanan tersebut. Terdapat 2 cara untuk mendapatkan interaksi dari pengguna ke sistem yaitu dengan cara implisit(browsing history) dan explisit(rating).

Collaborative filtering paling banyak digunakan pada tipe ini, dimana preferensi pengguna akan di komparasi kemiripannya dengan pengguna lain kemudian prediksi rating akan diterapkan untuk mendapatkan item rekomendasi tersebut.

Personalized recommendation di Netflix

Kesimpulan

Jika kita ingin membuat personalized recommendation, maka perhatikan data-data history rating dari pengguna. Jika terdapat pengguna baru dan belum ada history ratingnya, akan menyebabkan hasil rekomendasi kurang sesuai (biasa disebut cold start problem). Sedangkan pada tipe non-personalized dan segment-personalized tidak membutuhkan data rating tersebut, karena menggunakan atribut dari setiap item product.

Sistem rekomendasi dengan tipe Non-personalized merupakan cara yang sederhana, lebih jauh lagi dalam bukunya, Francesco Ricci - Recommender System Handbook, mengatakan bahwa tipe ini efektif dalam beberapa situasi tetapi penelitian tentang Recommender system tidak ditujukan untuk tipe ini.

Tidak perlu dishare artikel ini jika dirasa tidak bermanfaat yaa.. 

Referensi

    1. Anna Makharadze, 1) Introduction to Recommendation Systems, https://medium.com/machine-learning-and-artificial-intelligence/1-introduction-to-recommendation-systems-for-beginners-b50c86f5fccf
    2. Kim Falk, Practical Recommender System
    3. Francesco Ricci, Recommender System Handbook

    Saturday, March 27, 2021

    Simple rekomendasi dengan Formula IMDb Weighted Rating

    Alhamdulillah setelah diskusi seputar penelitian bidang sistem rekomendasi dengan rekan-rekan di kampus, akhirnya ter inisialisasi group telegram untuk kolaborasi penelitian dan belajar bersama di bidang information retrieval dan sistem rekomendasi di url berikut: https://t.me/joinchat/CH_ihoMW7XdjZTA1

    Oiyaa, siapapun yang ingin belajar bersama boleh koq join di group tersebut, semoga saja bisa bermanfaat. Semoga kita bisa konsisten sharing-sharing setiap akhir pekan.. mohon doanya ya.

    Langsung aja degh, kita bahas kembali tentang metode yang sangat simple pada sistem rekomendasi yaitu dengan menggunakan rumus yang ada di IMDb (Internet Movie Database). Metode ini termasuk ke dalam konsep non-personalized, jadi setiap users/costumers akan mendapatkan suatu list item rekomendasi yang sama, tidak ada interferensi dari history atau kemiripan item atau pengguna.

    Ide untuk menggunakan metode rekomendasi ini adalah:

    1. Film-film yang lebih populer akan memiliki kemungkinan yang lebih besar untuk disukai juga oleh rata-rata penonton.
    2. Model ini tidak memberikan rekomendasi yang personal untuk setiap tipe user. 
    3. Implementasi model ini pun juga bisa dibilang cukup mudah, yang perlu kita lakukan hanyalah mengurutkan film-film tersebut berdasarkan rating dan popularitas dan menunjukkan film teratas dari list film tersebut.
    Berikut ini formula/rumus yang digunakan untuk mengenerate score pada IMDb Weighted rating:


    Dimana:
    v: jumlah votes untuk film tersebut
    m: jumlah minimum votes yang dibutuhkan supaya dapat masuk dalam chart
    R: rata-rata rating dari film tersebut
    C: rata-rata jumlah votes dari seluruh semesta film
    
    Formula ini digunakan IMDb untuk perhitungan Top Rated 250 titles, dengan perhitungan Bayesian estimate yang menghitung jumlah vote dari setiap judul, vote minimum untuk masuk ke dalam daftar, dan rata – rata vote dari keseluruhan judul.

    Berikut ini contoh kode di python (Jupyter notebook) untuk perhitungannya, disini saya masih menggunakan dataset seperti pada artikel sebelumnya untuk rekomendasi dengan metode content-based filtering yaitu di domain hotel.

    Code 


    Untuk kode lengkap dan dataset yang saya gunakan bisa langsung meluncuuur di github berikut ini: https://github.com/ariflaksito/imdb-wr-recsys.

    Untuk skripsi ataupun TA, metode ini terlalu sederhana untuk dijadikan topik/tema penelitian. Saran saya anda bisa menggabungkan dengan metode yang lainnya, misalnya di kombinasikan dengan content-based filtering atau dengan collaborative filtering.

    Referensi

    1. DQLab Academy, Building Recommedner system, https://academy.dqlab.id/main/package/practice/212
    2. IMDb, Help, https://help.imdb.com/article/imdb/track-movies-tv/ratings-faq/G67Y87TFYYP6TWAV?ref_=helpms_helpart_inline#calculatetop
     




    Monday, January 4, 2021

    Menggunakan SQLite di Android

    Alhamdulillah.. awal tahun ini dimulai dengan posting artikel tentang SQLite di Android, semoga bermanfaat untuk rekan-rekan mahasiswa yang sebentar lagi akan menghadapi ujian akhir semester.

    Android telah menyediakan salah satu mekanisme penyimpanan database terstruktur dan berelasi dengan menggunakan SQLite. SQLite merupakan database yang bersifat open source yang mendukung operasi relasi standar yang umum terdapat pada engine database seperti sintaks SQL dan operasi transaksi. Meskipun berjalan seperti database, pada umumnya sqlite berukuran kecil dan mampu berjalan pada peranti dengan memori terbatas seperti smartphone.

    Pada artikel kali ini kita akan membuat aplikasi Android untuk melakukan CRUD pada tabel student di SQLite dimana terdapat 3 field yaitu, id, nim dan nama.


    Kita bisa mulai dengan membuat project baru bernama MyStudents dengan tipe Empty Activity bernama MainActivity dan target minimum API Level bisa kita pilih 21.

    Langkah pertama adalah buat package baru dengan nama model, kemudian buat class di Java dengan nama Students.java seperti code berikut:

    Pada class Student diatas kita perlu implement ke Serializable supaya nantinya saat proses edit data, object student tersebut dapat dikirimkan melalui intent ke activity UpdateActivity

    Selanjutnya buat package baru kembali dengan nama db dan buat class baru dengan nama DbHelper.java, berikut codenya:

    Code diatas merupakan Class bantuan untuk pengolahan database DDL(Data Definition Language) dan DML(Data Manipulation Language), dimana untuk proses DDL terdapat pada method onCreate dan onUpgrade, sedangkan proses DML pada method lainnya.

    Tahapan selanjutnya adalah kita akan buat proses insert data ke database, disini akan digunakan MainActivity untuk implementasinya. Pertama kita siapkan terlebih dahulu layout di activity_main.xml dengan code dibawah ini:

    Kemudian pada MainActivity kita lengkapi code nya seperti dibawah:

    Pada code diatas sebelum proses insert ke database kita lakukan terlebih dahulu validasi untuk pengisian EditText nim dan nama, dimana tidak boleh kosong. Selanjutnya, jika validasi terpenuhi maka proses insert akan dilakukan dengan menggunakan object dari class DBHelper pada method addUserDetail( ).

    Jika AndroidStudio dan versi Java anda sudah mendukung lambda, maka seperti pada code diatas, penulisan onClickListerner bisa kita sederhanakan dengan lambda. Pada blok code yang berwarna grey/abu-abu bisa anda select kemudian tekan tombol Alt+Enter, maka akan muncul pilahan "Replace with lambda". Sampai proses ini kita sudah bisa melakukan proses input data ke database, silahkan bisa anda ujicoba run aplikasi tersebut

    Proses insert data


    Proses selanjutnya adalah menampilkan data menggunakan RecyclerView, disini kita perlu membuat class adapter dengan nama StudentAdapter yang bisa kita letakan di package adapter dan juga activity baru dengan nama ListStudentActivity. 

    Untuk melengkapi adapter tersebut, kita buat terlebih dahulu layout untuk menampilkan data Student di file item_student.xml dan activity_list_student.xml dengan code berikut:

    Berikutnya file StudentAdapter kita lengkapi seperti code dibawah ini:

    Pada code diatas masih menampilkan notice error pada baris ke-36 dikarenakan kita belum membuat file UpdateActivity untuk proses edit data. Kita bisa comment terlebih dahulu baris ke-36, 37 dan 38 supaya tidak menyebabkan error, selanjutnya nanti bisa kita uncomment kembali untuk melanjutkan proses edit data.

    Berikutnya pada file ListStudentActivity, kita tambahkan code dibawah ini untuk menampilkan data-data yang sudah ada di database ke dalam RecyclerView

    Kita bisa melakukan ujicoba dengan menjalankan/run project tersebut, jika sesuai maka aplikasi tersebut akan menampilkan list data student dan bisa kita lakukan penghapusan dengan klik tombol delete pada list di masing-masing student. Sebelum data tersebut dihapus, aplikasi akan memunculkan alertDialog dimana untuk memastikan user benar-benar akan menghapus data tersebut. Proses ini dilakukan pada file AdapterStudent baris ke-41 sampai dengan baris ke-60.

    Menampilkan data students


    Sedangkan proses edit data belum bisa dilakukan, saat kita tekan tombol edit maka tidak akan terjadi action apapun. Untuk melengkai fitur edit, kita buat activity baru dengan  nama UpdateActivity. Berikut ini code untuk UpdateActivity dan layout nya yaitu activity_update.xml

    Setelah code dari kedua file diatas lengkap, kita lakukan uncomment pada file StudentAdapter pada baris ke-36, 37 dan 38. Kemudian bisa kita jalankan aplikasi tersebut dan bisa kita ujicoba untuk melakukan edit pada data student.

    Setelah proses edit berhasil maka akan ditampilkan list daftar student, supaya RecyclerView dapat update data terakhir maka perlu ditambahkan override method onResume di activity, seperti pada code di file ListStudentActivity pada baris ke-25 s/d baris ke-31

    Silahkan anda coba untuk mempraktikan code diatas secara berurutan ya, dipahami masing-masing keterangan pada code tersebut. Jika ada pertanyaan lebih lanjut lagi bisa tulis di komentar, atau jika membutuhkan code lengkapnya bisa tulis di komentar juga alamat email anda, nanti saya kirim code project secara lengkap.

    Referensi:

    1. Dicoding Acedemy - Belajar Fundamental Aplikasi Android, Codelab Aplikasi Catatan, https://www.dicoding.com/academies/14/tutorials/527
    2. Android SQLite Tutorial | CRUD Operation Example, https://demonuts.com/android-sqlite/#simple