Sunday, September 12, 2021

Mengenal Regresi linear dan perhitungannya

Disini kita akan bahas salah satu model statistik yang umum digunakan untuk Machine Learning untuk melakukan prediksi dengan cara supervised learning, yaitu regresi linear. Metode ini melibatkan 2 variabel dimana salah satunya adalah variabel independen (x) dan satu lagi adalah variabel dependen (y)

  • Independen berarti variabel ini sebagai variabel utama yang mungkin akan mempengaruhi nilai variabel kedua (dependen). 
  • Dependen berarti nilai variabel ini akan tergantung dari nilai variabel independennya, jika korelasi tinggi maka dependensi juga tinggi.

Untuk memudahkan pemahaman, kita gunakan data sample berat dan tinggi badan dari 10 orang sebagai berikut ini:

Data Tinggi Badan(cm) : 151,174,138,186,128,136,179,163,152,131
Data Berat Badan (Kg) : 63, 81, 56, 91, 47, 57, 76, 72, 62, 48

Regresi Linear adalah proses mencari garis linear yang menujukkan korelasi antara kedua variabel tersebut, garis linear itu akan didapat dengan sebuah persamaan :

y = ax + b atau y = w1x + w0

dimana: 
a atau w1 adalah slope / gradient / coefficient
b atau w0 adalah intercept / bias

Ciri dari problem regresi ini adalah kasusnya diminta menebak angka. Jenis outputnya bersifat continuous. Contoh lain dari regresi ini misalnya menebak curah hujan, harga rumah, jumlah kendaraan pemudik, dsb.

Perhitungan Manual

Untuk mendapatkan nilai coef(A) dan intercept/bias(B) digunakan rumus:


Gambar diatas menjelaskan detail perhitungan dari rumus tersebut kedalam excel. Dalam mencari nilai coef A dan intercept/bias B di excel digunakan formula pada sheet berikut:

A =((C25*C24)-(C23*C21))/((C25*C22)-(C23*C23))
B =((C21*C22)-(C23*C24))/((C25*C22)-(C23*C23))

Menggunakan Python

Perhitungan di python lebih sederhana, dimana kita bisa menggunakan library sklearn, seperti pada contoh kode dibawah ini:

Nilai coef dan intercept didapatkan dari kode baris ke-19 dan-20 diatas, sehingga akan didapatkan persamaan linear sebagai berikut:

y = 0.674 * x + (-38.455)

Sedangkan hasil dari plot data seperti pada gambar dibawah, dimana garis merah merupakan nilai prediksi dari model linear regresi dan titik-titik biru adalah 10 data training yang digunakan.

Regresi Linear Berganda

Regresi Linear Berganda adalah model regresi linear dengan melibatkan lebih dari satu variable bebas/independen dan persamaannya adalah

y = a1x1 + a2x2 + .. + anxn + b

Untuk pembahasan prediksi menggunakan regresi liner berganda kali ini akan diambil dari paper yang telah dipublish oleh mas Ervan Triyanto di jurnal Rabit, Juli 2019. Kasus ini adalah prediksi jumlah produksi padi di kabupaten Bantul dengan data yang digunakan dari tahun 2009 sampai dengan 2017. Di penelitian tersebut perhitungan nya diimplementasikan ke dalam aplikasi web menggunana PHP sebagai bahasa pemrogramannya. Di artikel ini akan digunakan python untuk perhitungannya dengan alasan kemudahannya.

Downlod pada link ini untuk mendapatkan artikelnya.  

Terdapat 1 variabel dependen yaitu jumlah produksi padi (dalam ton), sedangkan terdapat 3 variabel independen yaitu: curah hujan, luas lahan dan tingkat serangan hama. 

Berikut contoh code di Python untuk menghitung kasus produksi padi diatas:

Dari data diatas, didapatkan persamaan untuk prediksi sebagai berikut:

y = 5.929528x1 + 118.27991767x2 -175.71483753x3 + 8306.792151921123
dimana: luas lahan(x1), curah hujan(x2) dan hama(x3)

Evaluasi

Evaluasi untuk model linear regresi dapat dilakukan dengan beberapa metrik evaluasi seperti: MAE (Mean Absolute Error), MSE (Mean Squared Error) atau RMSE (Root Mean Squared Erorr).

RMSE merupakan salah satu cara untuk mengevaluasi model regresi linear dengan mengukur tingkat akurasi hasil perkiraan suatu model. RMSE dihitung dengan mengkuadratkan error (prediksi – observasi) dibagi dengan jumlah data (rata-rata), lalu diakarkan. RMSE tidak memiliki persamaan:

Pada kode python diatas, evaluasi model dituliskan pada baris kode ke-50 dengan menggunakan library metrics dari sklearn dan didapatkan score RMSE yaitu: 3.5045

