Recommendation System Dengan Python : Collaborative Filtering (Part 3)

Novindra Prasetio
Data Folks Indonesia
5 min readAug 1, 2019
Photo by Christian Wiediger on Unsplash

Haloo… pada artikel ini saya akan membangun sistem rekomendasi dengan metode collaborative filtering dengan 2 permodelan, yaitu nearest neighbors dan matrix factorization.

Pada pembuatannya, saya coba menggunakan salah satu library khusus untuk metode collaborative filtering yang bernama Surprise. Library ini adalah salah satu perkembangan scikit-learn yang berfokus pada pembangunan dan analisa sistem rekomendasi.

Surprise : Recommedation System Library

Dataset

Kali ini pada pembangunan sistem rekomendasi, saya menggunakan dataset Consumer Reviews of Amazon Products dari Kaggle. Dataset bisa diunduh disini. Karena disediakannya 3 pilihan, Saya menggunakan dataset yang berjumlah 5000 baris x 23 kolom.

Seperti biasa, import beberapa library yang perlukan untuk pengolahan dataset tersebut.

Buat perintah kodingan untuk memanggil dataset dengan pd.read_csv(“dataset amazonnya”) dan lihat datasetnya dengan .head().

Dataset Amazon

Exploritary Data Analysis

Pada step ini, lakukanlah analisa sederhana, seperti describe(), info(), dan juga visualisasi agar kita dapatkan suatu insight dari dataset.

Setelah itu, masuk ke step visualisasi beberapa kolom yang dapat kita jadikan bahan analisa awal. Saya coba awali dengan kolom primaryCategories pada dataset.

Visualisasi dari kolom ‘primaryCategories’

Bisa dilihat kategori yang paling banyak dipilih, yaitu Electronics.

Visualisasi dari kolom ‘reviewsRating’

Dari kolom reviewsRating, disimpulkan bahwa kebanyakan user memberikan rating 5 pada dataset tersebut.

Visualisasi dari kolom ‘reviewsRecommend’

Dari kolom reviewsRecommend, user yang membeli produk dari amazon merekomendasikan produk yang mereka beli.

Visualisasi pada rekomendasi berdasarkan kategori produk

Pada gambar diatas menunjukan bahwa para user lebih banyak merekomendasikan produk elektronik ketimbang elektronik,media. Dari hasil ini, saya , mencoba berapa banyak user yang memberikan rating dari produk yang direkomendasikan.

Visualisasi pada hasil rating yang menunjukan kategori produk yang dapat direkomendasikan berdasarkan rating

Kita bisa melihat perilaku user pada grafik box diatas bahwa user yang memilih produk elektronik dan elektronik office supplies memberikan saran rekomendasi dengan rating 4–5. Sedangkan beberapa user tidak memberikan rekomendasi pada kategori elektronik dengan rating 1–3 dan juga kategori elektronik hardware dengan rating 2–3 di amazon.

Data Preprocessing

Di bagian ini, saya coba melakukan pengecekan apakah ada yang null pada dataset ini.

id                       0
dateAdded 0
dateUpdated 0
name 0
asins 0
brand 0
categories 0
primaryCategories 0
imageURLs 0
keys 0
manufacturer 0
manufacturerNumber 0
reviews.date 0
reviews.dateAdded 3948
reviews.dateSeen 0
reviewsRecommend 0
reviews.id 4971
reviews.numHelpful 0
reviewsRating 0
reviews.sourceURLs 0
reviews.text 0
reviews.title 13
reviews.username 0
sourceURLs 0
dtype: int64

Hasilnya terdapat data yang null pada dataset ini. Tapi saya tidak menggunakan kolom data tersebut karena bersifat sensitif. Selanjutnya, Buatlah variabel baru untuk data train dan test nanti. Kolom yang saya pakai, yaitu ‘reviews.username’, ‘id’, dan ‘reviewsRating’.

Training, testing & modelling dengan KNN dan Matrix Factorization

Di step ini, saya gunakan dua 2 algoritma yang disediakan pada library surprise, yaitu KNN dan matrix factorization. Bisa dilihat pada website surprise pada metode KNN dan matrix factorization. Pertama, saya coba pakai algoritma SVD yang ada pada metode matrix factorization.

Lakukan train dan test dari variabel yang sudah dibuat.

Setelah dilakukannya train dan test, data sudah siap digunakan untuk permodelan. Pertama, saya gunakan model SVD.

