Skip to content

Proyek Akhir Recommendation System pada Dataset MovieLens untuk Course Belajar Machine Learning Terapan

Notifications You must be signed in to change notification settings

ahmadzkh/recommendation_system

Repository files navigation

Laporan Proyek Machine Learning - Ahmad Zaky Humami

Project Overview

Hiburan dapat dipandang sebagai kebutuhan yang berkembang dalam masyarakat manusia. Pada masa lalu, hiburan dianggap bukan sebagai kebutuhan primer yang harus dipenuhi. Namun, seiring berjalannya waktu, persepsi ini berubah dan hiburan mulai dianggap sebagai elemen penting dalam kehidupan setiap individu. Terutama sejak memasuki abad ke-21, di mana terdapat kemajuan signifikan dalam industri hiburan, khususnya di bidang pertelevisian dan perfilman. Perubahan ini dimulai dari era televisi hitam putih menuju era televisi berwarna, bahkan kini muncul konsep televisi hologram serta layanan streaming yang disesuaikan dengan preferensi pengguna. Peningkatan penggunaan layanan streaming saat ini semakin pesat, dan tren ini semakin mendalami dampaknya selama masa pandemi yang berkepanjangan.

Mengapa Masalah Ini Harus Diselesaikan?

  • Peningkatan Kualitas Rekomendasi Konten

Dengan memahami preferensi pengguna melalui data historis dan perilaku menonton, sistem dapat memberikan rekomendasi yang lebih relevan dan personal, sehingga meningkatkan kepuasan pengguna.

  • Efisiensi dalam Produksi dan Distribusi

Analisis tren konsumsi hiburan membantu produsen konten dalam merancang strategi produksi dan distribusi yang tepat sasaran, sehingga dapat menghemat biaya dan waktu.

  • Pengambilan Keputusan Berbasis Data dalam Industri Hiburan

Prediksi minat penonton melalui machine learning memungkinkan penyedia layanan streaming untuk membuat keputusan strategis dalam pengembangan fitur, kurasi konten, dan pengembangan pasar.

Business Understanding

Problem Statements

Sistem Rekomendasi adalah aplikasi yang dirancang untuk memberikan saran dalam proses pengambilan keputusan sesuai keinginan pengguna. Untuk meningkatkan user experience dalam pencarian judul film yang sesuai dengan film favorit dan pengguna, program rekomendasi sangat tepat. Jadi dengan menerapkan program rekomendasi user experience akan menjadi jauh lebih baik, karena pengguna akan meminta program untuk memberi mereka sesuatu, bukan mencarinya.

  1. Bagaimana cara mengolah data secara optimal sehingga dapat digunakan untuk membangun model sistem rekomendasi yang efektif?
  2. Bagaimana cara menciptakan model machine learning yang mampu merekomendasikan sebuah film yang kemungkinan akan diminati oleh pengguna?

Goals

  1. Melakukan pengolahan data secara efektif agar dapat digunakan dalam pengembangan model sistem rekomendasi yang berkualitas.
  2. Mengembangkan model machine learning untuk merekomendasikan film yang berpotensi disukai oleh pengguna.

Solution

Untuk menyelesaikan permasalahan ini, saya akan menerapkan dua pendekatan algoritma, yaitu Content-Based Filtering dan Collaborative Filtering. Berikut adalah penjelasan masing-masing teknik yang digunakan:

  • Content-Based Filtering merupakan metode yang memberikan rekomendasi berdasarkan kesamaan fitur atau karakteristik dari item yang disukai oleh pengguna. Pendekatan ini mempelajari profil minat pengguna berdasarkan informasi dari film-film yang sebelumnya telah ditonton atau diberi penilaian, seperti genre, sutradara, atau kata kunci tertentu.

  • Collaborative Filtering adalah metode yang menghasilkan rekomendasi berdasarkan pola dan preferensi pengguna lain dalam komunitas. Pendekatan ini tidak bergantung pada atribut atau fitur dari item, melainkan memanfaatkan data historis berupa rating atau interaksi pengguna untuk mengidentifikasi kesamaan selera di antara pengguna.

