ساخت سیستم توصیه گر (Recommender System) فیلم با پایتون — راهنمای جامع و ساده
تماشای فیلمهای سینمایی و سریالهای تلویزیونی از جمله علاقمندیهای بسیاری از افراد است. ولیکن، بحث انتخاب فیلم محبوب برای هر شخصی، بسیار وابسته به علایق فردی او است. برای مثال، ممکن است فردی از دیدن فیلم «سرنوشت شگفتانگیز آملی پولن» (Amélie) لذت ببرد. اما آیا این مساله به خاطر موسیقی فیلم است؟ از ماهیت هنری فیلم نشات میگیرد؟ به دلیل نقشآفرینی «اودره ژوستن توتو» (Audrey Justine Tautou) در این فیلم است؟ و یا همه گزینههای بالا؟ به همان میزان که ممکن است سلیقه هر فرد در انتخاب فیلم بیهمتا و غیر قابل پیشبینی باشد، احتمال دارد که کسی دیگر در جهان سلیقهای بسیار مشابه با او داشته باشد.
این دقیقا همان ایده نهفته در پس «توصیهگرهای پالایش گروهی» (Collaborative Filtering Recommenders) است. پالایش گروهی روشی برای توصیه فیلم به کاربر بر مبنای یافتن دیگر کاربران با سلایق مشابه است. با بهرهگیری از این روش میتوان کاربران با سلیقه مشابه را بر پایه فیلمی که هر دو دیدهاند و به طور مشابه به آن امتیازدهی کردهاند یافت.
هدف از این مطلب تشریح موارد زیر است:
- چگونه میتوان یک سیستم توصیهگر فیلم برای یک کاربر یکتا ساخت.
- راهکار موجود برای توصیه فیلم به دو کاربر که تمایل دارند همراه با یکدیگر به مشاهده فیلم بپردازند.
بسیاری از مواقع افراد با عزیزان خود به تماشای فیلم مینشینند و بنابراین برای انتخاب فیلم (و دانلود آن از اینترنت یا انتخاب از میان آنچه در حال حاضر دانلود کرده و روی هارد خود دارند!) به گفتوگو میپردازند و دچار چالشی در انتخاب هستند. از همین رو، هدف شماره دو بیان شده برای این مطلب، یافتن راهکاری برای غلبه بر این مشکل است، تا هر دو فرد بتوانند از فیلم انتخاب شده برای تماشا رضایت داشته باشند.
توصیف دادهها
برای سیستم توصیهگر معرفی شده در این مطلب از مجموعه داده «MovieLens 20M ratings» استفاده شده است. این مجموعه داده شامل ۲۰ میلیون امتیازدهی برای ۲۷۰۰۰ فیلم مختلف توسط ۱۳۸۰۰۰ کاربر است. دادهها متعلق به ۹ ژانویه ۱۹۹۵ الی ۳۱ مارس ۲۰۱۵ هستند.
بنابراین هیچ فیلمی با تاریخ انتشار پس از ۳۱ مارس ۲۰۱۵ در آن وجود ندارد. دادههای امتیاز از مقیاس ۰.۵ تا ۵.۰ هستند. هر کاربر در این مجموعه داده حداقل به ۲۰ فیلم گوناگون امتیاز داده است. در پروژه مورد بررسی در این مطلب دو فایل داده «Ratings» و «Movies» به کار رفته است. این دادهها در «دیتافریم» (DataFrame) کتابخانه «pandas» پایتون خوانده میشوند. اسکرینشاتهای این دو دیتافریم در زیر ارائه شدهاند:
یک جنبه مهم از دادهها این حقیقت است که دادههای امتیازدهی بسیار «خلوت» (Sparse) هستند. این امر بدین دلیل به وقوع میپیوندد که ۲۷۰۰۰ فیلم وجود دارد ولی هر کاربر تنها به بخش کوچکی از فیلمها امتیاز داده است. بنابراین، اگر یک ماتریس کامل با ۱۳۸۰۰۰ سطر مربوط به کاربران ساخته شود و ۲۷۰۰۰ ستون مربوط به فیلمها وجود داشته باشد، بیشتر مقادیر «NaN» (سرنامی برای Not a Number) هستند. به دلیل این خلوتی، از «بسته» (package) «ماتریس خلوت» (Sparse matrices) کتابخانه SciPy برای مدیریت این دادهها استفاده خواهد شد که در ادامه با جزئیات بیشتری تشریح میشود.
ساخت سیستم توصیهگر فیلم
برای ساخت یک سیستم توصیهگر پالایش گروهی، از یک کلاس عمومی از الگوریتمی که «تجزیه ماتریس امتیاز پایین» (Low Rank Matrix Factorization) نامیده میشود، استفاده شده است. به طور خاص، از «تجزیه مقدارهای منفرد» (Singular Value Decomposition | SVD) برای کاهش ماتریس Ratings با تعداد زیادی از ویژگیها به یک ویژگی با زیرمجموعه کوچکتری از ویژگیها که امکان تخمین زدن ماتریس اصلی را فراهم میکند استفاده شده است.
سپس، گامهای زیر برای ساخت یک سیستم توصیهگر مبتنی بر پالایش گروهی مورد استفاده قرار گرفته:
- پالایش فیلمهای دارای امتیاز کمتر از ۱۰
- ساخت یک ستون movie_index که امکان نگاشت movieId به یک movie_index یکتا را میدهد.
- جداسازی دادههای آموزش و تست در دادههای Ratings
- نرمالسازی میانگین پیاده شده توسط فیلم
- استفاده از بسته «sparse matrix» کتابخانه SciPy در پایتون برای ساخت یک ماتریس خلوت که شاخصهای آن مربوط به userId و movie_index و دادهها مربوط به دادههای امتیازدهی نرمالشده میانگین هستند.
- اجرای SVD با استفاده از متد «svds» در کتابخانه SciPy
- تولید ماتریس امتیازهای پیشبینی شده ? با محاسبه ? = ?·Σ·?ᵀ که در آن ? ماتریس ویژگیهای کاربران، Σ ماتریسی که در آن مقادیر مورب مقادیر منفرد هستند و V ماتریس ویژگیهای فیلم است.
- افزودن مولفه نرمالسازی میانگین فیلم به امتیازهای پیشبینی شده.
- مرتبسازی Nهای پیشبینی شده برتر و پرینت لیست فیلمهای حاصل شده.
تنظیمات مدل با استفاده از دادههای آموزش انجام شده است. یکی از پارامترهای آزاد برای SVD، تعداد مولفههای K محسوب میشود، که مربوط به تعداد مقادیر منفرد است. پس از ساخت مدل با مقدار منتخب K، یک امتیاز پیشبینی شده برای مجموعه دادههای تست محاسبه میشود. این کار با تحلیل خطا به وسیله محاسبه «میانگین مطلق خطا» (MAE) و «خطای جذر میانگین ریشه» (Root Mean Square Error | RMSE) براساس دادههای Ratings واقعی صورت میپذیرد. مقدار K که منجر به کمترین خطا میشود، در ادامه برای ساخت مدل سیستم توصیهگر نهایی مورد استفاده قرار میگیرد.
همانطور که پیش از این اشاره شد، هدف نهایی این پروژه ساخت یک سیستم توصیهگر برای دو کاربر است که علاقمند به تماشای فیلم با یکدیگر هستند. بر اساس این مقاله (+) دو راه کلی برای انجام این کار وجود دارد. راه اول ساخت شِبه کاربری است که ذائقه هر دو کاربر را از خود نشان میدهد. به منظور پیادهسازی این روش، رتبههای هر کاربر باید پیش از اجرای SVD ادغام شوند. رویکرد دیگر تولید یک لیست توصیه مجزا برای هر یک از اعضاس گروه و ادغام این لیستها با یکدیگر به صورت «اَد هاک» (ad-hoc) است. در اینجا از استراتژی دوم برای ساخت سیستم توصیهگر استفاده شده.
در روشی که در آن نیاز به ادغام دو لیست است، نیاز به کارهای دیگری نیز هست. اگر میانگین دو ratings پیشبینی شده محاسبه شود، دیگر برای فیلمهایی که امتیاز پیشبینی آنها بین دو گروه کاربران متفاوت است محاسبه نمیشود. این موضوع در مثال جدول زیر نمایش داده شده است: امتیازهای پیشبینی شده برای User1 و User2 برای دو فیلم «پی» (Pi) و «ذهن زیبا» (A Beautiful Mind) ارائه شده.
برای فیلم پی نسبت به ذهن زیبا، اختلاف زیادی بین امتیازهای پیشبینی شده برای User1 و User2 وجود دارد، هرچند که امتیاز میانگین مشابه است. این یک مشکل قابل توجه محسوب میشود، زیرا امکان دارد فیلمی که یک کاربر آن را دوست ندارد و کاربر دیگر آن را خیلی دوست دارد به آنها پیشنهاد شود. بنابراین، این روش هدف اصلی سیستم را که بیشینهسازی خوشحالی کلی گروه است برآورده نمیکند. راهکار این مساله ساخت تابع امتیازدهی گروهی یکتای ویژه همین مطلب است که در زیر نحوه ایجاد آن تشریح شده.
تابع امتیازدهی گروهی به صورت زیر تعریف شده است:
که در آن R1 و R2 به ترتیب امتیازهای پیشبینی شده برای یک فیلم مشخص برای User1 و User2 هستند و Rg امتیاز گروهی است. این تابع امتیازدهی گروهی، میانگین امتیاز پیشبینی شده منهای دوره پنالتی که متناسب با تفاوت دو امتیاز منفرد است را محاسبه میکند. هدف دوره پنالتی دادن وزن بیشتر به فیلمهایی است که دارای امتیاز پیشبینی شده مشابه بیشتری هستند. در مثال زده شده درباره دو فیلم ذهن زیبا و پی، مقدار محاسبه شده برای پی Rg=3.6 و برای ذهن زیبا با امتیاز کلی بهتر برابر با Rg=3.92 است. از این رو، بر اساس این نتایج، اطمینان بیشتری از خوشحالی گروهی کلی برای تماشای فیلم ذهن زیبا نسبت به پی وجود دارد.
نتایج
نتایج حاصل از تنظیم مدل در جدول زیر نمایش داده شدهاند. مشاهده میشود که مقدار k=15 موجب افزایش پایینترین مقادیر MAE و RMSE میشود. این مقدار با نتایج این مرجع (+) برابری دارد.
نتایج یک کاربر
اکنون، خروجیهای نمونه سیستم توصیهگر فیلم آموزش داده شده برای یک کار نمایش داده میشوند. در این مورد، UserId 9 امتیاز بالایی به فیلمی داده است که میتواند به عنوان «دلهرهآور» (Thriller) یا «جنایی» (Crime) در نظر گرفته شود. برای این مورد، فیلمهای برتر پیشنهاد شده نیز در همین ژانر بودهاند. بنابراین، به نظر میرسد توصیهگر فیلم استاندارد ساخته شده کار خود را به خوبی انجام میدهد.
A subset of original ratings provided for UserId: 9 Rated 5.0 for movie What Lies Beneath (2000) Rated 3.0 for movie General's Daughter, The (1999) Rated 2.0 for movie Entrapment (1999) Rated 3.0 for movie Austin Powers: The Spy Who Shagged Me (1999) Rated 3.0 for movie Return of the Living Dead, The (1985) Rated 3.0 for movie Psycho (1960) Rated 3.0 for movie Stigmata (1999) Rated 4.0 for movie American Pie (1999) Rated 2.0 for movie Vertical Limit (2000) Rated 1.0 for movie Traffic (2000) Rated 2.0 for movie Deep Blue Sea (1999) Rated 4.0 for movie Fast and the Furious, The (2001) Rated 4.0 for movie Cast Away (2000) Rated 2.0 for movie Scary Movie (2000) Rated 5.0 for movie Hannibal (2001) Rated 2.0 for movie Creepshow (1982) Rated 2.0 for movie Urban Legends: Final Cut (2000) Rated 5.0 for movie Fight Club (1999) Rated 5.0 for movie Exorcist, The (1973) Rated 4.0 for movie There's Something About Mary (1998) Top recommendations for UserId: 9 Predicting rating 5.0 for movie Shawshank Redemption, The (1994) Predicting rating 5.0 for movie Silence of the Lambs, The (1991) Predicting rating 4.9 for movie Pulp Fiction (1994) Predicting rating 4.9 for movie Braveheart (1995) Predicting rating 4.8 for movie Schindler's List (1993) Predicting rating 4.7 for movie Usual Suspects, The (1995) Predicting rating 4.6 for movie Seven (a.k.a. Se7en) (1995) Predicting rating 4.6 for movie Zero Motivation (Efes beyahasei enosh) (2014) Predicting rating 4.5 for movie Fugitive, The (1993) Predicting rating 4.5 for movie Terminator 2: Judgment Day (1991) Predicting rating 4.5 for movie Godfather: Part II, The (1974) Predicting rating 4.4 for movie Saving Private Ryan (1998) Predicting rating 4.4 for movie Dances with Wolves (1990) Predicting rating 4.4 for movie Matrix, The (1999) Predicting rating 4.4 for movie American Beauty (1999) Predicting rating 4.4 for movie One Flew Over the Cuckoo's Nest (1975) Predicting rating 4.4 for movie Goodfellas (1990) Predicting rating 4.3 for movie Apollo 13 (1995) Predicting rating 4.3 for movie Raiders of the Lost Ark (Indiana Jones and the Raiders of the Lost Ark) (1981) Predicting rating 4.3 for movie American History X (1998)
نتایج ترکیب شده کاربران
پیش از این، نتایج سیستم توصیهگر برای دو کاربر در زیر نمایش داده شده است. توصیههای ترکیب شده تابع امتیازدهی گروهی که پیشتر تشریح شد را به کار میگیرند. نتایج توصیهگر گروهی ساخته شده دلگرم کننده است، زیرا بر اساس نظرسنجی انجام شده از این دو کاربر فیلمهایی که به آنها توصیه شده بود مورد علاقه هر دو واقع شده و آن دو توانستهاند زمان خوبی را با یکدیگر سپری کنند.
A subset of original ratings provided for UserId: 138494 Rated 4.5 for movie Like Water for Chocolate (Como agua para chocolate) (1992) Rated 4.0 for movie Mr. Holland's Opus (1995) Rated 4.0 for movie Sense and Sensibility (1995) Rated 2.0 for movie Fargo (1996) Rated 4.0 for movie Pi (1998) Rated 4.5 for movie Garden State (2004) Rated 4.0 for movie What's Eating Gilbert Grape (1993) Rated 1.0 for movie Lemony Snicket's A Series of Unfortunate Events (2004) Rated 4.0 for movie Apollo 13 (1995) Rated 4.5 for movie Buffalo '66 (a.k.a. Buffalo 66) (1998) Rated 4.5 for movie Mission, The (1986) Rated 4.5 for movie River Runs Through It, A (1992) Rated 5.0 for movie Spanish Apartment, The (L'auberge espagnole) (2002) Rated 5.0 for movie Willy Wonka & the Chocolate Factory (1971) Rated 3.0 for movie Sideways (2004) Rated 5.0 for movie Amelie (Fabuleux destin d'Amélie Poulain, Le) (2001) Rated 4.0 for movie Bend It Like Beckham (2002) Rated 1.0 for movie Dumb & Dumber (Dumb and Dumber) (1994) Rated 4.0 for movie Dead Poets Society (1989) Rated 4.0 for movie O Brother, Where Art Thou? (2000) A subset of original ratings provided for UserId: 138495 Rated 1.0 for movie Indiana Jones and the Kingdom of the Crystal Skull (2008) Rated 4.5 for movie Mephisto (1981) Rated 5.0 for movie Life Is Beautiful (La Vita è bella) (1997) Rated 3.5 for movie Out of Africa (1985) Rated 4.0 for movie Sense and Sensibility (1995) Rated 4.5 for movie Virgin Suicides, The (1999) Rated 1.0 for movie Dumb & Dumber (Dumb and Dumber) (1994) Rated 4.0 for movie Three Colors: Blue (Trois couleurs: Bleu) (1993) Rated 1.0 for movie Star Trek: Insurrection (1998) Rated 4.5 for movie Postman, The (Postino, Il) (1994) Rated 4.0 for movie Steel Magnolias (1989) Rated 4.0 for movie Gattaca (1997) Rated 2.5 for movie Dangerous Minds (1995) Rated 3.5 for movie Seven (a.k.a. Se7en) (1995) Rated 0.5 for movie Terminator 2: Judgment Day (1991) Rated 2.5 for movie Driving Miss Daisy (1989) Rated 0.5 for movie Home Alone (1990) Rated 4.0 for movie Love Actually (2003) Rated 4.0 for movie Leaving Las Vegas (1995) Rated 5.0 for movie Cinema Paradiso (Nuovo cinema Paradiso) (1989) Top combinded recommendations for UserIds: 138494 and 138495 Predicting rating 4.5 for movie Zero Motivation (Efes beyahasei enosh) (2014) Predicting rating 4.5 for movie Shawshank Redemption, The (1994) Predicting rating 4.5 for movie Fight Club (1999) Predicting rating 4.4 for movie Forrest Gump (1994) Predicting rating 4.3 for movie Usual Suspects, The (1995) Predicting rating 4.3 for movie Matrix, The (1999) Predicting rating 4.3 for movie Schindler's List (1993) Predicting rating 4.3 for movie American Beauty (1999) Predicting rating 4.3 for movie Memento (2000) Predicting rating 4.3 for movie Death on the Staircase (Soupçons) (2004) Predicting rating 4.3 for movie City of God (Cidade de Deus) (2002) Predicting rating 4.3 for movie Star Wars: Episode V - The Empire Strikes Back (1980) Predicting rating 4.3 for movie Seven Samurai (Shichinin no samurai) (1954) Predicting rating 4.3 for movie Spirited Away (Sen to Chihiro no kamikakushi) (2001) Predicting rating 4.3 for movie Dark Knight, The (2008) Predicting rating 4.3 for movie Princess Bride, The (1987) Predicting rating 4.3 for movie O Auto da Compadecida (Dog's Will, A) (2000) Predicting rating 4.3 for movie Band of Brothers (2001) Predicting rating 4.3 for movie Rear Window (1954) Predicting rating 4.3 for movie One Flew Over the Cuckoo's Nest (1975)
نتیجهگیری
در این مطلب، چگونگی ساخت یک سیستم توصیهگر با اعمال SVD روی مجموعه داده MovieLens 20M ratings و چگونگی ارائه توصیه برای گروههای دو نفرهای که قصد تماشای فیلم با یکدیگر را دارند توضیح داده شد. البته راهکارهای بسیار زیادی برای ساخت سیستمهای توصیهگر وجود دارد. با تخصیص زمان بیشتر، میتوان از الگوریتمهای پیچیدهتر و پیشرفتهتری نسبت به SVD استفاده کرد.
برای مثال، تیمی که در مسابقات Netflix برنده شدند، الگوریتم پالایش گروهی را ساخته بودند که میتوانست سوگیریهای کاربر و فیلم را بهتر از مدل ارائه شده در این مطلب، ثبت کند. بنابراین، اگر یک فیلم مشخصی دارای امتیازی بالاتر از میانگین باشد، به تنهایی نمیتواند به طور کامل بر الگوریتم توصیهگر غالب شود. در این مطلب، محاسبه این موضوع با پیادهسازی نرمالسازی میانگین دادههای امتیازدهی فیلمها انجام شد ولیکن برندگان مسابقه Netflix از رویکرد پیشرفتهتری برای این کار بهره بردند که خروجی بسیار بهتری داشت.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای هوش محاسباتی
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
^^