[Prediction(uid='boste03', iid='AVqkIhwDv8e3D1O-lebb', r_ui=5.0, est=4.591002071789035, details={'was_impossible': False}),
Prediction(uid='Kevinandkalii', iid='AVqkIj9snnc1JgDc3khU', r_ui=5.0, est=4.744049886068058, details={'was_impossible': False}),
Prediction(uid='PT53226', iid='AWFUWc8THh53nbDRF6YO', r_ui=4.0, est=4.654322011720954, details={'was_impossible': False}),
Prediction(uid='kimb', iid='AVpgdkC8ilAPnD_xsvyi', r_ui=5.0, est=4.446934643569145, details={'was_impossible': False}),
Prediction(uid='Colleen', iid='AVph0EeEilAPnD_x9myq', r_ui=5.0, est=4.631394960150812, details={'was_impossible': False}),
Prediction(uid='Lintor', iid='AWFUWc8THh53nbDRF6YO', r_ui=5.0, est=4.654322011720954, details={'was_impossible': False}),
Prediction(uid='Jays', iid='AVpgdkC8ilAPnD_xsvyi', r_ui=5.0, est=4.478848885778465, details={'was_impossible': False}),
Prediction(uid='Squirl', iid='AWK8z0pOIwln0LfXlSxH', r_ui=5.0, est=4.668681204724527, details={'was_impossible': False}),
.....

Daftar prediksi yang dihasilkan sangat banyak kemungkinan. Pada hasil output diatas terdapat 6 variabel prediksi yang dihasilkan. Ada uid, iid, r_ui, est, details, dan reason. Reason akan ada jika hasil details menunjkan ‘True’.

Saya mencoba salah satu contoh prediksi dari daftar prediksi diatas dengan username / uid = ‘Jays’ dan iid = ‘AWMjT0WguC1rwyj_rFh3’.

Prediction(uid='Jays', iid='AWMjT0WguC1rwyj_rFh3', r_ui=None, est=4.77001836108974, details={'was_impossible': False})

Dari hasil prediksi menunjukan bahwa memiliki kemungkinan untuk direkomendasikan kepada username ‘Jays’ pada produk id ‘AWMjT0WguC1rwyj_rFh3’.

Selanjutnya kita menggunakan algoritma KNN. Pada surprise, algoritma KNN memiliki banyak variasi algoritma yang ada. Kali ini saya memakai KNNBasic. Pada metode KNNBasic, penggunaan fungsi similarity dapat diaplikasikan. Saya menggunakan fungsi similarity : pearson correlation dan k = 50.

[Prediction(uid='boste03', iid='AVqkIhwDv8e3D1O-lebb', r_ui=5.0, est=4.60925, details={'was_impossible': True, 'reason': 'User and/or item is unkown.'}),
Prediction(uid='Kevinandkalii', iid='AVqkIj9snnc1JgDc3khU', r_ui=5.0, est=5, details={'actual_k': 3, 'was_impossible': False}),
Prediction(uid='PT53226', iid='AWFUWc8THh53nbDRF6YO', r_ui=4.0, est=4.60925, details={'was_impossible': True, 'reason': 'User and/or item is unkown.'}),
Prediction(uid='kimb', iid='AVpgdkC8ilAPnD_xsvyi', r_ui=5.0, est=4.946977157104646, details={'actual_k': 8, 'was_impossible': False}),
Prediction(uid='Colleen', iid='AVph0EeEilAPnD_x9myq', r_ui=5.0, est=4.60925, details={'was_impossible': True, 'reason': 'User and/or item is unkown.'}),
Prediction(uid='Lintor', iid='AWFUWc8THh53nbDRF6YO', r_ui=5.0, est=4.60925, details={'was_impossible': True, 'reason': 'User and/or item is unkown.'}),
Prediction(uid='Jays', iid='AVpgdkC8ilAPnD_xsvyi', r_ui=5.0, est=4.60925, details={'was_impossible': True, 'reason': 'User and/or item is unkown.'}),
Prediction(uid='Squirl', iid='AWK8z0pOIwln0LfXlSxH', r_ui=5.0, est=4.977394539866576, details={'actual_k': 9, 'was_impossible': False}),
...

Dari hasil daftar prediksi yang sudah jadi, saya akan coba membuat satu prediksi dengan uid dan iid yang sama dengan model SVD sebelumnya dengan tambahan r_ui = 4.5.

Prediction(uid='Jays', iid='AWMjT0WguC1rwyj_rFh3', r_ui=4.5, est=4.60925, details={'was_impossible': True, 'reason': 'User and/or item is unkown.'})

sari output yang dihasilkan, username ‘Jays’ dengan produk id yang sama tidak bisa direkomendasikan.

Evaluasi

Evaluasi dilakukan untuk mengetahui peforma akurasi dan error yang terjadi. Saya menggunakan metode evaluasi RMSE, MAE, dan FCP untuk kedua algortima yang digunakan.

MAE:  0.5683
FCP: 0.4694
RMSE: 0.7892
MAE:  0.5753
FCP: 0.5641
RMSE: 0.8257

Pada hasil evaluasi diatas, perbandingan antara algoritma KNN dengan matrix factorization cukup berbeda dari segi RMSE nya.

Kesimpulan

Disimpulkan bahwa penggunaan metode collaborative filtering dapat memberikan suatu saran rekomendasi kepada user secara efektif, baik menggunakan algoritma KNN maupun menggunakan matrix factorization. Saya juga merekomendasikan penggunaan library suprise untuk pembangunan sistem rekomendasi dengan metode collabirative filtering.

Untuk bisa melihat file jupter notebook dari collaborative filtering, bisa dilihat disini.

Terima kasih telah membaca artikel ini. Semoga bermanfaat… :)

--

--