Kesimpulan

Meskipun Linear regresi mudah diimplementasikan untuk melakukan prediksi pada data yang bersifat continuous, tetapi terdapat juga kekurangannya yaitu mudah terjadi overfitting dan sulit dilakukan prediksi jika relasi antara variabel dipenden dan independen tidak linear atau korelasi sangat rendah.

Jika membutuhkan dataset tersebut bisa tulis email pada komentar ya.. Bisa anda gunakan untuk penelitian dengan metode machine learning lainya dan silahkan dibandingkan nilai errornya dengan penelitian ini.

Referensi

  1. Jimy, Regresi Linier dengan R dan Python, https://medium.com/@jrendz/regresi-linier-dengan-r-dan-python-ebb80662c6da
  2. Jasme Moody,What does RMSE really mean?, https://towardsdatascience.com/what-does-rmse-really-mean-806b65f2e48e
  3. Triyanto, E., Sismoro, H., & Laksito, A. (2019). Implementasi Algoritma Regresi Linear Berganda untuk Memprediksi Produksi Padi di Kabupaten Bantul. Rabit : Jurnal Teknologi Dan Sistem Informasi Univrab, 4(2), 73-86. https://doi.org/10.36341/rabit.v4i2.666

Friday, August 20, 2021

Menghitung Similarity dan Prediksi rating pada Collaborative filtering menggunakan Python

Melanjutkan artikel sebelumnya, bagaimana menghitung similarity antara user di sistem rekomendasi collaborative filtering(CF) dengan menggunakan excel, pada artikel ini saya akan share menghitung similarity user dan prediksi rating dengan menggunakan bahasa python di jupyter notebook.

Prediksi rating

Pada eksperimen ini akan digunakan sample data yang sama seperti pada artikel sebelumnya, lebih detail bisa anda simak disini: "Memahami Collaborative filtering di Sistem rekomendasi". Untuk pembahasan notebook tersebut saya bagi kedalam 2 bagian yaitu: User-based dan Item-based.

User-based CF Notebook

Pertama diperlukan membuat sample data dari library pandas yang kemudian kita susun menjadi matrix untuk user, item, dan rating. Pada matrix tersebut, nilai Nan/kosong di ubah menjadi rating dengan nilai 0.


Matrix user-based rating

Selanjutnya kita akan buat nilai rerata dari tiap user dan membuat matrix baru dengan nilai rating diambil dari selisih rerata dan rating asli.


Untuk menghitung similarity, dapat menggunakan library dari sklearn yaitu cosine_similarity. Disini kita perlu membuat suatu fungsi dengan parameter yaitu matrix rating, user aktif (yang akan kita cari nilai rating kosongnya) dan nilai k (jumlah tetangga/neighbor).


Output dari fungsi diatas akan menghasilkan nilai similarity dari user: Arif ke user lainnya berdasar dari matrix yang kita inputkan di parameter.

(['Don', 'Bob'], [0.7071067811865476, 0.30151134457776363])
Langkah terakhir adalah kita buat fungsi predict( ) untuk menghitung prediksi nilai kosong dari matrix tersebut pada user Arif di item-4.


Output dari fungsi tersebut adalah prediksi rating pada kolom item-4 seperti berikut:

array([[4.42526623],
       [1.93594684],
       [3.42953847]])

Item-based CF Notebook

Sedikit berbeda dengan code sebelumnya, pada code item-based ini kita akan melakukan prediksi pada beberapa rating kosong. Mari kita bedah code tersebut dari awal. Dimulai dari membuat matrix rating data sample data seperti pada postingan ini: "Memahami Collaborative filtering di Sistem rekomendasi".


Matrix item-based rating

Berikutnya kita bisa buat fungsi untuk menghitung similarity antara 2 item


Sedangkan fungsi predict( ) untuk item-based ini sedikit lebih complicated, berikut langkah-langkah penjelasannya:
  1. Perulangan pertama adalah menjadikan nilai setiap item menjadi list
  2. Perulangan ke-2 kita gunakan untuk memfilter rating 0 dari tiap user
  3. Didalam perulangan ke-2, terdapat perulangan lagi untuk menghitung nilai prediksi dengan membaca per-baris dari rating item.

Setelah kita running fungsi diatas, maka akan menghasilkan output dalam bentuk list beberapa rating prediksi dari rating 0 di matrix yang kita inputkan pada parameter.

[2.4899844588770113, 3.4286096052067627, 2.0]
Sebagai informasi, pada kedua kode diatas belum ada fungsi untuk mengenerate item rekomendasi, disini hanya fokus pada bagaimana menghitung nilai similarity dan prediksi saja. Jika anda ingin mendapatkan kode lengkap di file python notebook (*.ipynb), silahkan isi pada kolom komentar dengan email anda, inshaAllah akan saya share kode lengkap tersebut.

