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

این پست قسمت چهارم از سری چندگانه سیستم‌های توصیه گر هست و توی این قسمت می‌خواهیم درباره نحوه‌ی پیاده سازی یک سیستم توصیه گر بر مبنا فیلترینگ مشارکتی (Collaborative Filtering) باهم صحبت کنیم.

تو قسمت اول از این سری ما درباره کلیت سیستم‌های توصیه گر صحبت کردیم و با مثال فروشگاه‌های تارگت جلو رفتیم اگر هنوز نمی دونید که سیستم‌های توصیه گر چیه بهترِ که از این پست شروع کنید.

تو قسمت دوم کمی قدم به جلو گذاشتیم و بازم کمی بحث رو تخصصی کردیم و از روش‌های موجود در این نوع سیستم‌ها گفتیم و با مثال‌هایی جلو رفتیم اگه با این نوع سیستم‌ها آشنا هستید و می دونید چی هستن و چیکار می کنن ولی روش‌های موجود تو این سیستم ها رو نمی دونید توصیه می‌کنم سری بهش بزنید.

اما تو قسمت سوم آستین‌ها مون رو بالا زدیم و یه کم کار رو عملی کردیم و باهم یه سیستمی که بر مبنای فیلترینگ بر اساس محتوا (Content Based Filtering) بود رو پیاده‌سازی کردیم که می تونست با توجه به آهنگ در حال بخش توصیه‌ی یک پلی لیست رو به کاربر انجام بده .

با این مقدمه می ریم سراغ قسمت چهارم ولی قبل از هزچیزی باید این توضیح بدم که توی این پست ما زیاد وارد جزئیات نمی شیم و روش کار رو به صورت مو به مو شرح نخواهیم داد چون هم متن طولانی میشه و هم حوصله سر بر، در انتهای این پست کدهای مربوط به این کار رو از طریق گیت هاب در اختیارتون می زارم که با بررسی اون می تونین یه سری از جزئیات رو ببینید و کاملا متوجه بشین اما نکته ی مهم تری که باید قبل از شروع بگم اینه که من برای نوشتن این کدها از مقاله‌ای که در این لینک هست کمک گرفتم و به پیاده‌سازی اون پرداختم ولی برای این پست مقاله رو کاملاً ساده کردم و بعضی از قسمت‌های اون رو حذف کردم که ساده‌تر و قابل‌فهم‌تر باشه .

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

خوب حالا بریم سروقت پیاده‌سازی کردن چیزی که می خوایم ولی قبل از هر چیزی باید اطلاعات درست‌وحسابی(به این اطلاعات درست‌وحسابی ما می گیم دیتاست ) برای انجام این کار داشته باشیم ولی سؤالی که پیش می یاد این اطلاعات رو از کجا می شه تهیه کرد..؟!

برای جواب این سؤال باید بگم با سرچ کردن عملاً همه‌چیز میشه پیدا کرد و یا میشه از سایت هایی مثل kaggle یا گوگل سرچ دیتاست کمک گرفت حتی به‌راحتی با یه سرچ فارسی می تونید کلی دیتاست پیدا کنید.

movielens
movielens

ولی دیتاستی که ما ازش استفاده می‌کنیم از سایت movielens است که در این دیتابیس ۹۴۳ کاربر وجود دارد که ۴۴۷ تای آنها بیش از ۶۰ امتیازدهی داشته‌اند. در کل این دیتابیس شامل ۱۰۰۰۰۰ امتیازدهی به ۱۶۸۲ فیلم می‌باشد که هرکدام از کاربران حداقل به ۲۰ فیلم امتیاز داده‌اند .

پیاده‌سازی این الگوریتم شامل مراحلی است که به ترتیب با توجه به این مراحل ما پیش می‌رویم

مرحله اول: تبدیل داده‌های خام

داده‌هایی که توی این دیتاست قرار دارن خام‌اند( بدین صورت که در هر سطر آیدی کاربر، آیدی فیلم، ریت کاربر و زمانی که این انتخاب انجام گرفت وجود دارد. در شکل زیر کاملا مشخص است) و ما باید این داده‌های خام رو به شکلی که برای ما قابل‌استفاده‌اند تبدیل کنیم برای این کار ما دو نوع رویکرد داریم یکی بر اساس کاربر-اقلام( user-item) که هر سطر نماینده‌ی یک کاربر هست و هر ستون برابر با ریتی هست که آن کاربر به آن فیلم داده است و رویکرد دیگری اقلام-کاربر (item_user) که ما در اینجا جای سطر و ستون تغییر می کنه در اینجا ما از رویکرد اول استفاده می‌کنیم.

داده‌های خام movielens
داده‌های خام movielens
داده‌ها بعد از تبدیل به ماتریس user_item
داده‌ها بعد از تبدیل به ماتریس user_item


