مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

سیستم‌های توصیه‌گر (Recommender Systems) با تحلیل رفتار کاربر، اقدام به پیشنهاد مناسب‌ترین اقلام (داده، اطلاعات، کالا و…) میکنه. این سیستم کمک زیادی به مشکلات سیستم‌های دارای حجم زیاد اطلاعات می‌کنه و به کاربرش کمک می‌کنه تا در بین حجم زیاد اطلاعات سریع‌تر به هدفش نزدیک بشه.

+ ویدیو آموزشی این مطلب

+ کد ها در Jupyter Notebook

مقدمه:

فرض کنید یک سایت شبیه GoodReads داریم که کاربران میتونند در مورد کتاب های مختلف در سایت نظرشونو بنویسند. ما اطلاعاتی در مورد اینکه هر کاربر به چه کتابی چه امتیازی داده داریم، فرض کنید کاربر الف به کتاب های a , b , c رای بالا داده، و ما میخوایم پیش‌بینی کنیم این کاربر به کتاب d احتمالا چه امتیازی میده، برای این‌کار با تحلیل داده‌های بقیه کاربرهایی که امتیازشون به a, b , c شبیه کاربر الف بوده میشه فهمید احتمالا کاربر الف به کتاب d چه امتیازی میده.

به یک مثال دیگه توجه کنید:

فرض کنید این اطلاعات یک سایت پیشنهاد فیلمه و این جدول رای هر کاربر به هر فیلمو نشون میده. همونطوری که می‌بینید بعضی از خانه های جدول خالیه و هدف حدس زدن خانه های خالی جدوله. برای اینکار ابتدا برای مثال ۵ ویژگی برای هر فیلم در نظر میگیریم، مثلا تخیلی بودن ، درام بودن ، علمی بودن و… ، و ۵ ویژگی هم برای کاربر مثلا دوست داشتن فیلم تخیلی، دوست داشتن فیلم درام و…

حالا به صورت تصادفی به هر کدام از این ویژگی ها یک عدد نسبت میدیم:

حالا حاصل ضرب نقطه‌ای تمام عدد ویژگی های یک کاربر و یک فیلم به ما یک عدد میده که توی خونه مربوط به همون کاربر و فیلم مینویسم. برای خانه‌های خالی هم فعلا عدد -۰- میذاریم(تا وقتی که وزن‌ها به صورت درستی در بیاد -از تصادفی بودن در بیاد- ).

خب همونطوری که میبینید اعدادی که بدست اومده با اعداد واقعی رای هر کاربر بسیار تفاوت داره. حالا ما بر اساس دیتای درستی که داریم و بدست آوردن اختلافش با اعدادی که حدس زده شده ۵ ویژگی که اعدادش به صورت تصادفی تولید شده بود را بهبود میدیم(در این مثال بسیار ساده با استفاده از افزونه solver نرم‌افزار اکسل اینکار انجام شده) :

خب همونطوری که مشاهده می‌کنید بعد از آپدیت شدن وزن‌های ویژگی‌ها اعداد پیش‌بینی خیلی به اعدادی که واقعا هر کاربر رای داده بود نزدیک شد.

حالا همین اگر روش با کتابخانه Keras پیاده‌سازی بشه بر روی دیتاهای بزرگ و واقعی‌تر قابل استفاده است و دقت بسیار بالایی هم داره.

___________________________________________________________________

پیاده سازی یک سیستم توصیه‌گر کتاب با استفاده از Keras

با تشکر از Tanner Gilbert و برگرفته از گیت

برای پیاده‌سازی این سیستم ابتدا دیتاست استفاده شده که از وبسایت Kaggle گرفته شده دانلود کنید.

ویژگی های موجود در دیتاست:
– book_id
– user_id
– rating
ابتدا کتابخانه‌های مورد نیاز را ایمپورت میکنیم:
 دیتاست را لود میکنیم و بعد آن را به دو قسمت داده‌های tarin و test تقسیم میکنیم.
دو متغییر n_users و n_books هم نشان‌دهنده تعداد کتاب‌ها و کاربران منحصربه‌فرد هست.( که برای ساخت embedding به درد میخوره) .

با دستور dataset.head() میتونید تعدادی از داده‌ها را مشاهده کنید.

ساخت مدل

مدلی که خواهیم داشت از اجزای اصلی زیر تشکیل میشه:

  1. Input: Input for both books and users
  2. Embedding Layers: Embeddings for books and users
  3. Dot: combines embeddings using a dot product

در یک embedding مدل ،  embeddings ها وزن‌هایی هستند که در طول training یادگرفته میشوند. برای ساده شدن کار هیچ لایه fully-connected در آخر اضافه نشده اگرچه اینکار احتمالا دقت مدلو بالا میبره.

کدهای برای ساخت مدل :

مرحله train

حالا ما برای train کردن مدل آماده‌ایم.

اول یه شرط میذاریم که اگر قبلا مدل train و ذخیره شده بود نیاز به train نیست همون مدل قبلی load بشه.

در غیراینصورت مدل train میشه.

برای ارزیابی مدل:

تست کردن پیشبینی مدل :

که همچین خروجی مشاهده می‌کنید(مثلا اولین مورد کاربر ۵ رای داده و سیستم ۴.۹۲ پیش‌بینی کرده) :

مصور کردن embedding ها

برای اینکه بتونیم این مفاهیم را مصور کنیم چون چشم ما قادر به درک بیش از ۳بعد نیست باید با استفاده از یک سری روش های کاهش دیمانسیون مثل PCA یا t-SNE پیش پردازش این‌کار را انجام بدیم.

اول یه لایه را میگیریم ( لایه -embedding- رو در book_em میگیره و وزن‌هاش در book_em_weights):

برای کاهش دیمانسیون از PCA استفاده میکنیم:

نتیجه به صورت شکل زیر نمایش داده می‌شود

همینکار با روش TSNE نیز قابل انجامه:

 

مرحله هیجان انگیز: توصیه سیستم به کاربر!

برای استفاده از سیستم کافیه یک کاربر انتخاب کنیم تا کتاب‌هایی که بیشترین احتمال اینکه کاربر دوستشون داشته باشه رو نشون بده، برای اینکار:

که خروجی این کد به صورت :

که آرایه اول نشان‌دهنده آیدی کتاب ها و آرایه دوم نشان‌دهنده میزان علاقه کاربر به کتاب هست. که از این طریق میشه مثلا ۳ کتابی که احتمال خریدش توسط کاربر بالاهست به کاربر پیشنهاد داده بشه.

با آیدی کتاب‌های بدست اومده میشه اطلاعات کامل هر کتاب را هم بدست آورد. با کد زیر:

ابتدا کل کتاب‌های دیتاست را در متغییر books میریزیم و سپس head آن را چاپ می‌کنیم. نتیجه:

برای مشاهده کتاب های توصیه شده به کاربر کد زیر را اجرا کنید

نتیجه:

البته این آموزش هرگز یک آموزش کامل و بهینه در این زمینه نبوده و فقط مثال ساده و نقطه شروعی برای یادگیری بوده است.

برای بهبود عملکرد این آموزش کارهای زیادی از جمله :

اضافه کردن لایه fully-connected

افزایش ایپاک های train

و… میشه انجام داد.