از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
چگونه یک سیستم توصیه فیلم بر اساس فیلتر مشارکتی بسازیم
سرفصلهای مطلب
در دنیای تکنولوژی امروز، توصیههای بیشتری از مدلهای هوش مصنوعی دریافت میکنیم تا از دوستانمان.
غافلگیر شدن؟ به محتوایی که می بینید و برنامه هایی که روزانه استفاده می کنید فکر کنید. ما توصیههای محصول را در آمازون، توصیههای لباس در Myntra، و پیشنهادات فیلم را در Netflix بر اساس ترجیحات، خریدهای گذشته و غیره دریافت میکنیم.
آیا تا به حال فکر کرده اید که زیر کاپوت چیست؟ پاسخ سیستمهای توصیهکننده مبتنی بر یادگیری ماشین است. سیستمهای توصیهکننده الگوریتمهای یادگیری ماشینی هستند که با استفاده از دادههای تاریخی و اطلاعات رسانههای اجتماعی برای یافتن محصولات شخصیسازی شده با اولویتهای ما توسعه یافتهاند.
در این مقاله، من شما را از طریق انواع مختلف روشهای ML برای ایجاد یک سیستم توصیه و تمرکز بر روی آن راهنمایی میکنم روش فیلتر مشارکتی. ما یک مجموعه داده نمونه به دست می آوریم و یک سیستم توصیه کننده فیلتر مشترک را مرحله به مرحله ایجاد می کنیم.
مطمئن شوید که یک فنجان کاپوچینو (یا هر نوشیدنی دیگری که انتخاب می کنید) بردارید و آماده شوید!
پیش نیازها
قبل از شروع این سفر، باید درک اولیه ای از مفاهیم یادگیری ماشین و آشنایی با برنامه نویسی پایتون داشته باشید. دانش پردازش داده ها و تجربه با کتابخانه هایی مانند Pandas، NumPy و Scikit-learn نیز مفید خواهد بود.
اگر با این موضوعات تازه کار هستید، می توانید دوره مقدماتی علم داده در مورد مهارت های فوق العاده را بررسی کنید، جایی که من به عنوان یک متخصص در آن مشارکت می کنم.
انواع مختلف سیستم های توصیه
احتمالاً موافقت خواهید کرد که وقتی یکی از دوستان نظر ما را می پرسد، بیش از یک راه برای تصمیم گیری در مورد پیشنهاد یا توصیه وجود دارد. این در مورد هوش مصنوعی نیز صدق می کند!
در یادگیری ماشینی، دو روش اصلی برای ساخت موتورهای توصیه، روشهای فیلتر مبتنی بر محتوا و مشارکتی هستند.
هنگام استفاده از روش فیلتر مبتنی بر محتوا، محصولات یا اقلام پیشنهادی بر اساس آنچه که دوست داشتید یا خریداری کردید است. این روش مدل یادگیری ماشین را با داده های تاریخی مانند تاریخچه جستجوی مشتری، سوابق خرید و موارد موجود در لیست علاقه مندی های آنها تغذیه می کند. این مدل محصولات دیگری را پیدا می کند که ویژگی هایی مشابه ترجیحات گذشته شما دارند.
بیایید این را با مثالی از توصیه فیلم بهتر درک کنیم. فرض کنید Inception را دیدید و به آن امتیاز پنج ستاره دادید. یافتن فیلمهایی با موضوعات و ژانرهای مشابه، مانند Interstellar و Matrix، و توصیه به آنها فیلترینگ مبتنی بر محتوا نامیده میشود.
تصور کنید که همه سیستم های توصیه فقط چیزهایی را بر اساس آنچه دیده اید پیشنهاد می کنند. چگونه ژانرها و فیلم های جدید را کشف می کنید؟ اینجاست که روش فیلتر مشارکتی وارد می شود. پس آن چیست؟
روش فیلتر مشارکتی به جای یافتن محتوای مشابه، سایر کاربران و مشتریان مشابه شما را پیدا کرده و انتخاب های آنها را توصیه می کند. الگوریتم ویژگی های محصول را در مورد فیلتر مبتنی بر محتوا در نظر نمی گیرد.
برای درک نحوه عملکرد آن، اجازه دهید به مثال خود در مورد توصیه های فیلم برگردیم. این سیستم به فیلمهایی که از آنها لذت بردهاید نگاه میکند و کاربران دیگری را پیدا میکند که همان فیلمها را دوست داشتند. سپس می بیند که این کاربران مشابه از چه چیز دیگری لذت برده اند و آن فیلم ها را به شما پیشنهاد می کند.
به عنوان مثال، اگر شما و یکی از دوستانتان هر دو عاشق The Shawshank Redemption هستید، و دوست شما نیز عاشق Forrest Gump است، سیستم Forrest Gump را به شما توصیه می کند، به این فکر که شما ممکن است سلیقه دوست خود را داشته باشید.
در بخشهای آینده، نحوه ساخت موتور توصیه فیلم با استفاده از پایتون بر اساس فیلتر مشترک را به شما نشان خواهم داد.
نحوه تهیه و پردازش مجموعه داده فیلم ها
اولین گام هر پروژه یادگیری ماشینی جمع آوری و آماده سازی داده ها است. از آنجایی که هدف ما ساخت موتور توصیه فیلم است، من مجموعه داده رتبه بندی فیلم را انتخاب کرده ام. مجموعه داده به صورت رایگان در Kaggle در دسترس عموم است.
مجموعه داده دارای دو فایل اصلی در قالب CSV است:
- Ratings.csv: شامل امتیازی است که هر کاربر به هر فیلمی که تماشا کرده است
- Movies_metadata.csv: حاوی اطلاعاتی درباره ژانر، بودجه، تاریخ انتشار، درآمد و غیره برای همه فیلمهای مجموعه داده است.
اجازه دهید ابتدا بسته های پایتون مورد نیاز برای خواندن فایل های CSV را وارد کنیم.
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
در مرحله بعد، را بخوانید رتبه بندی ها را در قالب های داده پاندا قرار دهید و به ستون ها نگاه کنید.
user_ratings_df = pd.read_csv("../input/the-movies-dataset/ratings.csv")
user_ratings_df.head()
این شناسه کاربر ستون دارای شناسه منحصر به فرد برای هر مشتری است، و شناسه فیلم دارای شماره شناسایی منحصر به فرد برای هر فیلم است. این رتبه بندی ستون شامل امتیازی است که کاربر خاص به فیلم از 5 امتیاز داده است مهر زمانی ستون را می توان حذف کرد، زیرا برای تجزیه و تحلیل خود به آن نیاز نداریم.
در مرحله بعد، اجازه دهید اطلاعات فراداده فیلم را در یک دیتا فریم بخوانیم. بیایید فقط ستون های مربوط به عنوان و ژانر فیلم را برای هر MovieID نگه داریم.
movie_metadata = pd.read_csv("../input/the-movies-dataset/movies_metadata.csv")
movie_metadata = movie_names[['title', 'genres']]
movie_metadata.head()
سپس، این دیتافریم ها را در ستون مشترک ترکیب کنید شناسه فیلم.
movie_data = user_ratings_df.merge(movie_metadata, on='movieId')
movie_data.head()
این مجموعه داده می تواند برای تجزیه و تحلیل داده های اکتشافی استفاده شود. شما می توانید فیلم را با بیشترین رتبه بندی، بهترین رتبه و غیره پیدا کنید. برای درک بهتر داده هایی که با آنها سروکار دارید، آن را امتحان کنید.
نحوه ساخت ماتریس کاربر- آیتم
اکنون که مجموعه داده ما آماده است، بیایید روی نحوه عملکرد فیلتر مبتنی بر مشارکت تمرکز کنیم. هدف الگوریتم یادگیری ماشین کشف الگوهای ترجیحی کاربر است که برای ارائه توصیه ها استفاده می شود.
یکی از رویکردهای رایج استفاده از الف است ماتریس کاربر – آیتم. این شامل یک صفحه گسترده بزرگ است که در آن کاربران در یک طرف و فیلم ها در سمت دیگر فهرست شده اند. هر سلول در صفحه گسترده نشان می دهد که آیا کاربر فیلم خاصی را دوست دارد یا خیر. سپس سیستم از الگوریتم های مختلفی برای تجزیه و تحلیل این ماتریس، یافتن الگوها و تولید توصیه ها استفاده می کند.
این ماتریس ما را به یکی از مزایای فیلتر مشارکتی هدایت میکند: این ماتریس در کشف توصیههای جدید و غیرمنتظره عالی است. از آنجایی که بر اساس رفتار کاربر است، میتواند فیلمی را به شما پیشنهاد دهد که شاید هرگز به آن فکر نکردهاید، اما احتمالاً دوست خواهید داشت.
بیایید یک ماتریس رتبه بندی فیلم کاربر برای مجموعه داده خود ایجاد کنیم. همانطور که در زیر نشان داده شده است، می توانید این کار را با استفاده از تابع محوری داخلی یک دیتافریم Pandas انجام دهید. ما نیز از fillna()
روشی برای نسبت دادن مقادیر از دست رفته یا تهی با 0.
user_item_matrix = ratings_data.pivot(index=['userId'], columns=['movieId'], values="rating").fillna(0)
user_item_matrix
در اینجا ماتریس خروجی ما آمده است:
گاهی اوقات، ماتریس ممکن است پراکنده باشد. پراکندگی به مقادیر صفر اشاره دارد. می تواند به میزان قابل توجهی مقدار منابع محاسباتی مورد نیاز را افزایش دهد. فشرده سازی ماتریس های پراکنده با استفاده از تند هنگام کار با مجموعه داده بزرگ، بسته پایتون توصیه می شود.
نحوه تعریف و آموزش مدل
میتوانید از چندین الگوریتم یادگیری ماشین برای فیلتر کردن مشترک استفاده کنید، مانند K-نزدیک ترین همسایگان (KNN) و SVD. من در اینجا از یک مدل KNN استفاده خواهم کرد.
KNN بسیار ساده است. یک تابلوی رنگارنگ غولپیکر را با نقاطی که آیتمهای مختلف را نشان میدهند (مانند فیلمها) تصور کنید. هر نقطه به نقاط مشابه نزدیک است. وقتی از KNN توصیه میخواهید، نقطه مورد مورد علاقه شما را در این تابلو پیدا میکند و سپس به اطراف نگاه میکند تا نزدیکترین نقطهها را ببیند – اینها توصیههای شما هستند.
اکنون، پارامتر متریک در KNN بسیار مهم است. مانند خط کشی است که سیستم برای اندازه گیری فاصله بین این نقاط استفاده می کند. معیار استفاده شده در اینجا شباهت کسینوس است.
شباهت کسینوس چیست؟
این معیاری است که میزان شباهت دو موجودیت (مانند اسناد یا بردارها در یک فضای چند بعدی) را صرف نظر از اندازه، اندازه گیری می کند. شباهت کسینوس به طور گسترده در NLP برای یافتن کلمات بافت مشابه استفاده می شود.
برای تعریف مدل KNN، متریک و سایر پارامترها، قطعه زیر را دنبال کنید. مدل بر روی ماتریس کاربر-مورد ایجاد شده در بخش قبل مناسب است.
# Define a KNN model on cosine similarity
cf_knn_model= NearestNeighbors(metric="cosine", algorithm='brute', n_neighbors=10, n_jobs=-1)
# Fitting the model on our matrix
cf_knn_model.fit(user_item_matrix)
در مرحله بعد، اجازه دهید تابعی را برای ارائه تعداد مورد نظر توصیه فیلم، با توجه به عنوان فیلم به عنوان ورودی تعریف کنیم. کد زیر نزدیکترین داده همسایه را پیدا می کند و با استفاده از الگوریتم KNN به نام فیلم ورودی اشاره می کند. پارامترهای ورودی برای تابع عبارتند از:
n_recs:
تعداد توصیه های نهایی را که به عنوان خروجی دریافت می کنیم، کنترل می کندMovie_name:
نام فیلم را وارد کنید که بر اساس آن توصیههای جدیدی پیدا میکنیمMatrix:
ماتریس رتبه بندی کاربر-فیلم
def movie_recommender_engine(movie_name, matrix, cf_model, n_recs):
# Fit model on matrix
cf_knn_model.fit(matrix)
# Extract input movie ID
movie_id = process.extractOne(movie_name, movie_names['title'])[2]
# Calculate neighbour distances
distances, indices = cf_model.kneighbors(matrix[movie_id], n_neighbors=n_recs)
movie_rec_ids = sorted(list(zip(indices.squeeze().tolist(),distances.squeeze().tolist())),key=lambda x: x[1])[:0:-1]
# List to store recommendations
cf_recs = []
for i in movie_rec_ids:
cf_recs.append({'Title':movie_names['title'][i[0]],'Distance':i[1]})
# Select top number of recommendations needed
df = pd.DataFrame(cf_recs, index = range(1,n_recs))
return df
نحوه دریافت توصیه ها از مدل
برای دریافت توصیه های فیلم، تابع تعریف شده خود را فراخوانی می کنیم. به عنوان مثال، ما می توانیم لیستی از 10 فیلم برتر توصیه شده برای کسی که از طرفداران بتمن است را بدست آوریم.
n_recs = 10
movie_recommender_engine('Batman', user_rating_matrix, cf_knn_model, n_recs)
هورای! ما به نتیجه ای که نیاز داشتیم رسیده ایم.
مزایا و محدودیت های فیلتر مشارکتی
مزایای این روش عبارتند از:
- توصیه های شخصی: پیشنهادات متناسب با رفتار کاربر ارائه می دهد که منجر به تجربیات بسیار سفارشی می شود.
- کشف محتوای متنوع: می تواند طیف گسترده ای از موارد را توصیه کند و به کاربران کمک کند محتوایی را که ممکن است به تنهایی پیدا نکنند کشف کنند. این به کشف محتوای متنوع برتری نسبت به فیلتر مبتنی بر محتوا می دهد.
- خرد جامعه: از ترجیحات جمعی کاربران استفاده می کند، که اغلب به توصیه های دقیق تری نسبت به تجزیه و تحلیل فردی یا مبتنی بر محتوا منجر می شود.
- سازگاری پویا: این مدل به طور مداوم با تعاملات کاربر به روز می شود و توصیه ها را مرتبط و به روز نگه می دارد.
هر چند همه اش آفتاب نیست. یکی از چالش های بزرگ این است شروع سرد مسئله. به عنوان مثال، زمانی که فیلم ها یا کاربران جدیدی به سیستم اضافه می شوند، این اتفاق می افتد. از آنجایی که اطلاعات کافی در مورد این ورودیهای جدید وجود ندارد، سیستم برای ارائه توصیههای دقیق تلاش میکند.
موضوع دیگر سوگیری محبوبیت است. فیلمهای محبوب بسیار توصیه میشوند و جواهرات کمتر شناخته شده را تحت الشعاع قرار میدهند. همچنین مشکلات مقیاس پذیری با مدیریت چنین مجموعه داده بزرگی وجود دارد.
هنگام توسعه موتورهای مبتنی بر فیلتر مشترک، هزینههای محاسباتی و پراکندگی دادهها باید برای یک فرآیند کارآمد در نظر گرفته شود. همچنین توصیه می شود برای اطمینان از حریم خصوصی و امنیت داده ها اقدام کنید.
نتیجه
استفاده از فیلتر مشارکتی برای ساختن یک سیستم توصیه فیلم به طور قابل توجهی شخصی سازی محتوای دیجیتال را پیش می برد. این سیستم ترجیحات ما را منعکس می کند و ما را در معرض طیف وسیع تری از انتخاب ها بر اساس سلیقه کاربران مشابه قرار می دهد.
با وجود چالشهای آن، مانند مشکل شروع سرد و تعصب محبوبیت، مزایای توصیههای شخصیسازی شده آن را به ابزاری قدرتمند در صنعت یادگیری ماشین تبدیل میکند. با پیشرفت فناوری، این سیستمها حتی پیچیدهتر میشوند و تجربیات کاربری تصفیهشده و لذتبخشی را در دنیای دیجیتال ارائه میدهند.
با تشکر از شما برای خواندن! من جس هستم و در Hyperskill متخصص هستم. می توانید دوره مقدماتی علوم داده را در این پلتفرم بررسی کنید.
منتشر شده در 1402-12-26 05:47:06