آشنایی با سیستمهای توصیهگر و نحوه عملکرد آنها
آشنایی با سیستمهای توصیهگر و نحوه عملکرد آنها -آیا تا به حال هنگام انتخاب یک فیلم جدید، آهنگ یا حتی خرید یک محصول دچار تردید شدهاید؟ در چنین مواقعی، سیستمهای توصیهگر به کمک میآیند. این سیستمها بر اساس انتخابهای قبلی و علاقهمندیهای شما، به شما کمک میکنند تا گزینهای مناسب و ایدهآل را پیدا کنید.
در این مقاله، قصد داریم توضیح دهیم که سیستم توصیهگر چیست و چگونه کار میکند. این نرمافزارهای هوشمند بهطور خاص برای پیشنهاد محصولات یا خدمات بر اساس رفتار و سلیقه کاربران طراحی شدهاند.
ابتدا با مفهوم سیستم توصیهگر و ویژگیهای یک توصیه مناسب آشنا میشویم. سپس به بررسی انواع مختلف سیستمهای توصیهگر، کاربردهای آنها، مزایا و نحوه عملکرد این سیستمها خواهیم پرداخت. در پایان، رویکردهای مختلف برای پیادهسازی یک سیستم توصیهگر را به طور جامع بررسی خواهیم کرد.
برای آموزش کامل مباحث عمیق هوش مصنوعی به صفحه هوش مصنوعی بیا تو ای آی وارد شوید.
سیستم توصیهگر چیست و چه نقشی دارد؟
سیستم توصیهگر در حقیقت یک الگوریتم هوشمند مبتنی بر هوش مصنوعی و یادگیری ماشین است که از دادههای بزرگ (کلان داده) برای پیشنهاد محصولات به مصرفکنندگان استفاده میکند. این پیشنهادها معمولاً بر اساس عواملی مانند خریدهای قبلی، تاریخچه جستجو و اطلاعات جمعیتشناختی فرد صورت میگیرد. سیستمهای توصیهگر به کاربران کمک میکنند تا محصولاتی را پیدا کنند که در غیر این صورت از وجود آنها مطلع نمیشدند و این ویژگی آنها را به ابزاری بسیار کارآمد تبدیل میکند.
این سیستمها بهگونهای طراحی شدهاند که با استفاده از دادههای جمعآوریشده از تعاملات کاربران با محصولات، مانند بازدیدها، کلیکها، لایکها و خریدها، اولویتها و ترجیحات افراد را شناسایی کرده و به درک عمیقی از تصمیمات قبلی آنان میرسند. سیستم توصیهگر با توانایی پیشبینی دقیق علایق و نیازهای مشتری، بهصورت شخصیسازیشده عمل میکند و به همین دلیل بسیاری از شرکتها و پلتفرمها از آن بهره میبرند.
به عنوان مثال، اسپاتیفای که یک پلتفرم پخش آنلاین موسیقی است، از سیستم توصیهگر خود برای پیشنهاد آهنگهایی مشابه به آهنگهای محبوب کاربران استفاده میکند، که باعث میشود آنها وقت بیشتری را در پلتفرم سپری کرده و به آهنگهای جدید گوش دهند. همچنین، آمازون بر اساس اطلاعاتی که از هر کاربر جمعآوری کرده، محصولات جدیدی را به او پیشنهاد میدهد.
برای ساخت لوگوی شخصی کسب و کارتان با هوش مصنوعی در کوتاه ترین زمان برند خودتان را طراحی کنید بدون نیاز به آموزش کافیست بر روی ساخت لوگو با هوش مصنوعی کلیک کنید
به عنوان مثال، اسپاتیفای که یک پلتفرم پخش آنلاین موسیقی است، از سیستم توصیهگر خود برای پیشنهاد آهنگهایی مشابه به آهنگهای محبوب کاربران استفاده میکند، که باعث میشود آنها وقت بیشتری را در پلتفرم سپری کرده و به آهنگهای جدید گوش دهند. همچنین، آمازون بر اساس اطلاعاتی که از هر کاربر جمعآوری کرده، محصولات جدیدی را به او پیشنهاد میدهد.
راههای شناسایی توصیه خوب
حالا که با مفهوم سیستم توصیهگر آشنا شدیم، در این بخش میخواهیم بدانیم یک پیشنهاد یا توصیه خوب چیست و چگونه میتوان آن را شناسایی کرد. انتخاب معیار مناسب برای تعریف یک پیشنهاد خوب، یکی از چالشهای اساسی است که بسیاری از سازمانها با آن روبهرو هستند. اگر دقیقاً مشخص کنیم که منظور از “خوب” چیست، ارزیابی عملکرد سیستم توصیهگر بسیار راحتتر خواهد بود.
کیفیت یک پیشنهاد معمولاً با تکنیکهای مختلفی اندازهگیری میشود که مهمترین آنها «دقت» (Accuracy) و «پوشش» (Coverage) هستند. دقت به معنای نسبت پیشنهادهای صحیح به کل پیشنهادهای ارائهشده است، در حالی که پوشش به درصد موارد جستجو شدهای اشاره دارد که برای سیستم توصیهگر قابل شناسایی هستند. باید توجه داشت که روشهای ارزیابی و سنجش پیشنهادها بسته به دیتاست و رویکردی که برای تولید هر پیشنهاد به کار بردهایم، متفاوت است.
سیستمهای توصیهگر شباهتهای زیادی با مسائل مدلسازی «طبقهبندی» و «رگرسیون» دارند. در شرایط ایدهآل، شما میخواهید از بازخورد کاربران نسبت به پیشنهادهایی که به آنها دادهاید، مطلع شوید و بهطور مداوم عملکرد سیستم خود را بهبود ببخشید. این فرآیند نیازمند تجربه زیاد و تواناییهای خاص در تجزیه و تحلیل دادهها است.
انواع سیستم توصیهگر
در زمینه سیستمهای توصیهگر، تکنیکها و الگوریتمهای متنوعی وجود دارد. اما این سیستمها بهطور معمول در سه گروه اصلی زیر دستهبندی میشوند:
- سیستمهای پالایش گروهی (Collaborative Filtering)
- سیستمهای مبتنی بر محتوا (Content-Based)
- سیستمهای ترکیبی (Hybrid)
در ادامه این بخش، علاوه بر معرفی دقیقتر هر یک از این سه روش، مزایا و معایب آنها را نیز بررسی خواهیم کرد. همچنین، بههمراه مثالهای عملی و پیادهسازی به زبان برنامهنویسی پایتون، نحوه کارکرد هر یک را بهطور کامل توضیح خواهیم داد.
پالایش گروهی چیست و چگونه کار میکند؟
پالایش گروهی یکی از روشهای کارآمد در شناسایی علایق کاربران است که با استفاده از اولویتها و دادههای جمعآوریشده، سلایق احتمالی افراد را پیشبینی میکند. این روش بر این فرض استوار است که اگر دو کاربر (A و B) در مورد یک محصول نظر مشابهی داشته باشند، احتمالاً درباره محصولات دیگر نیز دیدگاه مشترکی خواهند داشت.
در ادامه، انواع رویکردهای مورد استفاده در پالایش گروهی معرفی شدهاند تا با این روش پیشرفته در تحلیل دادهها بهتر آشنا شوید.
رویکردهای مبتنی بر حافظه: این رویکردها که با عنوان «پالایش گروهی مجاورت» (Neighbourhood Collaborative Filtering) نیز شناخته میشوند، امتیاز ترکیبات «کاربر-محصول» (user-item) را بر اساس نمونههای مجاور بهدست میآورند. این رویکرد به دو گروه کوچکتر تقسیم میشود:
- پالایش گروهی مبتنی بر کاربر: در این رویکرد، کاربران همسلیقه پیشنهادات مشابهی دریافت میکنند.
- پالایش گروهی مبتنی بر محصول: در این روش، ابتدا با بهرهگیری از امتیاز کاربران، شباهت میان کالاها محاسبه میشود و سپس محصولات پیشنهاد میشوند.
رویکردهای مبتنی بر مدل: این رویکردها مدلهای پیشبینیکنندهای هستند که از یادگیری ماشین استفاده میکنند. در این رویکرد، ویژگیهای دیتاست بهعنوان ورودی مدلها برای حل مسائل بهینهسازی بهکار گرفته میشوند. روشهای مبتنی بر مدل از الگوریتمهایی مانند درخت تصمیم و رویکردهای قاعدهمحور استفاده میکنند.
مزایا، معایب و مثالهای کاربردی سیستمهای پالایش گروهی
مزایا
پیادهسازی سیستمهای پالایش گروهی ساده است و در زمینههای مختلفی کاربرد دارد. این سیستمها قادرند بدون نیاز به درک محتوای کالا، حتی جزئیترین ویژگیها را استخراج کنند.
معایب
یکی از مهمترین معایب این سیستمها، ضعف در پیشنهاد کالاهای جدید است. چرا که هیچ تعاملی میان نمونههای داده در دیتاست و محصول جدیدی که قرار است پیشنهاد شود، وجود ندارد. همچنین، الگوریتمهای مبتنی بر حافظه در مقابل دیتاستهای کوچک عملکرد مناسبی ندارند.
مثالها
برخی از مثالهای رویکرد پالایش گروهی عبارتاند از:
پیشنهاد محتوای ویدئویی در یوتیوب: هنگام استفاده از پلتفرم یوتیوب، ویدئوهایی به شما پیشنهاد میشود که مشابه به محتوای مورد پسند کاربران همسلیقه شما هستند.
پیشنهاد دورههای آموزشی در کورسرا: پیشنهاد دورههای آموزشی در کورسرا بر اساس علاقهمندی کاربران به دورههای مشابه شما که قبلاً به اتمام رساندهاند، انجام میشود.
پیادهسازی
برای پیادهسازی الگوریتم پالایش گروهی، ابتدا از طریق قطعه کد زیر، دیتاستی با موضوع کتاب و دادههای مصنوعی تولید میشود.
import pandas as pd
from random import randint
def generate_data(n_books = 3000, n_genres = 10, n_authors = 450, n_publishers = 50, n_readers = 30000, dataset_size = 100000):
d = pd.DataFrame(
{
'book_id' : [randint(1, n_books) for _ in range(dataset_size)],
'author_id' : [randint(1, n_authors) for _ in range(dataset_size)],
'book_genre' : [randint(1, n_genres) for _ in range(dataset_size)],
'reader_id' : [randint(1, n_readers) for _ in range(dataset_size)],
'num_pages' : [randint(75, 700) for _ in range(dataset_size)],
'book_rating' : [randint(1, 10) for _ in range(dataset_size)],
'publisher_id' : [randint(1, n_publishers) for _ in range(dataset_size)],
'publish_year' : [randint(2000, 2021) for _ in range(dataset_size)],
'book_price' : [randint(1, 200) for _ in range(dataset_size)],
'text_lang' : [randint(1,7) for _ in range(dataset_size)]
}
).drop_duplicates()
return d
d = generate_data(dataset_size = 100000)
d.to_csv('data.csv', index = False)
این دیتاست شامل ۱۰۰ هزار سطر و ۱۰ ستون است که هر سطر اطلاعات مربوط به یک کاربر و کتابی که مطالعه کرده و به آن امتیاز داده است را نشان میدهد. در ادامه با استفاده از متد svds کتابخانه SciPy، شباهت میان کاربران و کتابها محاسبه میشود و ۳ کتاب پیشنهادی به کاربر شماره پنجم نمایش داده میشود.
import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse.linalg import svds
def normalize(pred_ratings):
'''
This function will normalize the input pred_ratings
params:
pred_ratings (List -> List) : The prediction ratings
'''
return (pred_ratings - pred_ratings.min()) / (pred_ratings.max() - pred_ratings.min())
def generate_prediction_df(mat, pt_df, n_factors):
'''
This function will calculate the single value decomposition of the input matrix
given n_factors. It will then generate and normalize the user rating predictions.
params:
mat (CSR Matrix) : scipy csr matrix corresponding to the pivot table (pt_df)
pt_df (DataFrame) : pandas dataframe which is a pivot table
n_factors (Integer) : Number of singular values and vectors to compute.
Must be 1 <= n_factors < min(mat.shape).
'''
if not 1 <= n_factors < min(mat.shape):
raise ValueError("Must be 1 <= n_factors < min(mat.shape)")
# matrix factorization
u, s, v = svds(mat, k = n_factors)
s = np.diag(s)
# calculate pred ratings
pred_ratings = np.dot(np.dot(u, s), v)
pred_ratings = normalize(pred_ratings)
# convert to df
pred_df = pd.DataFrame(
pred_ratings,
columns = pt_df.columns,
index = list(pt_df.index)
).transpose()
return pred_df
def recommend_items(pred_df, usr_id, n_recs):
'''
Given a usr_id and pred_df this function will recommend
items to the user.
params:
pred_df (DataFrame) : generated from `generate_prediction_df` function
usr_id (Integer) : The user you wish to get item recommendations for
n_recs (Integer) : The number of recommendations you want for this user
'''
usr_pred = pred_df[usr_id].sort_values(ascending = False).reset_index().rename(columns = {usr_id : 'sim'})
rec_df = usr_pred.sort_values(by = 'sim', ascending = False).head(n_recs)
return rec_df
if __name__ == '__main__':
# constants
PATH = 'data.csv'
# import data
df = pd.read_csv(PATH)
print(df.shape)
# generate a pivot table with readers on the index and books on the column and values being the ratings
pt_df = df.pivot_table(
columns = 'book_id',
index = 'reader_id',
values = 'book_rating'
).fillna(0)
# convert to a csr matrix
mat = pt_df.values
mat = csr_matrix(mat)
pred_df = generate_prediction_df(mat, pt_df, 10)
# generate recommendations
print(recommend_items(pred_df, 5, 3))
خروجی به صورت زیر است:
به کاربر شماره ۵، سه کتاب پیشنهادی با شناسههای ۱۴۸۸، ۶۸۳ و ۱۲۴۴ توصیه میشود.
سیستمهای مبتنی بر محتوا چگونه کار می کنند؟
در سیستمهای مبتنی بر محتوا، هر پیشنهاد بر اساس اولویتهای فردی کاربران تولید میشود. هدف این سیستمها پیشنهاد محصولاتی است که بیشتر مورد پسند کاربران قرار بگیرند. به عبارت دیگر، کاربران خودشان سطح شباهت بین محصولات را تعیین میکنند.
برخلاف مدلهای پالایش گروهی که به امتیازات ثبتشده بین کاربر هدف (کاربری که قرار است محصول به او پیشنهاد شود) و سایر کاربران اتکا دارند، در سیستمهای مبتنی بر محتوا تنها امتیازات کاربر هدف اهمیت دارد.این سیستمها از منابع مختلفی برای پیشنهاد محصول استفاده میکنند.
در اینجا به دو منبع رایج اشاره میشود:
1.منابع داده در سطح محصول: برای ارائه پیشنهادات دقیق، دسترسی به دادههای کامل و ویژگیهای محصولات ضروری است. به عنوان مثال، در دیتاستی که استفاده کردهایم، هر سطر اطلاعاتی مانند قیمت کتاب، تعداد صفحات و سال انتشار را شامل میشود. هرچه اطلاعات بیشتری از محصولات در دسترس باشد، دقت و اعتماد به نتایج سیستم بیشتر میشود.
2.منابع داده در سطح کاربر: برای پیشنهاد یک محصول به کاربر، باید بازخوردی از سوی دیگر کاربران جمعآوری شود. این بازخورد میتواند بهصورت صریح یا ضمنی ثبت گردد. در دیتاست مثال ما، بازخورد کاربران در قالب امتیازهایی که به کتابها دادهاند ذخیره شده است. هرچه بازخورد بیشتری از کاربران جمعآوری شود، سیستم مبتنی بر محتوا میتواند نتایج دقیقتری ارائه دهد.
مزایا ، معایب وپیاده سازی سیستم های مبتنی بر محتوا
مزایا
زمانی استفاده از مدلهای مبتنی بر محتوا پیشنهاد میشود که حجم دادههایی که از جنس امتیاز و بازخورد هستند کم باشد. چرا که ممکن است محصولات مشابه دیگر، امتیازدهی شده باشند. در نتیجه حتی اگر تعداد دادهها کم باشد، مدل این توانایی را دارد تا با بهرهگیری از امتیاز محصولات به فعالیت خود ادامه دهد.
معایب
سیستمهای مبتنی بر محتوا دارای معایبی هستند که میتوان به مهمترین آنها اشاره کرد:
1.پیشبینی پیشنهادات ساده است: یکی از معایب این سیستمها این است که پیشنهادها تنها شامل محصولاتی میشود که کاربر قبلاً با آنها تعامل داشته است. به عنوان مثال، اگر کاربر هیچگاه کتابی از ژانر معمایی نخوانده باشد، سیستم هرگز این نوع کتابها را به او پیشنهاد نخواهد داد. این مدلها برای هر کاربر بهطور جداگانه عمل میکنند و از اطلاعات دیگر کاربران استفاده نمیکنند، بنابراین تنوع پیشنهادات پایین میآید که برای بسیاری از کسبوکارها یک نقطه ضعف است.
2.نامناسب برای کاربران جدید: این مدلها به تاریخچه دادهها در سطح کاربر نیاز دارند. بدون دسترسی به دیتاستی بزرگ از امتیازات و بازخوردها، احتمال «بیشبرازش» (Overfitting) افزایش مییابد و در نتیجه مدل عملکرد دقیقی نخواهد داشت. این محدودیت میتواند به کاربرانی که هنوز تاریخچه تعاملات کمتری دارند، آسیب برساند.
مثال
برخی از نمونههای موفق سیستمهای مبتنی بر محتوا عبارتاند از:
- سرویس پیشنهاد کالا در وبسایت آمازون
- سرویس پیشنهاد موسیقی در پلتفرم اسپاتیفای
پیادهسازی
برای پیادهسازی این روش، ابتدا دادهها را از فایل دیتاست با نام data.csv بارگذاری میکنیم. سپس، سه ویژگی شامل book_price (قیمت کتاب)، book_rating (امتیاز کتاب) و num_pages (تعداد صفحات کتاب) را نرمالسازی کرده و سه ویژگی دیگر با نامهای publish_year (سال انتشار)، book_genre (ژانر کتاب) و text_lang (زبان متن) را با استفاده از روش «وان هات» کدبندی میکنیم.
سپس، با محاسبه معیار شباهت کسینوسی، پنج کتابی که بیشترین شباهت را با کتاب اول دارند در خروجی نمایش داده میشوند:
from numpy import dot
from numpy.linalg import norm
def normalize(data):
'''
This function will normalize the input data to be between 0 and 1
params:
data (List) : The list of values you want to normalize
returns:
The input data normalized between 0 and 1
'''
min_val = min(data)
if min_val < 0:
data = [x + abs(min_val) for x in data]
max_val = max(data)
return [x/max_val for x in data]
def ohe(df, enc_col):
'''
This function will one hot encode the specified column and add it back
onto the input dataframe
params:
df (DataFrame) : The dataframe you wish for the results to be appended to
enc_col (String) : The column you want to OHE
returns:
The OHE columns added onto the input dataframe
'''
ohe_df = pd.get_dummies(df[enc_col])
ohe_df.reset_index(drop = True, inplace = True)
return pd.concat([df, ohe_df], axis = 1)
class CBRecommend():
def __init__(self, df):
self.df = df
def cosine_sim(self, v1,v2):
'''
This function will calculate the cosine similarity between two vectors
'''
return sum(dot(v1,v2)/(norm(v1)*norm(v2)))
def recommend(self, book_id, n_rec):
"""
df (dataframe): The dataframe
song_id (string): Representing the song name
n_rec (int): amount of rec user wants
"""
# calculate similarity of input book_id vector w.r.t all other vectors
inputVec = self.df.loc[book_id].values
self.df['sim']= self.df.apply(lambda x: self.cosine_sim(inputVec, x.values), axis=1)
# returns top n user specified books
return self.df.nlargest(columns='sim',n=n_rec)
if __name__ == '__main__':
# constants
PATH = 'data.csv'
# import data
df = pd.read_csv(PATH)
# normalize the num_pages, ratings, price columns
df['num_pages_norm'] = normalize(df['num_pages'].values)
df['book_rating_norm'] = normalize(df['book_rating'].values)
df['book_price_norm'] = normalize(df['book_price'].values)
# OHE on publish_year and genre
df = ohe(df = df, enc_col = 'publish_year')
df = ohe(df = df, enc_col = 'book_genre')
df = ohe(df = df, enc_col = 'text_lang')
# drop redundant columns
cols = ['publish_year', 'book_genre', 'num_pages', 'book_rating', 'book_price', 'text_lang']
df.drop(columns = cols, inplace = True)
df.set_index('book_id', inplace = True)
# ran on a sample as an example
t = df.copy()
cbr = CBRecommend(df = t)
print(cbr.recommend(book_id = t.index[0], n_rec = 5))
خروجی به صورت زیر نمایش داده می شود:
سیستمهای ترکیبی چگونه عمل می کنند؟
در این بخش، با سیستمهای ترکیبی آشنا میشویم. پیشتر با دو نوع سیستم توصیهگر، یعنی پالایش گروهی و مبتنی بر محتوا آشنا شدیم، که هرکدام مزایا و معایب خاص خود را دارند. اما محدودیتهای این سیستمها زمانی بیشتر نمایان میشود که منابع اطلاعاتی زیادی در دسترس باشد. در چنین شرایطی، سیستمهای ترکیبی وارد عمل میشوند و میتوانند از دیتاستهای مختلف برای ارائه نتایج دقیقتر و کارآمدتر استفاده کنند.
سیستمهای ترکیبی معمولاً به دو روش طراحی میشوند: موازی و ترتیبی.
طراحی موازی: در این روش، نمونههای ورودی به چند سیستم توصیهگر مختلف ارسال میشود و پس از ترکیب نتایج هر سیستم، یک خروجی واحد بهدست میآید.
طراحی ترتیبی: در این مدل، سیستمهای توصیهگر بهصورت پشت سر هم عمل میکنند. خروجی هر سیستم، ورودی سیستم بعدی میشود و این فرایند به شکل زنجیرهای ادامه مییابد.
در تصویر زیر، میتوانید نمای دقیقی از این دو روش طراحی مشاهده کنید:
مزایا،معایب و پیاده سازی سیستمهای ترکیبی
مزایا
استفاده از رویکرد ترکیبی به دلیل ترکیب چند مدل مختلف، باعث میشود که معایب هر مدل به نوعی جبران شود. این امر به عملکرد بهتر سیستم توصیهگر منجر میشود و پیشنهادهایی دقیقتر و مفیدتر به کاربران ارائه میدهد.
معایب
یکی از مهمترین معایب سیستمهای ترکیبی، پیچیدگی بالای محاسباتی آنهاست. این مدلها نیازمند حجم بالایی از دادهها هستند تا بتوانند بهطور مؤثر بهروز شوند. اگر معیارهای بهروزرسانی همچون امتیاز و میزان تعامل کاربران نادیده گرفته شوند، ارائه پیشنهادات جدید و مؤثر دشوار خواهد بود.
مثال
پلتفرم نتفلیکس از سیستمهای ترکیبی برای پیشنهاد فیلم به کاربران خود استفاده میکند. در این سیستم، پیشنهادات فیلم هم از طریق پالایش گروهی (که بر اساس سلیقه کاربران مشابه است) و هم از طریق ویژگیهای مشترک میان فیلمها (که مشابهت محتوایی دارد) انجام میشود.
پیادهسازی
در این بخش، ابتدا دیتاست مورد نظر را بارگذاری میکنیم و با استفاده از یک مدل مبتنی بر محتوا (شباهت کسینوسی)، ۵۰ کتاب مشابه به کتاب مورد نظر را شبیهسازی میکنیم. سپس از مدل پالایش گروهی برای محاسبه امتیازات احتمالی کاربران برای این ۵۰ کتاب استفاده میکنیم. در نهایت، ۵ کتابی که بالاترین امتیاز پیشبینیشده را دارند، بهعنوان پیشنهادات برتر در خروجی به کاربران ارائه میشوند.
from sklearn.metrics.pairwise import cosine_similarity
from surprise import SVD, Reader, Dataset, accuracy
from surprise.model_selection import train_test_split
def hybrid(reader_id, book_id, n_recs, df, cosine_sim, svd_model):
'''
This function represents a hybrid recommendation system, it will have the following flow:
1. Use a content-based model (cosine_similarity) to compute the 50 most similar books
2. Compute the predicted ratings that the user might give these 50 books using a collaborative
filtering model (SVD)
3. Return the top n books with the highest predicted rating
params:
reader_id (Integer) : The reader_id
book_id (Integer) : The book_id
n_recs (Integer) : The number of recommendations you want
df (DataFrame) : Original dataframe with all book information
cosine_sim (DataFrame) : The cosine similarity dataframe
svd_model (Model) : SVD model
'''
# sort similarity values in decreasing order and take top 50 results
sim = list(enumerate(cosine_sim[int(book_id)]))
sim = sorted(sim, key=lambda x: x[1], reverse=True)
sim = sim[1:50]
# get book metadata
book_idx = [i[0] for i in sim]
books = df.iloc[book_idx][['book_id', 'book_rating', 'num_pages', 'publish_year', 'book_price', 'reader_id']]
# predict using the svd_model
books['est'] = books.apply(lambda x: svd_model.predict(reader_id, x['book_id'], x['book_rating']).est, axis = 1)
# sort predictions in decreasing order and return top n_recs
books = books.sort_values('est', ascending=False)
return books.head(n_recs)
if __name__ == '__main__':
# constants
PATH = 'data.csv'
# import data
df = pd.read_csv(PATH)
# content based
rmat = df.pivot_table(
columns = 'book_id',
index = 'reader_id',
values = 'book_rating'
).fillna(0)
#Compute the cosine similarity matrix
cosine_sim = cosine_similarity(rmat, rmat)
cosine_sim = pd.DataFrame(cosine_sim, index=rmat.index, columns=rmat.index)
# collaborative filtering
reader = Reader()
data = Dataset.load_from_df(df[['reader_id', 'book_id', 'book_rating']], reader)
# split data into train test
trainset, testset = train_test_split(data, test_size=0.3,random_state=10)
# train
svd = SVD()
svd.fit(trainset)
# run the trained model against the testset
test_pred = svd.test(testset)
# get RMSE
accuracy.rmse(test_pred, verbose=True)
# generate recommendations
r_id = df['reader_id'].values[0]
b_id = df['book_id'].values[0]
n_recs = 5
print(hybrid(r_id, b_id, n_recs, df, cosine_sim, svd))
خروجی قطعه کد بالا به صورت زیر است:
سیستم توصیهگر چه کاربردی دارد؟
پس از بررسی سیستم توصیهگر و معرفی سه رویکرد اصلی آن شامل پالایش گروهی، مبتنی بر محتوا و ترکیبی، در این بخش به کاربردهای رایج این سیستمها در صنایع مختلف میپردازیم:
1. تجارت الکترونیک: بهعنوان مثال، فرض کنید که کاربری یک شال خریداری کرده است. در این صورت، سیستمهای توصیهگر بهطور خودکار محصولاتی مشابه، مانند کلاه، را در بخش «شاید به این محصولات نیز علاقهمند باشید» به او پیشنهاد میدهند.
2. رسانه و سرگرمی: این سیستمها قادرند خریدها و رفتارهای کاربران را تجزیه و تحلیل کرده و با شناسایی الگوهای رفتاری، محتواهای مرتبط را به کاربران پیشنهاد دهند. شرکتهای بزرگی چون گوگل، فیسبوک و نتفلیکس از این روشها برای شخصیسازی تبلیغات و فیلمها، سریالها به کاربران بهره میبرند.
3.امور مالی: در این حوزه، سیستمهای توصیهگر میتوانند با تحلیل دادههای مالی کاربران و شناخت اولویتها و نیازهای آنان، پیشنهادهای مالی بهینه و مناسب را ارائه دهند. ترکیب این دادهها با اطلاعات کاربران مشابه، باعث ایجاد سیستمهای کارآمد و مفید در بخش مالی میشود.
مزایای سیستم یا سامانه توصیهگر
سیستمهای توصیهگر بخش حیاتی از هر نوع تجربه کاربری، تعامل با مشتری و ابزارهای تصمیمگیری در حوزههای مختلف مانند خدمات درمانی، سرگرمی و امور مالی هستند. این سیستمها میتوانند تا ۳۰ درصد از درآمد سالانه شرکتهای بزرگ تبلیغاتی را به خود اختصاص دهند. بنابراین، حتی یک درصد بهبود در کیفیت این سیستمها میتواند به سود چند میلیاردی منجر شود. دلایل متعددی برای پیادهسازی سیستمهای توصیهگر وجود دارد:
حفظ کاربر: با پاسخگویی مداوم به خواستهها و نیازهای کاربران، شرکتها میتوانند کاربران وفاداری ایجاد کنند که به داراییهای ارزشمند سازمان تبدیل میشوند.
افزایش فروش: تحقیقات نشان میدهند که توصیه محصولات مشابه با علاقهمندیهای کاربر میتواند موجب افزایش ۱۰ تا ۵۰ درصدی در سود شرکتها شود. نمایش محصولات مشابه هنگام تسویه حساب و اشتراکگذاری بازخوردها، از جمله روشهای افزایش فروش است.
جهتدهی به گرایش بازار: ارائه پیشنهادات مرتبط و دقیق باعث شکلگیری عادتهای رفتاری در کاربران و تاثیر بر الگوهای خرید آنها میشود.
تجزیه و تحلیل سریعتر: با ارائه کالاهای پیشپردازششده، سرعت تجزیه و تحلیل دادهها تا ۸۰ درصد افزایش مییابد.
افزایش ارزش سبد خرید: روزانه حجم بالایی از محصولات وارد انبار شرکتهای بزرگ فروشگاهی میشود. با استفاده از سیستمهای توصیهگر، شرکتها میتوانند محصولات جدید خود را در زمان مناسب و از طریق وبسایت یا کانالهای ارتباطی مانند ایمیل به کاربران معرفی کنند، که باعث افزایش ارزش سبد خرید میشود.
نحوه عملکرد سیستم توصیهگر
حالا که میدانید سیستم توصیهگر چیست، باید توجه کنید که نحوه عملکرد این سیستمها به نوع دادههای ورودی بستگی دارد. اگر تنها تعاملات گذشته کاربران را دارید و اطلاعات جدیدی در اختیار ندارید، بهترین گزینه استفاده از رویکرد پالایش گروهی است. اما اگر دادههای شما ارتباط میان کاربر و محصول را نشان میدهند، میتوانید از رویکرد مبتنی بر محتوا برای مدلسازی تعاملات جدید بهرهبرداری کنید.
انواع رویکردها در سیستمهای توصیهگر
تا اینجا با مفهوم سیستم یا سامانه توصیهگر، نحوه کارکرد آن، کاربردها و مزایای آن آشنا شدیم. در این بخش، به جزییات بیشتری پرداخته و با رویکردهایی که برای پیادهسازی انواع سیستمهای توصیهگر مورد استفاده قرار میگیرند، آشنا میشویم.
تجزیه ماتریس
تکنیکهای «تجزیه ماتریس» (Matrix Factorization) به عنوان یکی از رویکردهای اصلی در سیستمهای توصیهگر پالایش گروهی شناخته میشوند. این تکنیکها همچنین پایه و اساس الگوریتمهای محبوب مانند «تعبیهسازی واژگان» (Word Embedding) و «مدلسازی موضوعی» (Topic Modeling) هستند. در سیستمهای توصیهگر، تجزیه ماتریس بهطور معمول برای محاسبه شباهت در تعاملات میان کاربران و در نهایت پیشنهاد محصول مورد استفاده قرار میگیرد.
بهعنوان مثال، در ماتریس ساده کاربر-محصول، دو کاربر به نامهای سعید و مجید هر دو فیلمهای «ب» و «پ» را دوست دارند. همچنین امیر فقط به فیلم «ب» علاقهمند است. با بهکارگیری روش تجزیه ماتریس، میتوان به این نتیجه رسید که اگر فردی فیلم «ب» را دوست داشته باشد، احتمالاً به فیلم «پ» نیز علاقهمند خواهد بود. در نتیجه، فیلم «پ» به کاربر امیر پیشنهاد میشود.
در روش تجزیه ماتریس، از الگوریتم «کمترین مربعات متناوب» (Alternating Least Squares | ALS) برای تخمین ماتریس خالی کاربر-محصول با ابعاد 𝑢 در 𝑖 استفاده میشود. این ماتریس از ضرب دو ماتریس فشرده «کاربر» و «محصول» با ابعاد 𝑢 در 𝑓 و 𝑓 در 𝑖 بهدست میآید. در اینجا،𝑢 نشاندهنده تعداد کاربران و 𝑖 نشاندهنده تعداد محصولات است. ماتریسهای کاربر و محصول ویژگیهایی را از کاربران و محصولات بهنمایش میگذارند که الگوریتم در تلاش است آنها را کشف کند.
الگوریتم ALS برای هر کاربر و محصول بهطور مداوم «عاملها» (Factors) عددی را یاد میگیرد که با 𝑓 مشخص میشود. در هر مرحله از اجرای الگوریتم و تا زمانی که ماتریسها همگرا شوند، یکی از ماتریسها (کاربر یا محصول) بهینهسازی میشود.
انواع مدلهای شبکه عصبی عمیق
شبکههای عصبی عمیق انواع مختلفی دارند که در ادامه به معرفی چند نمونه از آنها میپردازیم:
شبکههای عصبی پیشخور (Feedforward Neural Networks): در این شبکهها جریان اطلاعات و آموزش از یک لایه به لایه دیگر انجام میشود. یکی از شناختهشدهترین انواع این شبکهها، شبکههای چندلایه پرسپترون هستند که شامل حداقل سه لایه «ورودی»، «مخفی» و «خروجی» هستند. این نوع شبکهها در حل مسائل متنوعی کاربرد دارند.
شبکههای عصبی پیچشی (CNN): این مدلها در تشخیص و شناسایی محتوای تصویری بسیار موثر هستند.
شبکههای عصبی بازگشتی (RNN): این شبکهها همان موتورهای ریاضیاتی هستند که دادههای دنبالهدار و الگوهای زبانی را تجزیه میکنند.
این مدلها از تکنیکهایی مانند تجزیه ماتریس و بردارهای تعبیه شده (Embeddings) برای مدلسازی روابط میان کاربران و محصولات استفاده میکنند. یک بردار تعبیهشده، مجموعهای از اعداد است که فاصله کمی بین موجودیتهای مشابه مانند کاربران یا محصولات ایجاد میکند.
پالایش گروهی عصبی (Neural Collaborative Filtering – NCF)
مدل پالایش گروهی عصبی (NCF) یکی از انواع شبکههای عصبی است که برای پالایش گروهی طراحی شده و بر اساس تعاملات میان کاربران و محصولات عمل میکند.
در این مدل:
• تجزیه ماتریس روی دنبالهای از جفت ورودیهای شامل اطلاعات کاربران و محصولات اعمال میشود.
• همزمان، این دادهها به یک شبکه پرسپترون چندلایه (MLP) منتقل میشوند.
• خروجی شبکه پرسپترون و نتیجه تجزیه ماتریس با یکدیگر ترکیب شده و وارد یک لایه متراکم میشوند.
در نهایت، این فرایند منجر به تولید خروجی یا همان احتمال تعامل کاربر با محصول میشود، که امکان ارائه پیشنهادات دقیقتر و شخصیسازی شده را فراهم میکند.
خود رمزگذار متغیر در پالایش گروهی
شبکه عصبی خود رمزگذار (Autoencoder) با استفاده از درکی که از لایه مخفی به دست میآورد، اطلاعات ورودی را در لایه خروجی بازسازی میکند. در زمینه پالایش گروهی، این شبکه با یادگیری از ماتریس کاربر-محصول میتواند مقادیر گمشده را جایگزین کند.
خود رمزگذار متغیر به عنوان نسخهای پیشرفته، رویکردی بهینه برای پالایش گروهی ارائه میدهد. این مدل از جفت دادههای کاربر-محصول برای آموزش استفاده میکند و از دو بخش اصلی تشکیل شده است:
1. رمزگذار (Encoder):
- شامل یک شبکه کامل متصل (Fully Connected) است.
- بردار ورودی را به یک توزیع متغیر در ابعاد n تبدیل میکند.
- این توزیع برای استخراج ویژگیهای پنهان کاربر به کار میرود.
2. رمزگشا (Decoder):
- نوعی شبکه پیشخور (Feedforward) است.
- ویژگیهای استخراجشده را به خروجی تبدیل میکند.
خروجی مدل برداری احتمالاتی است که تعاملات احتمالی کاربران با محصولات را پیشبینی میکند.
یادگیری توالی متنی با استفاده از شبکههای عصبی بازگشتی (RNN)
شبکه عصبی بازگشتی (RNN) یک نوع شبکه عصبی است که دارای حافظه یا «حلقههای بازخورد» (Feedback Loops) است و به آن امکان میدهد تا الگوهای موجود در دادهها را شناسایی کند. از جمله کاربردهای RNN میتوان به «پردازش زبان طبیعی» (NLP) و سیستمهای پیشنهاد «توالی متنی» (Contextual Sequence) اشاره کرد.
تفاوت اصلی یادگیری توالی با سایر روشها در نیاز به مدلهایی با حافظه فعال، مانند «حافظه طولانی کوتاه مدت» (LSTM) یا «واحدهای بازگشتی گِیتی» (GRU)، برای یادگیری وابستگیهای زمانی است. این وابستگیها برای موفقیت سیستمهای مبتنی بر یادگیری توالی اهمیت بسیاری دارند. مدلهای «ترنسفورمر» (Transformer) مانند BERT، جایگزین شبکههای عصبی بازگشتی هستند و از مکانیزم «توجه» (Attention) برای تجزیه و تحلیل واژگان قبل و بعد از هر جمله استفاده میکنند. مدلهای ترنسفورمر نیازی به دادههای ترتیبی ندارند و به همین دلیل، زمان لازم برای آموزش به طور قابل توجهی کاهش مییابد.
در پردازش زبان طبیعی، با استفاده از تکنیکهایی مانند تعبیهسازی واژگان، متن ورودی به بردارهای عددی تبدیل میشود. به زبان ساده، قبل از ارسال ورودی به شبکههای عصبی مانند RNN، هر واژه به مجموعهای از اعداد تبدیل میشود که برای مدلهای مانند ترنسفورمر قابل فهم است.
در فرآیند آموزش شبکه عصبی و رمزگذاری اطلاعات متنی، واژگان مشابه به هم نزدیکتر میشوند و واژگان متفاوت از هم فاصله میگیرند. این مدلها عمدتاً در پیشبینی واژگان و خلاصهسازی متن کاربرد دارند. به عنوان مثال، در سیستمهای پیشنهاد فیلم، پس از اعمال رویکرد مبتنی بر محتوا، مجموعه اعداد بهدست آمده به یکی از انواع RNN مانند LSTM، GRU یا ترنسفورمر داده میشود.
شبکههای عصبی عمیق و یادگیری عمیق نقش اساسی در پیشرفت سیستمهای توصیهگر ایفا میکنند. این تکنیکها توانایی سیستمهای توصیهگر را در درک الگوهای پیچیده افزایش داده و موجب ارائه پیشنهادات دقیقتر میشوند. شبکههای عصبی عمیق قادر به یادگیری روابط غیرخطی پیچیده میان دادهها هستند و به این ترتیب، عملکرد سیستمهای توصیهگر را بهبود میبخشند.
یادگیری عمیق، که از مغز انسان الهام گرفته شده است، امکان پردازش حجم زیادی از دادهها و استخراج ویژگیهای مهم را فراهم میکند. این قابلیت در سیستمهای توصیهگر موجب ارائه پیشنهادات شخصیسازی شده و افزایش دقت میشود.