Referensi

  1. Gambar diambil dari https://www.formstack.com/resources/blog-new-rating-field
  2. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  3. Item-based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/

Sunday, August 8, 2021

Keep productive during the pandemic


Since the beginning of 2020, most people have spent more than two-thirds of a day at home. Firstly, it seems enjoyable, because they do not need to go to school or the office as usual. However, it becomes hard to deal with it as time goes by since we are social creatures.

I really concede that it is a big problem when it happens to my students. The online meeting could not substitute offline classes where students learn and spend time discussing anything with their friends.

I will share amazing tips for students to deal with their mood to keep productive and finish studying on time.

1. Wake up early. 

Most computer engineering students enjoy doing their work, such as writing code, testing systems, or resolving bugs at midnight. Try to change your habit as I wrote in this article, "Kapan waktu efektif coding?"

2. Doing exercise

It is easy for people who have sport hobbies like cycling, running, or swimming to do it regularly. However, others think it will be a serious difficulty to start a routine exercise. You can download an exercise video from youtube, "7 minutes workout by Lifehack". I suggested starting small and regular ( twice or a third a week, every day will be better). For me, it is a tough moment; as a basketball fan, I should await my hobby activity until safe condition.

3. Clean up your desk and computer

It is believed that a tidy and clean workspace could maintain a great feeling. As a result, time will be productive to finish work. In this technology era, a computer is a vital part of students and workers. Unnecessary files in several folders sometimes make us frustrated. Allocate time for organizing this problem, although it is a dull activity.

Clean Downloads directory

4. Make it a habit

When you make any points above regularly, it is possible to become a healthy habit. Keep on track, and you will get advantages in your study.

Keep healthy. Stay strong!

Thursday, July 8, 2021

Memahami Collaborative filtering di Sistem rekomendasi

Collaborative filtering adalah teknik dalam sistem rekomendasi yang populer digunakan saat ini. Banyak penelitian yang membahas tentang teknik ini karena beberapa keunggulannya seperti: menghasilkan serendipity(tak terduga) item,  sesuai trend market, mudah diimplementasikan dan memumgkinkan diterapkan pada beberapa domain (book, movies, music, dll). 

Pengenalan sistem rekomendasi dan teknik lainnya bisa anda temukan pada artikel berikut:

Cara kerja teknik ini adalah dengan memanfaatkan data pada komunitas dengan cara mencari kemiripan atar pengguna, yaitu mengasumsikan bahwa pengguna yang memiliki preferensi serupa di masa lalu cenderung memiliki preferensi yang sama di masa depan. Pada dasarnya kita akan lebih percaya dengan rekomendasi dari orang yang memiliki preferensi sama dengan kita, inilah dasar yang digunakan oleh collaborative filtering dalam mengenerate item rekomendasi.


Dalam menghasilkan rekomendasi, sistem perlu mengumpulkan data. Tujuan dari pengumpulan data ini adalah untuk mendapatkan ide preferensi pengguna, dimana nantinya akan dibuat suatu rekomendasi berdasarkan preferensi tersebut. Terdapat 2 cara dalam mengumpulkan data, yaitu: Implicit dan Explicit.

Explicit merupakan cara pengumpulan informasi yang membutuhkan effort dari pengguna dengan memberikan feedback terhadap sistem, seperti mengisikan rating pada item (skala 1-5 atau skala lainnya) dan memilih tombol like atau dislike. Di sisi lain, implisit tidak membutuhkan interaksi dari pengguna ke sistem. Dengan kata lain, sistem secara otomatis mempelajari behavior dari pengguna saat menggunakan sistem, seperti melakukan perekaman informasi lama waktu saat melihat item, genre/kategori apa saja yang sering dilihat dan item apa saja yang pernah dibeli. Cara explisit lebih susah diterapkan, karena tidak semua pengguna melakukan penilaian terhadap item, hal ini yang akan menyebabkan kendala pada teknik collaborative filtering karena banyaknya rating kosong.

Collaborative filtering sendiri terbagi menjadi 2 bagian, yaitu Memory-based dan Model-based. Memory-based melakukan komputasi secara real-time, sedangkan Model-based menggunakan beberapa teknik di machine learning atau matrix factorization untuk melakukan training model terlebih dahulu dan bisa dilakukan secara offline. Memory-based memiliki keunggulan dalam hal kemudahan implementasi tetapi terkendala pada ukuran matrix besar yang menyebabkan scalablity dalam perhitungan. Teknik Memory-based terbagi ke dalam 2 class, yaitu: User-based dan Item-based. Teknik lain yaitu Model-based dengan beberapa metode seperti: Matrix factorization, Neural network, Bayesian, dll akan saya bahas di artikel lain. Kali ini saya akan detail bahas untuk yang Memory-based Collaborative filtering.

