Sejauh ini kami menggunakan item yang disukai pelanggan untuk memberikan saran item serupa lainnya. Ini bekerja dengan baik ketika kita memiliki banyak informasi tentang barang tersebut, namun tidak banyak data tentang bagaimana perasaan orang terhadap barang tersebut. Sekarang, kami akan menemukan pengguna yang memiliki preferensi paling mirip dengan pengguna yang kami rekomendasikan dan berdasarkan preferensi grup tersebut, berikan saran.

Bentuk rekomendasi ini disebut pemfilteran kolaboratif. Pemfilteran kolaboratif adalah nama yang diberikan untuk prediksi, atau pemfilteran, item yang mungkin menarik minat pengguna berdasarkan preferensi pengguna serupa. Ini didasarkan pada premis bahwa orang A memiliki selera yang mirip dengan orang B dan C.

Dalam Pemfilteran Kolaboratif, kita perlu memasukkan data ke dalam matriks pengguna dan item yang mereka beri peringkat. Karena data berada dalam DataFrame, metode pivot panda dapat digunakan untuk membentuk ulang data di sekitar kolom tertentu. Kami ingin pengguna sebagai indeks, kolom yang mewakili item, dan peringkat sebagai nilai yang sesuai. Kami dapat mendemonstrasikannya dengan data user_ratings yang kami gunakan di artikel sebelumnya.

user_ratings_table = user_ratings.pivot(index='userId', columns='movieId', values='rating')
user_ratings_table.head()

Hal pertama yang mungkin terlihat setelah transformasi ini adalah jumlah entri yang hilang, yang ditunjukkan oleh nilai NaN. Hal ini memang wajar terjadi — jarang sekali pengguna memberi rating pada setiap item, dan jarang sekali ada item yang diberi rating oleh setiap orang. Ini merupakan masalah, karena sebagian besar metrik kesamaan tidak menangani data yang hilang dengan baik. Bagaimana kita bisa mengatasi hal ini? Kita tidak bisa begitu saja menghilangkan semua baris dan kolom yang memiliki data yang hilang karena data yang sangat jarang ini bisa menjadi keseluruhan bingkai data!

Demikian pula, Anda mungkin menyarankan untuk mengisi nilai kosong dengan 0, yang mungkin valid untuk beberapa model pembelajaran mesin, namun dapat menimbulkan masalah pada mesin rekomendasi. Jika kami mengisi NaN ini dengan 0, kami salah menyatakan bahwa mereka sangat tidak suka! Salah satu alternatifnya adalah memusatkan peringkat setiap pengguna di sekitar 0 dengan mengurangi rata-rata baris, lalu mengisi nilai yang hilang dengan 0. Artinya, data yang hilang diganti dengan skor netral.

# Get the average rating for each user 
avg_ratings = user_ratings_table.mean(axis=1)
# Center each users ratings around 0
user_ratings_table_centered = user_ratings_table.sub(avg_ratings, axis=0)
# Fill in the missing data with 0s
user_ratings_table_normed = user_ratings_table_centered.fillna(0)

Rekomendasi berbasis pengguna membandingkan antar pengguna, dan rekomendasi berbasis item membandingkan item yang berbeda. Dengan kata lain, Anda dapat menggunakan data berbasis pengguna untuk menemukan pengguna serupa berdasarkan cara mereka menilai film yang berbeda, sementara Anda dapat menggunakan data berbasis item untuk menemukan film serupa berdasarkan cara mereka dinilai oleh pengguna.

from sklearn.metrics.pairwise import cosine_similarity
# Generate the similarity matrix
similarities = cosine_similarity(item_ratings_table)
# Wrap the similarities in a DataFrame
cosine_similarity_df = pd.DataFrame(similarities, index=item_ratings_table.index, columns=item_ratings_table.index)
# Find the similarity values for a specific movie
cosine_similarity_series = cosine_similarity_df.loc[4]
# Sort these values highest to lowest
ordered_similarities = cosine_similarity_series.sort_values(ascending=False)
print(ordered_similarities)

Anda kini dapat menemukan item serupa berdasarkan penilaian pengguna di kumpulan data Anda. Namun bagaimana jika kita tidak hanya ingin menemukan item dengan rating serupa, namun sebenarnya memprediksi bagaimana pengguna akan menilai suatu item meskipun item tersebut tidak serupa dengan item mana pun yang pernah mereka lihat! Salah satu pendekatannya adalah menemukan pengguna serupa menggunakan model K tetangga terdekat dan melihat seberapa menyukai item tersebut.

K-Tetangga Terdekat

K-NN menemukan k pengguna yang paling dekat diukur dengan metrik tertentu, dengan pengguna yang dimaksud. Kemudian rata-rata peringkat yang diberikan pengguna pada item yang kami coba dapatkan peringkatnya. Dalam contoh ini, k sama dengan 3, sehingga ia menemukan 3 pengguna terdekat dan mendapatkan ratingnya. Hal ini memungkinkan kami memprediksi bagaimana menurut kami perasaan pengguna terhadap suatu item, meskipun mereka belum pernah melihatnya.

Pertama-tama kita memerlukan matriks kesamaan pengguna yang sebelumnya kita temukan sebagai user_ratings_table_normed untuk menemukan kesamaan pengguna.