مرحله‌ی دوم : تقسیم داده‌ها

بعد از این که داده‌ها رو مثل صد دانه یاقوت کنار هم قرار دادیم و از پراکندگی آن‌ها جلوگیری نمودیم حالا می ریم سراغ مرحله‌ی بعد که توی این مرحله باید داده‌ها رو به دو قسمت آموزش و آزمون تقسیم کنیم که این کار برای این‌ است که نتایجی که به‌واسطه‌ی داده‌های آموزشی به دست آوردیم رو به واسطه ی داده‌های آزمون مورد آزمایش قرار بدیم

در اینجا ما از مجموع ۹۴۳ ، ۱۸۹ تا رو برای آزمون در نظر می‌گیرم و مابقی رو برای آموزش.

مرحله‌ی سوم: خوشه‌بندی داده‌ها

حالا باید از داده‌های آموزشمان استفاده کنیم یکی از رایج‌ترین راه‌های استفاده از داده‌ها استفاده از الگوریتم‌هایی که برای خوشه‌بندی استفاده میشن که با این کار ما داده‌ها رو به خوشه‌هایی که مدنظر ماست تبدیل می‌کنیم (که در اینجا ما سه خوشه در نظر گرفتیم ) برای خوشه‌بندی ما الگوریتم Kmeans استفاده کردیم که یکی از الگوریتم‌های پراستفاده‌ی این حوضه به‌حساب می یاد و با یه سرچ ساده می تونید با نحوه‌ی عمل کرد این الگوریتم آشنا بشین .

برای پیاده‌سازی این الگوریتم ما از کتابخانه‌ی scikit-learn در پایتون استفاده نموده‌ایم و همان‌طور که در تصویر زیر می‌بینید به‌راحتی و با چند خط کد می‌توانید از آن استفاده کنید.

خوشه‌بندی با kmeans در scikit-learn
خوشه‌بندی با kmeans در scikit-learn


مرحله‌ی چهارم: پیدا کردن شباهت پیرسون و پیش‌بینی

آخرین و مهم‌ترین مرحله همین مرحله به‌حساب می‌آید. در این مرحله ما بر اساس هریکی از داده‌های آزمون و با توجه به اینکه در چه خوشه‌ای قرار می‌گیرد می‌یاییم و شباهت آن داده را با تمام داده‌های آموزشی‌ای که باهم در یک خوشه قرار دارند را محاسبه می‌کنیم برای این کار از فرمول زیر استفاده می‌کنیم .

محاسبه‌ی فرمول شباهت
محاسبه‌ی فرمول شباهت

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

فرمول پیش‌بینی ریت
فرمول پیش‌بینی ریت

در دو فرمول بالا a, b هر یک نماینده‌ی یک کاربر منحصربه‌فرد بوده و r مربوط به ریتی بوده که کاربرها داده‌اند و r بار هم میانگین ریتی که کاربر داده و p هم نماینده‌ی آیتم هست و از طرفی ما برای مقایسه‌ی این روش از روش میانگین هم برای تعیین ریت ها استفاده کردیم به این صورت که میانگین ریتی که تمام کاربران یک دسته به یک آیتم داده‌اند را به عنوان پیش‌بینی خود در نظر می‌گیریم .

تا اینجا ما با موفقیت یه سیستم توصیه گر بر مبنای فیلترینگ همکارانه رو پیاده سازی کردیم و حالا مونده بررسی این که ما به چه میزان این کار رو درست و صحیح انجام داده‌ایم برای این کار ما سه فرمول اساسی داریم که از آن‌ها کمک می‌گیریم

فرمول‌های مربوط به بررسی یک الگوریتم
فرمول‌های مربوط به بررسی یک الگوریتم

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

در این پیاده‌سازی که ما انجام داده‌ایم به ترتیب مقادیر زیر برای میانگین ریت ها و شباهت پیرسون حاصل شد.

نتایج پیاده‌سازی به درصد
نتایج پیاده‌سازی به درصد

تا اینجای کار ما تونسیتم به هدفمون برسیم البته برای بهتر کردن این درصد ها هنوز کلی راه نرفته رو باید بریم تا به نتایج بهتری برسیم ولی برای شروع فک کنم قدم مهمی رو برداشتیم

در این پست تمام تلاش خودم رو کردم که بتونم پیاده سازی یک مقاله رو به روش فیلترینگ همکارانه توضیح بدم و تا جایی که امکان داره اون رو ساده کنم و قابل درک کنم اگه بخواین ببنید که دقیقا این موارد چه طوری پیاده‌سازی شده می تونید به این ریپوزیتوری تو گیت هاب برین و اگه می تونید که این کد رو بهتر کنید خوش‌حال میشم این کار رو انجام بدین .