Kategori collaborative filtering


User-based vs Item-based CF

Memory-based collaborative filtering sering disebut juga dengan neighborhood-based collaborative filtering algorithms. Berikut ini penjelasan detail dari kedua class dalam Memory-based:

1. User-based collaborative filtering

Merupakan teknik yang digunakan untuk memprediksi item yang mungkin disukai pengguna berdasarkan penilaian yang diberikan pada item tersebut oleh pengguna lain yang memiliki selera yang sama dengan pengguna target. Berikut ini contoh penerapan dalam excel:



Pada matrix diatas, pengguna target adalah Arif, dimana kita akan memprediksi rating pada item_5. Tahap awal yang dilakukan adalah mencari pengguna yang memiliki preferensi sama dengan Arif. Lakukan perhitungan rata-rata rating dari setiap pengguna untuk item selain item_5, dihasilkan seperti berikut:



Kolom terakhir tersebut merupakan rata-rata dari tiap pengguna, misalkan Arif = (5+4+1+4)/4 = 3.50. Jika anda gunakan excel maka akan sangat cepat melakukan hitungan tersebut. Selanjutnya kita buat matrix baru yang berisi selisih dari rating asal dengan nilai rata-rata dari tiap pengguna.


Jika anda perhatikan rating Arif - item_1 didapatkan dari rating asal dikurangkan nilai rerata pengguna, yaitu:  5 - 3.5 = 1.5, rating Arif - item_2, yaitu:  4 - 3.5 = 0.5, dan seterusnya. Tahapan berikutnya adalah kita menghitung nilai similarity antar Arif dengan pengguna lainnya. Disini akan digunaan rumus cosine similarity yaitu seperti ini:

Misalkan kita akan hitung nilai similarity Arif dan Bob, maka didapatkan hasil seperti dibawah:

Dengan bantuan excel cukup kita drag saja rumus tersebut dan hasil dari similarity dari Arif dan ketiga pengguna lainnya adalah sebagai berikut:


Dari hasil perhitungan tersebut terlihat bahwa nilai similarity paling tinggi adalah antar Arif dengan Don yaitu 0.707. Nilai cosine similarity semakin besar nilai nya (mendekati 1) maka semakin mirip kedua vektor tersebut. Selanjutnya adalah prediksi rating untuk pengguna Arif pada item_5. Untuk menentukan prediksi ini kita bisa tentukan threshold/batas nilai kemiripan dari similarity pengguna, misalkan kita asumsikan similarity di dataset ini jika nilainya lebih dari 0.3, maka yang akan kita lakukan perhitungan data dari Arif, Bob dan Don. Clark tidak masuk perhitungan karena nilai similarity dibawah 0.3 (threshold yang kita tentukan). Untuk penentuan nilai threshold ini tidak ada aturan baku, jadi jika anda melakukan eksperimen silahkan di uji coba beberapa nilai threshold yang akan digunakan.

Dari rumus diatas kita bisa melakukan perhitungan untuk prediksi rating Arif ke item_5 dengan menggunakan neighbor Bob dan Don, yaitu nilai rerata Arif dijumlahkan dengan sigma dari nilai similarity antar pengguna dikalikan selisih rating dan rerata dibagi nilai absolute dari similarity beberapa pengguna tersebut.


Hasil dari prediksi rating tersebut (Arif - item_5) adalah 4.425. Bagaimana selanjutnya untuk mengenerate item rekomendasinya? Simulasi diatas hanya prediksi satu rating saja, untuk menghasilkan item rekomendasi kita bisa gunakan data real dengan jumlah data yang besar. Misalkan pada dataset real, rating Arif masih kosong di sejumlah item, misalkan item_5, item_13, item_104, item_451, item_533, dst. Dari hasil perhitungan prediksi pada rating-rating kosong tersebut, kita bisa urutkan dari rating besar ke kecil, kemudian iem-item berdasar rating tersebut bisa kita jadikan list sebagai item rekomendasi, kita juga bisa batasi sejumlah item saja(misal 5 item atau 10 item), atau biasa disebut Top-N recommendations.

2. Item-based collaborative filtering

Item-based collaborative filtering pertama kali digunakan oleh Amazon pada tahun 1998. Teknik ini tidak mencocokan kemiripan antar pengguna, tetapi melakukan pencocokan setiap item yang dinilai/rating pengguna dengan item serupa, lalu menggabungkan item serupa tersebut ke dalam daftar rekomendasi. Secara detail proses nya sebagai berikut:



Pada contoh dataset diatas, kita akan melakukan prediksi dari 3 rating kosong, yaitu: Arif - item_2, Bob - item_3 dan Don - item_1. Rumus yang kita gunakan masih sama pada user-based collaborative filtering, yaitu cosine similarity. Tahap awal adalah kita lakukan proses similarity dari ketga item tersebut, yaitu:

similarity item_1 dan item_2
i1 = 5(B1) + 3(C1)
i2 = 2(B2) + 3(C2)
sim(i1, i2) = (5*2)+(3*3)/sqrt(5^2 + 3^2) . sqrt(2^2 + 3^2) = 0.90

Perhatikan pada perhitungan diatas, hanya rating yang tidak kosong pada kedua item diatas yang dilakukan untuk perhitungannya, yaitu rating pada item_1 dan item_2 yang dinilai oleh Bob dan Clark.


Tabel diatas adalah hasil perhitungan di excel dari similarity ketiga item tersebut. Selanjutnya adalah kita lakukan prediksi untuk rating-rating kosong diatas. Berikut ini contoh perhitungan prediksi untuk rating(Arif, item_2) 

Dari hasil perhitungan di excel dari ketiga rating kosong tersebut didapatkan hasil seperti ini


Proses berikutnya dalam menghasilkan item rekomendasi sama seperti pada proses user-based diatas, yaitu dengan menghitung similarity antar item, melakukan prediksi rating kosong, kemudian melakukan ordering untuk dijadikan item rekomendasi.

Kesimpulan

Collaborative filtering merupakan teknik/paradigma yang populer digunakan dalam sistem rekomendasi. Terdapat 2 metode yang digunakan dalam collaborative filtering yaitu: memory-based dan model-based. Memory-based memiliki keunggulan dalam kemudahan proses perhitunganya tetapi memiliki kendala dalam scalabilty, karena metode ini berjalan secara real-time dan terkendala jika matrix user-item berukuran besar. Dua cara dalam perhitungan di memory-based, yaitu: user-based dan item-based, kedua teknik tersebut sama-sama memanfaatkan rating pengguna terhadap item dalam proses perhitungannya. Pada user-based dilakukan proses perhitungan similarity/kesamaan atara pengguna, sedangkan item-based melakukan proses perhitungan similarity antar item.

Bagaimana kita melakukan siimulasi perhitungan data berukuran besar, pastinya menggunakan excel akan sangat merepotkan. InshaAllah pada artikel berikutnya saya akan bahas cara perhitungan nya menggunakan python di jupyter notebook atau google colab.

Jika anda membutuhkan file excel dari perhitungan diatas, silahkan tuliskan alamat email pada kolom komentar, segera akan saya kirimkan file excel tersebut. Semoga bermanfaat!