Data Understanding

Sumber Data

Pada proyek ini, saya menggunakan MovieLens Dataset yang diambil dari Kaggle. Dataset ini berisi data rating film yang diberikan oleh pengguna, mencakup informasi seperti userId, movieId, title, genres, dan rating. Dataset ini terdiri dari 100.836 rating yang diberikan oleh 610 pengguna terhadap 9.742 film. Data ini sangat cocok digunakan untuk membangun dan mengevaluasi sistem rekomendasi menggunakan pendekatan Content-Based Filtering dan Collaborative Filtering. Anda dapat mengunduh dataset lengkap di: MovieLens Dataset – Kaggle

Deskripsi Variabel

Dataset Movies

Variabel Keterangan
Movie ID Unique ID from Movie.
Title Title of Movie.
Genres Comma Separated List of Genres for this Movie.
Info Dataset Movies : 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9742 entries, 0 to 9741
Data columns (total 3 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   movieId  9742 non-null   int64 
 1   title    9742 non-null   object
 2   genres   9742 non-null   object
dtypes: int64(1), object(2)
memory usage: 228.5+ KB
Movies Missing Values
Variabel Missing Value
Movie ID 0
Title 0
Genres 0

Tidak terdapat Missing Value pada dataset Movies

Movies Duplicated
Jumlah Duplikasi Data Movie : 0
Movies Unique
Variabel Movie Unique
Movie ID 9742
Title 9737
Genres 951

Terdapat sebanyak 9742 total Movie ID yang unik, dan 9737 judul film berbeda, dan 951 macam Genre pada dataset ini.

Dataset Ratings

Variabel Keterangan
User ID Identify User ID.
Movie ID Unique ID from Movie.
Rating Rating Out of 5 This User Has Assigned.
Timestamp Datetime ratings created.
Info Dataset Ratings : 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100836 entries, 0 to 100835
Data columns (total 4 columns):
 #   Column     Non-Null Count   Dtype  
---  ------     --------------   -----  
 0   userId     100836 non-null  int64  
 1   movieId    100836 non-null  int64  
 2   rating     100836 non-null  float64
 3   timestamp  100836 non-null  int64  
dtypes: float64(1), int64(3)
memory usage: 3.1 MB
Ratings Missing Values
Variabel Missing Value
User ID 0
Movie ID 0
Rating 0
Timestamp 0

Tidak terdapat Missing Value pada dataset Ratings

Ratings Duplicated
Jumlah Duplikasi Data Rating : 0
Ratings Unique
Variabel Movie Unique
User ID 610
Movie 9724
Rating 10
Timestamp 85043

Terdapat sebanyak 610 total User ID yang unik, dan 9724 Movie ID yang berbeda yang telah di rating oleh user, dan 10 data unik pada Rating mengindikasikan rating value (0.5 - 5.0), dan 85043 data unik pada timestamp.

Merge Dataset

# Menggabungkan dataframe movie dan rating
all_df = pd.merge(ratings_df, movies_df, on='movieId', how='left')
all_df
  • Teknis Merge dengan movieId:

    Gunakan how='left' pada ratings_df (tabel kiri) agar semua rating tetap terjaga; kolom dari movies_df (kanan) akan terisi jika movieId cocok. Jika ada movieId di rating yang tidak ada di movies (jarang terjadi pada dataset bersih), maka nilai filmnya akan NaN.

Info Dataset Setelah di Merge : 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100836 entries, 0 to 100835
Data columns (total 5 columns):
 #   Column   Non-Null Count   Dtype 
---  ------   --------------   ----- 
 0   userId   100836 non-null  int64 
 1   movieId  100836 non-null  int64 
 2   rating   100836 non-null  int64 
 3   title    100830 non-null  object
 4   genres   100830 non-null  object
dtypes: int64(3), object(2)
memory usage: 3.8+ MB

Manfaat merge untuk menggabungkan dua tabel yang berbeda, dengan menggunakan merge, kita dapat menggabungkan data dari dua tabel yang berbeda berdasarkan kunci yang sama, dalam hal ini adalah movieId. Dengan demikian, kita dapat memiliki informasi yang lebih lengkap tentang setiap film, seperti judul, genre, dan rating yang diberikan oleh pengguna.

  • Menghubungkan Rating dengan Informasi Film:

    Dengan menggabungkan berdasarkan movieId, kita dapat mengetahui bahwa “User X memberi rating Y untuk film berjudul ‘Z’ yang bergenre A, B, …”. Tanpa merge, kita hanya punya angka rating tanpa konteks filmnya.

  • Memperkaya Data Interaksi Pengguna:

    Rating (ratings_df) hanya mencerminkan interaksi (angka). Metadata film (movies_df) seperti judul dan genre menyediakan konteks mengapa pengguna menyukai atau tidak menyukai sebuah film. Gabungan ini memudahkan analisis pola preferensi (misalnya, genre apa yang paling disukai).

  • Mendukung Pembuatan Fitur untuk Model Rekomendasi:

    • Content-Based Filtering: Butuh genre untuk menyarankan film serupa.
    • Collaborative Filtering/Hibrid: Membuat matriks User–Film dengan rating, lalu memperkaya dengan metadata film.
  • Analisis dan Visualisasi Lebih Komprehensif: Setelah merge, kita bisa menjawab pertanyaan seperti:

    • Film apa yang paling banyak di-rating pengguna?
    • Genre mana yang paling populer?
    • Bagaimana distribusi rating suatu film tertentu?

Exploratory Data Analysis (EDA)

Univariate Analysis EDA

Distribution of Movie Ratings

Distribution of Movie Ratings:

  • Terlihat bahwa rating 4.0 dan 5.0 adalah yang paling sering diberikan, menunjukkan bias pengguna ke arah rating tinggi.
Top 20 Most Frequent Movie Genres

Top 20 Most Frequent Movie Genres:

  • Genre Drama, Comedy, dan Action adalah yang paling umum, menunjukkan preferensi atau ketersediaan lebih besar pada genre ini.
Number of Rating per User

Number of Rating per User:

  • Mayoritas pengguna memberikan sedikit rating, sementara hanya sebagian kecil pengguna yang sangat aktif.

Multivariate Analysis EDA

Average Rating by Genre

Average Rating by Genre:

  • Genre seperti Film-Noir, Documentary, dan War cenderung mendapatkan rating rata-rata lebih tinggi.
  • Genre populer seperti Action dan Comedy memiliki rating rata-rata yang sedikit lebih rendah, mungkin karena banyaknya variasi kualitas film.
Number of Rating vs. Average Rating

Number of Ratings vs. Average Rating:

  • Sebagian besar film memiliki sedikit rating, dan film dengan banyak rating cenderung memiliki rating rata-rata di sekitar 3.0–4.0.
  • Ini mengindikasikan bahwa popularitas tidak selalu berarti kualitas yang sangat tinggi atau rendah.
Heatmap Correlation

Correlation Heatmap:

  • Korelasi antar variabel numerik (terbatas pada rating, userId, movieId, timestamp) relatif lemah, menandakan bahwa tidak ada hubungan linier yang kuat di antara mereka.

Data Preparation

Handling Missing Value

Penanganan missing value yang saya lakukan yaitu dengan melakukan drop data. Tetapi karena dataset yang digunakan cukup bersih, missing value hanya terdapat ketika proses penggabungan dataset.

# Menangani Missing Value
movies_df.dropna(axis=0, inplace=True)
ratings_df.dropna(axis=0, inplace=True)

Sorting Rating by User ID

Untuk memudahkan analisis, saya melakukan sorting user ID pada data rating. Ini akan membantu saya untuk memahami perilaku pengguna secara lebih baik. Pengurutan data rating berdasarkan ID Pengguna agar mempermudah dalam melakukan penghapusan data duplikat nantinya.

# Sortir User ID  
ratings_df = ratings_df.sort_values('userId').astype('int')

Handling Data Duplication

Untuk menghindari penghitungan rating yang tidak tepat, saya melakukan penghapusan data duplikat agar tidak terjadi bias pada data nantinya. Penghapusan data duplikat dilakukan dengan menggunakan ID pengguna dan ID film sebagai kunci. Dengan demikian, saya dapat memastikan bahwa setiap pengguna hanya memiliki satu rating per film.

# Menangani Duplikasi data 
movies_df.drop_duplicates(subset=['title'], keep='first', inplace=True)
ratings_df.drop_duplicates(subset=['userId','movieId'], keep='first', inplace=True)

Cleaning Data

# Membuat Dataframe baru untuk Dataset Clean
df_clean = all_df[~pd.isnull(all_df['genres'])].copy()
df_clean.shape

Output

(100830, 5)

Dataset df_clean adalah hasil copy() dari proses merged all_df dimana dilakukan drop column Timestamp di dataset gabungan serta tanpa nilai null pada column genres.

Dan di dapat sebanyak 100830 baris data dan 5 buah kolom pada dataset df_clean.

Encoding Data

Encode User ID

Encode Movie ID

  1. Tujuan Encoding: Proses encoding userId dan movieId dilakukan untuk mengubah nilai-nilai ID yang asli (berupa angka unik) menjadi indeks numerik berurutan, dimulai dari 0.
  2. Manfaat Encoding:
    • Efisiensi Model: Banyak algoritma machine learning (terutama neural networks) bekerja lebih baik dengan input numerik yang berurutan. Menggunakan indeks berurutan daripada ID asli dapat mengurangi ukuran matriks embedding (pada model embedding) dan mempercepat komputasi.
    • Standarisasi Input: Encoding memastikan bahwa setiap pengguna dan film memiliki representasi numerik yang unik dan konsisten yang dapat dengan mudah diproses oleh model.
  3. Mapping: Dua kamus (dictionary) dibuat untuk setiap ID (user_to_user_encoded dan movie_to_movie_encoded) untuk memetakan ID asli ke indeks yang di-encode, dan dua kamus baliknya (user_encoded_to_user dan movie_encoded_to_movie) untuk memetakan indeks kembali ke ID asli. Mapping ini penting untuk mengembalikan hasil prediksi model (dalam bentuk indeks) ke identitas pengguna atau film yang sebenarnya.
  4. Jumlah Data Unik: Output menunjukkan bahwa ada 610 userId unik dan 9724 movieId unik dalam dataset df_clean. Proses encoding ini akan menciptakan indeks dari 0 hingga 609 untuk pengguna dan dari 0 hingga 9723 untuk film.

Content-Based Filtering Preparation

TF-IDF Vectorization

['action' 'adventure' 'animation' 'children' 'comedy' 'crime'
 'documentary' 'drama' 'fantasy' 'fi' 'film' 'genres' 'horror' 'imax'
 'listed' 'musical' 'mystery' 'noir' 'romance' 'sci' 'thriller' 'war'
 'western']

Pembuatan Matriks TF-IDF

(9737, 23)

Saya memulai proses pemodelan Content-Based Filtering dengan menerapkan TF-IDF Vectorizer untuk mengekstraksi representasi fitur penting dari setiap genre film. Saya menggunakan fungsi TfidfVectorizer() dari library scikit-learn, lalu melakukan fit dan transform terhadap kumpulan data genre. Hasilnya adalah matriks berdimensi (9737, 23), di mana 9737 menunjukkan jumlah film dalam dataset dan 23 mewakili jumlah fitur genre unik yang berhasil diidentifikasi.

Colaborative Filtering Preparation

Mapping Nilai yang Di-Encode

# Melakukan Mapping pada ID Pengguna dan ID Film
df_clean['user'] = df_clean['userId'].map(user_to_user_encoded)
df_clean['movie'] = df_clean['movieId'].map(movie_to_movie_encoded)

Mengubah Tipe Data Nilai Rating

# Ubah Rating value ke float untuk modeling
df_clean['rating'] = df_clean['rating'].values.astype(np.float32)

Standarisasi Nilai Rating

# Standarisasi MinMaxScaler
min_rating = min(df_clean['rating'])
max_rating = max(df_clean['rating'])

Randomize Dataset df_clean

df = df_clean.sample(frac=1, random_state=42)

Data Spliting

x = df[['user', 'movie']].values
y = df['rating'].apply(lambda x: (x - min_rating) / (max_rating - min_rating)).values

train_indices = int(0.8 * df.shape[0])
x_train, x_val, y_train, y_val = (
    x[:train_indices],
    x[train_indices:],
    y[:train_indices],
    y[train_indices:]
)

Saya memulai pemodelan Collaborative Filtering dengan memetakan nilai-nilai yang telah di-encode ke dalam struktur data yang akan digunakan. Saya juga memastikan nilai rating diubah menjadi tipe data float agar kompatibel dengan operasi numerik selanjutnya. Dan melakukan standarisasi dengan MinMax pada rating untuk mengurangi pengaruh skala nilai rating. Lanjut melakukan pengacakan dataset karena dataset masih dalam sortir user id. Dan saya membagi data menjadi 80% untuk training dan 20% untuk validasi.

Model Development

Content-Based Filtering Model

Setelah memperoleh matriks TF-IDF, saya menghitung derajat kemiripan antar-film dengan menggunakan cosine similarity melalui fungsi cosine_similarity() dari scikit-learn. Rumus yang saya gunakan untuk menghitung cosine similarity antara dua vektor fitur 𝑢 dan 𝑣 adalah sebagai berikut:

Saya melanjutkan proses dengan memanfaatkan fungsi argpartition() untuk mengekstrak k nilai tertinggi dari matriks similarity. Saya kemudian mengurutkan hasil tersebut dari bobot kemiripan tertinggi ke terendah, sehingga dapat menampilkan rekomendasi film yang paling relevan dengan judul acuan. Setelah itu, saya melakukan evaluasi akurasi sistem rekomendasi ini untuk memastikan kemampuannya dalam menemukan film yang mirip dengan target yang dicari.

Pendekatan Content-Based Filtering diimplementasikan dalam fungsi movie_recommendation(). Sistem ini merekomendasikan film berdasarkan kemiripan konten antar item, seperti genre atau deskripsi film. Fungsi ini bekerja dengan menerima input berupa judul film dan mengakses matriks kemiripan yang telah dihitung sebelumnya menggunakan metode cosine similarity terhadap representasi TF-IDF dari data genre film. Proses dimulai dengan mengambil nilai kemiripan antara film input dengan seluruh film lain, lalu mengurutkan nilai tersebut untuk menemukan k film yang paling mirip. Film dengan kemiripan tertinggi akan diambil sebagai rekomendasi, kemudian digabungkan dengan metadata seperti judul dan genre sebelum dikembalikan.

  • Kelebihan

    • Semakin banyak informasi genre dan preferensi yang saya masukkan ke dalam sistem, semakin tinggi akurasi rekomendasi yang dihasilkan.
    • Rekomendasi bersifat intuitif karena didasarkan langsung pada kesamaan fitur antar-item.
  • Kekurangan

    • Sistem hanya efektif untuk domain dengan fitur yang terstruktur (misalnya film, buku, musik) dan tidak dapat diaplikasikan pada data tanpa metadata yang kaya.
    • Saya tidak dapat menentukan profil pengguna baru (“cold start user”) karena belum ada riwayat interaksi untuk dibandingkan.

Contoh Rekomendasi menggunakan Content-Based Filtering

movie_recomend = movie_recommendation('Kung Fu Panda: Secrets of the Masters (2011)')
movie_recomend

Output :

Collaborative Filtering

Setelah praproses, saya kemudian membuat embedding untuk setiap pengguna dan film, yaitu vektor berdimensi tetap yang merepresentasikan profil pengguna dan karakteristik film. Untuk memprediksi kecocokan, saya mengalikan (dot product) vektor embedding pengguna dengan vektor embedding film, kemudian menambahkan bias per pengguna dan bias per film. Hasil prediksi ini saya transformasi ke rentang 0–1 menggunakan fungsi sigmoid.

Sementara itu, pendekatan Collaborative Filtering diwujudkan dalam bentuk kelas RecommenderNet, yang merupakan model neural network berbasis embedding. Pendekatan ini tidak melihat isi film, melainkan mempelajari pola interaksi antara pengguna dan film (berdasarkan rating). Model RecommenderNet menggunakan dua buah embedding layer: satu untuk merepresentasikan pengguna dan satu lagi untuk film. Kedua vektor ini kemudian dikombinasikan melalui operasi dot product untuk menghasilkan skor prediksi seberapa besar kemungkinan seorang pengguna menyukai film tertentu. Model ini juga menambahkan bias untuk masing-masing pengguna dan film guna meningkatkan akurasi prediksi. Hasil akhir dari model ini diaktivasi menggunakan fungsi sigmoid agar skor berada dalam rentang 0 hingga 1.

Untuk menghasilkan rekomendasi, saya mengambil sampel pengguna secara acak dan menyusun variabel movies_not_watched, yaitu daftar film yang belum pernah diberi rating oleh pengguna tersebut. Kemudian saya memprediksi skor untuk setiap film dalam daftar itu dan memilih film-film dengan skor tertinggi sebagai rekomendasi.

  • Kelebihan:

    • Tidak memerlukan fitur konten film.
    • Masih dapat bekerja walau data item tidak lengkap.
    • Skalabilitas dan kecepatan yang baik untuk dataset besar.
    • Tetap memberi rekomendasi meski konten sulit dianalisis langsung.
  • Kekurangan:

    • Membutuhkan data rating, sehingga film baru tanpa rating tidak akan muncul sebagai rekomendasi.

Contoh Rekomendasi menggunakan Collaborative Filtering

# Ambil sample user id
sample_user_id = df['user'].sample(1).iloc[0]

# Movie yang di tonton oleh user
movies_watched_by_user = df[df['user'] == sample_user_id]
movies_watched_by_user = movies_watched_by_user.sort_values(['rating'], ascending=False)

# Movie yang tidak di tonton oleh user
movies_not_watched = movies_df[~movies_df['movieId'].isin(movies_watched_by_user['movieId'].values)]['movieId']
movies_not_watched = list (
    set(movies_not_watched).intersection(set(movie_to_movie_encoded.keys()))
)

movies_not_watched = [[movie_to_movie_encoded.get(x)] for x in movies_not_watched]
user_encoder = user_to_user_encoded.get(sample_user_id)
user_movie_array = np.hstack(
    ([[user_encoder]] * len(movies_not_watched), movies_not_watched)
)

Output :

Evaluation

Content-Based Filtering

Untuk mengevaluasi model Content-Based Filtering, saya menggunakan metrik yang umum digunakan dalam sistem rekomendasi, yaitu Precision@K, Recall@K.

precision, recall = precision_recall_at_k(model, x_val, y_val, k=10, threshold=0.5)

Output :

Precision@10: 0.9079
Recall@10:    0.2330

Insight dari hasil evaluasi:

  1. Precision@10 yang tinggi (0.9079) menunjukkan bahwa dari 10 rekomendasi teratas yang diberikan oleh model, sekitar 90.79% di antaranya adalah film yang relevan atau disukai oleh pengguna (berdasarkan threshold rating 0.5). Ini berarti ketika model merekomendasikan film, kemungkinan besar film tersebut memang sesuai dengan preferensi pengguna.
  2. Recall@10 yang relatif rendah (0.2330) menunjukkan bahwa model hanya mampu menangkap sekitar 23.30% dari total film relevan yang sebenarnya ada untuk pengguna dalam validation set. Ini berarti ada banyak film relevan lainnya yang tidak masuk dalam daftar 10 rekomendasi teratas model.

Kesimpulan:

Model ini sangat baik dalam memberikan rekomendasi yang akurat (tinggi Precision), artinya rekomendasi yang ditampilkan punya probabilitas tinggi disukai pengguna. Namun, model belum mampu menemukan sebagian besar film relevan yang sebenarnya disukai pengguna (rendah Recall).

Collaborative Filtering

Mean Absolute Error

Untuk mengukur akurasi model, saya menggunakan Mean Absolute Error (MAE). MAE adalah rata-rata dari nilai absolut dari perbedaan antara nilai prediksi dan nilai sebenarnya. Nilai MAE yang lebih kecil menunjukkan model yang lebih akurat.

Mean Absolute Error (MAE):

  • Nilai MAE pada Data Training:

Dari grafik MAE, saya mengamati bahwa nilai MAE pada data training (garis biru) mengalami penurunan konsisten sepanjang proses pelatihan. Hal ini menunjukkan bahwa model yang saya latih semakin baik dalam memprediksi rating dengan kesalahan absolut rata-rata yang semakin kecil. Penurunan yang stabil juga mengindikasikan bahwa proses pembelajaran berlangsung secara efektif tanpa gangguan besar seperti fluktuasi atau divergensi.

  • Nilai MAE pada Data Validasi:

Nilai MAE pada data validasi (garis oranye) juga menunjukkan tren penurunan di awal pelatihan, tetapi cenderung stagnan mulai dari sekitar epoch ke-2 hingga akhir. Meskipun tidak terjadi peningkatan performa yang signifikan setelah titik tersebut, kestabilan nilai validasi ini mengindikasikan bahwa model tidak mengalami overfitting secara drastis, meskipun terdapat indikasi bahwa peningkatan performa terhadap data yang tidak terlihat menjadi terbatas setelah beberapa epoch awal.

  • Indikasi Konvergensi:

Perbedaan antara MAE training dan validasi yang semakin melebar secara perlahan dapat menjadi sinyal awal adanya potensi overfitting, namun grafik menunjukkan bahwa nilai validasi tetap dalam rentang yang relatif stabil. Ini menunjukkan bahwa performa model pada data validasi masih dapat diterima meskipun laju peningkatannya melambat.

Root Mean Squared Error

Untuk mengukur akurasi model, saya menggunakan Root Mean Squared Error (RMSE) yang merupakan hasil evaluasi model Collaborative Filtering RecommenderNet menggunakan metrik Root Mean Squared Error (RMSE) pada data pelatihan (RMSE) dan data validasi (Val RMSE) selama proses training. RMSE merupakan metrik yang umum digunakan dalam sistem rekomendasi untuk mengukur selisih rata-rata kuadrat antara rating prediksi dan rating aktual; semakin kecil nilai RMSE, semakin baik kinerja model.

Pada grafik, terlihat bahwa nilai RMSE pada data pelatihan mengalami penurunan yang konsisten dari awal hingga akhir pelatihan. Ini menunjukkan bahwa model berhasil mempelajari pola dari data pelatihan dengan baik. Di sisi lain, nilai RMSE pada data validasi juga menurun secara signifikan pada beberapa epoch awal, tetapi kemudian cenderung stabil dan mengalami sedikit fluktuasi setelah sekitar epoch ke-7. Ini adalah indikasi bahwa model mencapai titik stabil dalam pembelajaran dan menghindari overfitting. Model RecommenderNet dibangun dengan ukuran embedding = 50 dan dioptimalkan menggunakan Adam Optimizer dengan learning rate 0.001. Proses pelatihan dijalankan hingga maksimum 100 epoch dengan early stopping callback yang dikonfigurasi untuk:

  • patience=10: pelatihan akan dihentikan jika tidak ada perbaikan RMSE validasi selama 10 epoch berturut-turut.
  • min_delta=0.0001: perubahan minimal yang dianggap sebagai perbaikan.
  • restore_best_weights=True: model akan mengembalikan bobot terbaik berdasarkan kinerja validasi

Berdasarkan grafik, model RecommenderNet berhasil belajar dengan baik dari data pelatihan tanpa menunjukkan gejala overfitting yang signifikan. Penggunaan callback early stopping secara efektif menghentikan pelatihan pada waktu yang tepat dan memastikan bobot terbaik digunakan yang kemungkinan besar terjadi sebelum epoch ke-10. Nilai akhir RMSE pada data validasi sekitar 0.188 menjadi indikator kinerja model dalam memberikan prediksi rating yang mendekati nilai aktual pengguna, yang menunjukkan bahwa model cukup baik dalam memahami preferensi pengguna berdasarkan data interaksi sebelumnya.

Root Mean Squared Error (RMSE):

  • Nilai RMSE pada Data Training:

Berdasarkan grafik RMSE, saya melihat penurunan tajam pada nilai RMSE training (garis biru) selama epoch awal, yang kemudian diikuti oleh penurunan bertahap hingga akhir pelatihan. Ini menunjukkan bahwa model mampu menyesuaikan prediksinya terhadap data training dengan mengurangi deviasi kuadrat rata-rata secara progresif.

  • Nilai RMSE pada Data Validasi:

Nilai RMSE validasi (garis oranye) menurun pada awal pelatihan hingga sekitar epoch ke-7, lalu cenderung stabil dan sedikit fluktuatif hingga akhir pelatihan. Tidak terlihat adanya penurunan signifikan setelah titik tersebut, yang mengindikasikan bahwa model telah mencapai titik optimum dalam hal generalisasi pada data validasi. Namun, fluktuasi kecil setelah epoch ke-7 menunjukkan bahwa model mulai menghadapi batas kemampuannya dalam mengurangi kesalahan pada data yang tidak dilatih.

  • Konvergensi dan Early Stopping:

Pola yang tampak pada grafik RMSE validasi mendukung penggunaan strategi Early Stopping. Jika callback ini digunakan, maka kemungkinan besar pelatihan dihentikan saat tidak ada peningkatan signifikan pada performa validasi. Dengan demikian, saya dapat menghindari pelatihan berlebih dan menjaga generalisasi model tetap baik.

Kesimpulan:

Berdasarkan analisis terhadap grafik MAE dan RMSE, saya menyimpulkan bahwa model Collaborative Filtering yang dibangun menunjukkan performa pelatihan yang baik dan generalisasi yang memadai. Penurunan konsisten pada data training menunjukkan bahwa model berhasil mempelajari pola dari data, sedangkan nilai validasi yang relatif stabil menunjukkan bahwa overfitting masih dalam batas yang dapat diterima. Penggunaan teknik Early Stopping sangat membantu dalam memilih parameter model terbaik. Nilai MAE dan RMSE akhir dapat dijadikan indikator akurasi model dalam memprediksi rating, masing-masing dari perspektif kesalahan absolut dan kesalahan kuadrat rata-rata.

Reference

  1. Rahman, M. F., & Zulkarnain, M. (2023). Content-based filtering for improving movie recommender system. Proceedings of the International Conference on Data Analytics and Intelligence (DAI-23), 124–130.

  2. Singh, A., & Gupta, R. (2018). Content-based movie recommendation system using genre correlation. Proceedings of the Second International Conference on SCI 2018, 2, 88–93.

  3. Sharma, P., & Verma, S. (2024). A collaborative filtering approach in movie recommendation systems. Grenze International Journal of Engineering and Technology, 10(2), 55–62.

  4. Sinha, R., & Jaiswal, A. (2017). Collaborative filtering for movie recommendation using RapidMiner. International Journal of Computer Applications, 169(6), 1–5.

  5. Oliveira, D. J., & Kumar, N. (2024). A comparison of content-based and collaborative filtering methods for movie recommendation systems. Procedia Computer Science, 227, 1012–1018.

  6. Chowdhury, A., & Chatterjee, D. (2024). Synergizing collaborative and content-based filtering for enhanced movie recommendations. Lecture Notes in Networks and Systems, 831, 33–42.

About

Proyek Akhir Recommendation System pada Dataset MovieLens untuk Course Belajar Machine Learning Terapan

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published