similarities = cosine_similarity(user_ratings_table_normed)
cosine_similarity_df = pd.DataFrame(similarities, index=user_ratings_table_normed.index, columns=user_ratings_table_normed.index)
cosine_similarity_df.head()

Kami akan bekerja dengan skor kesamaan pengguna 1, menemukan tetangga terdekat mereka, dan berdasarkan peringkat yang diberikan tetangga tersebut pada sebuah film, menyimpulkan peringkat apa yang mungkin diberikan pengguna 1 jika mereka menontonnya. Sekarang kita juga membutuhkan user_ratings_table, yaitu tabel pivot dengan nilai null. Mari kita cari tahu berapa nilai pengguna 1 untuk id film 2.

# Isolate the similarity scores for user_1 and sort
user_similarity_series = cosine_similarity_df.loc[1]
ordered_similarities = user_similarity_series.sort_values(ascending=False)
# Find the top 10 most similar users
nearest_neighbors = ordered_similarities[1:11].index
# Extract the ratings of the neighbors
neighbor_ratings = user_ratings_table.reindex(nearest_neighbors)
# Calculate the mean rating given by the users nearest neighbors
print(neighbor_ratings[2].mean())

Sekarang setelah Anda memahami seluk beluk cara kerja K-nearest neighbours, Anda dapat memanfaatkan implementasi KNN scikit-learn sambil mengenali apa yang dilakukannya.

# Drop the column you are trying to predict
user_ratings_table_normed.drop(2, axis=1, inplace=True)
# Get the data for the user you are predicting for
target_user_x = user_ratings_table_normed.loc[[1]]
# Get the target data from user_ratings_table
other_users_y = user_ratings_table[2]
# Get the data for only those that have seen the movie
other_users_x = user_ratings_table_normed[other_users_y.notnull()]
# Remove those that have not seen the movie from the target
other_users_y.dropna(inplace=True)

Anda akan menggunakan other_users_x dan other_users_y untuk menyesuaikan KNeighborsRegressor dari scikit-learn dan menggunakannya untuk memprediksi peringkat Pengguna 1 untuk film 2.

from sklearn.neighbors import KNeighborsRegressor
# Instantiate the user KNN model
user_knn = KNeighborsRegressor(metric='cosine', n_neighbors=10)
# Fit the model and predict the target user
user_knn.fit(other_users_x, other_users_y)
user_user_pred = user_knn.predict(target_user_x)
print(user_user_pred)

Berbasis item atau berbasis Pengguna

Sebagai pengingat, rekomendasi berbasis item adalah tempat Anda menggunakan rata-rata dari k item paling mirip yang telah diberi peringkat oleh pengguna untuk menyarankan peringkat pada item yang belum mereka lihat. Alternatifnya, rekomendasi berbasis pengguna adalah saat Anda menggunakan rata-rata peringkat yang diberikan oleh k pengguna paling mirip pada suatu item, untuk menyarankan peringkat apa yang akan diberikan oleh pengguna target.

Mengapa menggunakan pemfilteran berbasis item?

  • Pertama-tama, rekomendasi berbasis item lebih konsisten dari waktu ke waktu. Preferensi pengguna berubah, misalnya, Anda mungkin menikmati film animasi saat Anda masih muda, namun mengubah preferensi Anda ke film aksi di kemudian hari. Sebaliknya, item biasanya tidak berubah, film yang tadinya film horor ketika dirilis, tetap menjadi film horor bertahun-tahun kemudian.
  • Rekomendasi berbasis item bisa lebih mudah untuk dijelaskan Memberi tahu pengguna bahwa mereka merekomendasikan sebuah buku karena mereka menyukai buku serupa (kolaborasi berbasis item) bisa lebih masuk akal daripada meyakinkan mereka bahwa mereka mungkin menyukai buku karena pengguna yang belum pernah mereka temui menyukainya. itu (kolaborasi berbasis pengguna).
  • Rekomendasi berdasarkan item dapat memiliki lebih banyak perhitungan sebelumnya. Setiap toko online umumnya memiliki persediaan yang diketahui terbatas. Pemiliknya dapat menghitung item mana dalam inventaris yang mirip satu sama lain dan mana yang tidak offline dan menggunakannya di situs mereka. Sebaliknya, pengguna baru muncul setiap hari, sehingga tidak bisa mendapatkan keuntungan dari banyak perhitungan sebelumnya.

Salah satu hal negatifnya adalah rekomendasi berdasarkan item seringkali sangat jelas, misalnya hanya menyarankan film berikutnya dalam sebuah serial yang mungkin tidak memberikan banyak nilai tambah.

Mengapa menggunakan pemfilteran berbasis pengguna?

Faktanya meskipun rekomendasi berbasis item tampaknya lebih disukai oleh pengguna berdasarkan sebagian besar akun, satu hal yang lebih unggul dari rekomendasi berbasis pengguna adalah bahwa rekomendasi berbasis pengguna bisa jauh lebih menarik, dan tidak terduga dibandingkan berdasarkan item. Ini bisa sangat berguna dalam menemukan item kurang populer yang diinginkan pengguna. Oleh karena itu, meskipun rekomendasi berbasis item lebih disukai dalam kasus penggunaan yang menganjurkan saran konservatif, seperti toko e-niaga, rekomendasi berbasis pengguna dapat menambah nilai untuk item yang lebih subjektif seperti film, buku, atau hiburan lainnya.