Referensi

  1. Recommender System, A Computer Science Comprehensive Exercise, Carleton College, https://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/collaborativefiltering.html
  2. Pengantar Recommender System, Yotube: Mas Baizal, https://www.youtube.com/watch?v=gu-tf3tzMgA&t=20s
  3. F.O.Isinkaye, et al, Recommendation systems: Principles, methods and evaluation, Egyptian Informatics Journal Volume 16, Issue 3, November 2015, Pages 261-273
  4. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  5. Item-to-item based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/
  6. Item-based collaborative filtering in Python, https://predictivehacks.com/item-based-collaborative-filtering-in-python/


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.

    Video tutorial lengkap bisa disimak disini:



    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

    Monday, November 23, 2020

    Improvisasi Sistem Rekomendasi teknik Content-based

    Diagram content-based filtering dengan metadata


    Tulisan kali ini merupakan kelanjutan dari pembahasan sebelumnya yaitu bagaimana membangun sistem rekomendasi menggunakan teknik content-based filtering. Setelah kita perhatikan kembali pada hasil rekomendasi yang saya tulis di artikel sebelumnya tampak beberapa item yang tidak relevan, dimana saat merekomendasikan suatu item terpilih misalkan "Gunawangsa Manyar Hotel" yang berlokasi di Surabaya terdapat beberapa item hotel yang direkomedasikan berada di Jakarta atau Malang. 

    Hal tersebut bisa terjadi karena teknik yang digunakan untuk pencarian kemiripan item hanya berdasarkan pada deskripsi hotel saja, jadi saat ada kemiripan text pada deskripsi hotel tersebut maka akan mendapatkan score yang bagus sebagai item yang muncul di rekomendasi tanpa memperhatikan lokasi hotel tersebut.

    Untuk itu perlu adanya improvisasi dari teknik tersebut, salah satunya adalah dengan menambahkan beberapa properties/metada item untuk di mix dengan properties deskripsi hotel supaya meningkatkan kemiripan antara item hotel satu dengan lainnya.

    Di python kita dapat menggunakan fungsi agg( ) dengan parameter join pada beberapa kolom dataframe yang akan digabungkan.

    df[['col1 ','col2 ',' col3']].agg(' '.join, axis=1)

    Analisis Metadata

    Disini akan digunakan dataset dari review hotel dimana data tersebut mempunyai relasi dengan data hotel sebelumnya. Setelah kita melihat struktur data yang ada pada dataset review dan hotel, kita akan lakukan beberapa analisis untuk menambahkan metadata untuk membangun sistem rekomendasi.

    Tahap pertama kita tambahkan informasi province dan city untuk setiap hotel.

    Selanjutnya kita bisa juga tambahkan informasi dari harga hotel yang kita kelompokan menjadi beberapa bagian. Dalam hal ini akan dibagi menjadi 3 kategori yaitu "low", "medium", dan "high". Kita bisa gunakan fungsi cut( ) di pandas dataframe.

    pd.cut(hotel_review_df['price_per_night'], 
                bins=3, labels=['low','medium','high'])

    Berikutnya kita bisa juga menambahkan metadata untuk mengkategorikan hotel termasuk family room atau single room dengan menggunakan conditional dari informasi rata-rata children dan adults.

    def set_family_room(x):
        if((x['children']>=1.0) | (x['adults']>1.0)):
            return "family room"
        else:
            return "single room"
    
    hotel_review_df.apply(lambda x : set_family_room(x), axis=1)

    Membangun Sistem rekomendasi

    Setelah kita mendapatkan metadata dari dataset hotel dan review, kita dapat membangun sistem rekomendasi menggunakan cara sebelumnya yaitu TF-IDF dan Cosine similarity yang sudah dibahas secara singkat di artikel berikut ini.

    Sebelum kita ubah dokumen text ke dalam vektor menggunakan TF-IDF, kita lakukan join masing-masing metadata tersebut ke dalam satu kolom menggunakan fungsi agg( ) seperti yang telah dibahas diatas.

    Berikut ini code detail di python yang dapat dijalankan di Jupyter notebook

    Jika kita perhatikan hasil dari rekomendasi saat ini lebih relevan dibandingkan sebelumnya, dimana saat kita menampilkan rekomendasi dari hotel "Gunawangsa Manyar Hotel" makan akan muncul beberapa hotel yang berlokasi di Surabaya dengan kategori harga yang sama dan juga kategori family room.

    Semoga bermanfaat tulisan ini, inshaAllah selanjutnya akan saya bahas tentang Sistem rekomendasi menggunakan weight rating yang bisa kita gabungkan dengan teknik content-based sebagai hybrid sistem rekomendasi.

    Referensi

    1. Saket Garodia, Metadata-based Recommender Systems in Python, https://medium.com/analytics-vidhya/metadata-based-recommender-systems-in-python-c6aae213b25c
    2. JCOp Untuk Indonesia, Course 9 -Recommendation System, https://www.youtube.com/playlist?list=PLGn1wRmlR3MvcgYgTp71QXnJaFNUsQga2

    Monday, November 16, 2020

    Menggunakan Python di Jupyter notebook

    Python merupakan bahasa pemrograman yang diciptakan pada tahun 1991 oleh Guido van Russom dimana akhir-akhir ini merupakan bahasa pemrograman yang banyak dicari dan dipelajari bagi mereka yang fokus mendalami dunia data.

    Python merupakan salah satu bahasa pemrograman yang berkembang dengan cepat, selain dari perkembangan library yang semakin kuat karena banyaknya library dan framework seperti scikit-learn, Tensorflow, Pytorch, dan lainnya yang membuat para pencinta Artificial Intelligence, Machine Learning, dan Deep Learning lebih memilih Python sebagai tools untuk mengembangkan riset dan penelitian mereka.

    Di artikel ini akan dibahas cara singkat instalasi Python dan juga Jupyter notebook sebelum nanti akan kita pelajari lagi detail dasar-dasar pemrograman di Python khususnya untuk Data science atau Machine learning.

    File instalasi Python bisa di download dari web python.org yang saat ini terdapat 2 versi yaitu 2.7.x dan versi 3.x, sebaiknya kita pilih saja yang versi 3.x 

    www.python.org

    Ikuti petunjuk instalasinya dan aktifkan fitur “Add python.exe to Path” saat pemilihan check fitur instal supaya perintah python dapat dapat dijalankan di command prompt nantinya. Setelah berhasil melakukan instalasi, kita dapat mencoba dengan menjalankan perintah python dan pip dari command di windows. 

    The Python Package Index (PyPI) merupakan repository untuk library/paket di Python yang berada di pypi.org. Dengan menggunakan perintah pip kita bisa melakukan menajemen paket tersebut di local environment.

    Jupyter notebook

    Jupyter notebook merupakan tool yang populer untuk mengolah code di python. Jupyter notebook memungkinkan untuk mengintegrasikan antara kode dengan output di dalam satu dokumen secara interaktif.

    Jupyter notebook dapat di install melalui command dengan perintah: 

    pip install jupyter

    Selain itu jupyter notebook juga dapat di install menggunakan platform Anaconda, selengkapnya bisa dibaca disini https://docs.anaconda.com/anaconda/install/

    Cara menjalankan Jupyter notebook adalah dengan menuliskan perintah jupyter notebook di terminal atau command. Selanjutnya Jupyter notebook dapat diakses melalui browser. Saat servis dijalankan anda akan diarahkan ke halaman browser pada alamat http://localhost:8888/tree

    Tampilan awal saat membuka Jupyter notebook

    Untuk membuat notebook baru, bisa dilakukan dengan memilih menu [New] pada bagian kanan atas, kemudian bisa pilih tipenya Python3. Halaman notebook baru akan tampil seperti dibawah ini:

    Tampilan notebook di browser


    Hal penting yang perlu diperhatikan adalah bagian Cell, dimana nantinya kita akan menuliskan code Python atau Markdown text. Untuk judul notebok bisa kita ganti dengan cara double klik pada tulisan Untitled, kemudian tuliskan nama/judul dari notebook tersebut.

    Selanjutnya kita akan gunakan beberapa shortcut di Jupyter notebook untuk mempercepat dan memudahkan dalam melakukan editing code/text di cell. Bisa perhatikan saat cell aktif akan berwarna hijau, sedangkan cell yang tidak aktif berwarna biru. Untuk keluar dari aktif cell, tekan tombol [Esc] dan kembali mengaktifkan cell tekan [Enter]. 

    Untuk melihat beberapa tombol shortcut yang ada kita bisa keluar dari aktif cell kemudian tekan tombol [H].

    Beberapa tombol shortcut di Jupyter notebook

    Berikut beberapa shortcut yang sering digunakan: merubah ke mode code [Y] dan merubah ke mode markdown [M]. Menulis heading di Markdown dengan tombol [1] untuk heading 1, tombol [2] heading 2 dan tombol [3] heading 3. Menambahkan cell diatasnya dengan tombol [A] dan tombol [B] untuk menambah cell dibawahnya. Menghapus cell klik 2x tombol [D].

    Pastikan saat menjalankan kondisi tersebut tidak berada di aktif cell, kita bisa tekan terlebih dahulu tombol [Esc]. Dan untuk menjalankan cell/Run kita lakukan dengan menekan tombol [Shift+Enter].

    Share notebook

    Setelah kita menuliskan code-code di notebook, kita bisa membagikan file tersebut secara statis ataupun dinamis. Kita bisa gunakan github untuk share notebook secara statis, dimana code dan hasilnya sudah ready pada file .ipynb dan bisa kita push ke repository di github. Sedangkan secara dinamis kita bisa gunakan Google colab, dengan cara upload file .ipynb dan selanjutnya kita bisa jalankan pada Google colab code-code tersebut.

    Silahkan di eksplore lebih jauh lagi untuk penggunaan Jupyter notebook, semakin sering anda menggunakan maka akan semakin paham fitur-fitur didalamnya. Semoga bermanfaat..

    Referensi

    1. Guntur Wicaksono, “Pengenalan Pemrograman Python Untuk Data Science”, https://medium.com/@gunturwicaksono/pengenalan-pemrograman-python- untuk-data-science-aa18ca6ff995
    2. Ahmad Muhardian, Belajar Pemrograman Python: Cara Install Python di Windows, https://www.petanikode.com/python-windows/
    3. Belajar Python Dasar : Memahami Jupyter Notebook dan cara menggunakannya, https://ngodingdata.com/memahami-jupyter-notebook- dan-cara-menggunakannya/
    4. IndoML,Pengenalan dan Panduan Jupyter Notebook untuk Pemula,https://indoml.com/2019/09/29/pengenalan-dan-panduan-jupyter-notebook-untuk-pemula/

    Sunday, November 1, 2020

    Membangun Sistem Rekomendasi dengan teknik Content-based Filtering

    Di artikel ini kita akan belajar lebih detail lagi bagaimana membangun sistem rekomendasi menggunakan teknik Content-based filtering dengan menggunakan python. Pada artikel sebelumnya, telah kita pelajari apa itu sistem rekomendasi atau recommender system dan beberapa teknik  yang digunakannya.

    Teknik Content-based filtering di Sistem rekomendasi

    Content-based filtering(CB)

    Ide dasar dari teknik CB adalah melakukan tag pada suatu produk dengan kata kunci tertentu, memahami apa yang pengguna sukai, mengambil data berdasar kata kunci di database dan memberikan rekomendasi kepada pengguna berdasarkan kesamaan atribut.

    Sistem rekomendasi CB bekerja menggunakan data yang tersedia di pengguna, apakah itu data explisit(rating) atau implisit(klik pada link). Berdasarkan data tersebut, profile pengguna akan dibentuk, kemudian akan digunakan untuk memberikan produk rekomendasi. 

    Sebagai contoh pada aplikasi Google Play, ketika seorang pengguna menginstall aplikasi tertentu(kategori Entertainment apps) yang diterbitkan oleh Science R Us, maka sistem akan menyimpan informasi tersebut dan selanjutnya sistem akan memberi rekomendasi berdasarkan kategori atau publisher yang sama. Pada teknik ini produk/item atribut yang dijadikan sebagai referensi kesamaan untuk hasil rekomendasi, model tidak memperhatikan informasi dari user lainnya.

    TF-IDF dan Cosine similarity

    Bagaimana kita dapat mengetahui kemiripan suatu produk/item? 

    Secara umum, kemiripan dokumen didapatkan dari deskripsi suatu dokumen tersebut dengan konsep TF-IDF. TF-IDF merupakan sub-area dari Natural Language Processing(NLP) yang digunakan dalam information retrievel dengan tujuan untuk ekstrasi data. Sederhananya, bagaimana menghitung kemunculan setiap kata dalam dokumen dan memberi bobot pada setiap kata, dan menghitung skor untuk dokumen itu.

    TF (term frequency) suatu kata adalah berapa kali kata itu muncul dalam dokumen.

    TF(t) = (banyaknya term t muncul di dokumen) / (jumlah total terms di suatu dokumen)

    IDF (inverse document frequency) dari sebuah kata adalah ukuran seberapa signifikan istilah tersebut di seluruh korpus.

    IDF(t) = log_e(jumlah dari dokumen / jumlah dokumen dengan term t didalamnya)


    Di python, kita dapat menggunakan library scikit-learn dengan pre-built function TF-IDF vectorizer yang akan menghitung score dari setiap deskrispi document.

    Untuk menghitung kemiripan dari vector yang telah terbentuk, kita dapat menggunakan beberapa metode yaitu:

    1. Cosine similarity
    2. Euclidean distance
    3. Pearson's correlation
    Setelah score kemiripan dari matrix dokumen terbentuk, kita bisa melakukan sorting berdasarkan score tersebut untuk dijadikan item rekomendasi.

    Berikut ini contoh kode di jupyter notebook untuk domain data hotel description yang diperoleh dari challenge pada platform ecourse data science di DQLab dengan menggunakan TF-IDF dan cosine similarity untuk model sistem rekomendasinya.

    Dari code python di jupyter notebook tersebut, hasil rekomendasi hotel beserta score-nya adalah seperti di bawah ini:

     
     ['Gunawangsa Manyar Hotel - 1.000000000000000',
     'Midtown Hotel Surabaya - 0.17992312860891296',
     'Aria Gajayana Hotel - 0.14461427726403756',
     'GP Mega Kuningan Hotel - 0.12367390420720603',
     'Le Polonia Medan managed by Topotels - 0.12049561758006845',
     'Swiss-Belinn Manyar Surabaya - 0.11731929279752672',
     'Hotel Santika Premiere Dyandra Hotel & Convention - 0.11442553936688896',
     'Best Western Plus Kemayoran Hotel - 0.10975989716138217',
     'Swiss-Belinn Malang - 0.09085670933358225',
     'Quest Hotel Darmo - Surabaya by ASTON - 0.08833161676427399',
     'Narita Classic Hotel Surabaya - 0.08833161676427399',
     'Premier Place Surabaya Airport - 0.08833161676427399',
     'Zoom Hotel Jemursari - 0.08833161676427399',
     'Cleo Hotel Basuki Rahmat - 0.0749975275102063',
     'Grand Darmo Suite by AMITHYA - 0.07174383261974006',
     'Varna Culture Hotel Surabaya - 0.06823993211613247']
     

    Jika anda membutuhkan dataset hotel dan kode lengkap dalam file ipynb silahkan bisa download di github dengan alamat url berikut ini: https://github.com/ariflaksito/tfidf-cb-recsys

    Referensi

    1. https://medium.com/@bindhubalu/content-based-recommender-system-4db1b3de03e7
    2. https://www.analyticsvidhya.com/blog/2015/08/beginners-guide-learn-content-based-recommender-systems/
    3. https://developers.google.com/machine-learning/recommendation/content-based/basics
    4. https://towardsdatascience.com/introduction-to-two-approaches-of-content-based-recommendation-system-fc797460c18c