پیش‌بینی امتیاز فیلم‌ها

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

# مقدمه

پیش بینی میزان استقبال مردم از فیلم و میزان فروش آن، بستگی به چند عامل مختلف دارد، از جمله: کارگردان، نویسنده، بازیگران، سایر عوامل و همچنین سابقه ی قبلی آن‌ها در این عرصه، میزان استقبال و فروش فیلم‌های گذشته ی این کارگردان و بازیگران و ... . 
سایت [آی ام دی بی](http://www.imdb.com/)، دیتابیس آنلاین فیلم، سریال و بازی‌های ویدئویی در سراسر جهان است که برای هر عنوان شامل عوامل ساخت، تریلر کار، عکس، خلاصه داستان، نکات جالب و مهم، حتی اشتباهات فنی و ناخواسته و ازهمه مهم تر یک عدد بین 1 تا 10 به عنوان امتیاز است. جالب است بدانید که این سایت متعلق به شرکت [آمازون](http://www.amazon.com/) است.
اساس کار امتیازدهی این سایت به فیلم‌ها، نظرات و نمرات کاربران است. اما امتیازی که ما در صفحه هر فیلم می بینیم، دقیقاً میانگین نمرات کاربران نیست بلکه در این سایت از [میانگین وزن دار](http://en.wikipedia.org/wiki/Weighted_arithmetic_mean) استفاده می شود. 

فرمول سایت به صورت زیر است:

+ weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

که:
+ R = میانگین امتیاز برای فیلم
+ v = تعداد آراء برای فیلم
+ m = (حداقل تعداد رأی لازم برای قرارگرفتن در 250 فیلم برتر(هم اکنون 25000
+ C = (میانگین تمام امتیازات داده شده (هم اکنون 7.0  

که البته برای فیلم‌هایی که در لیست 250 فیلم برتر قرار دارند، فقط رأی‌های رأی دهندگان عادی[^regular voters] محاسبه می شود.
عدد حاصل تا یک رقم اعشار گرد می شود و این همان نمره ای است که ما می بینیم[1].
 
سایت برای هر فیلم، آمار تعداد افرادی که هر نمره ای از 1 تا 10 داده اند و همچنین تفکیک رأی دهندگان براساس سن و جنسیت و اینکه از امریکا بوده اند یا جاهای دیگر و ... را می دهد. برای دیدن این صفحه، کافی است پس از id فیلم، ratings/ را اضافه کنید. مثلا آمار زیر مربوط به این [صفحه](http://www.imdb.com/title/tt1022603/ratings) است: 
![شکل1- پراکندگی رأی دهندگان براساس نمره](https://boute.s3.amazonaws.com/177-1.PNG)
![شکل2- پراکندگی رأی دهندگان براساس سن و جنسیت و کشور](https://boute.s3.amazonaws.com/177-2.PNG)

همانطور که مشخص است، میانگین حسابی آراء این فیلم 7.85 است که به 7.9 گرد می شود ولی اگر با فرمولی که در بالا آمده حساب کنیم، 7.83 می شود که به 7.8 گرد می شود.

از آنجا که سایت آی ام دی بی یکی از معتبرترین و پربازدیدترین سایت‌ها در این زمینه است و افراد زیادی از سراسر جهان، نظرات خود را در مورد فیلم‌ها در این سایت بازتاب می دهند، و همچنین خودِ سایت هم اطلاعات کاملی درمورد هر فیلم در اختیار می گذارد، از دیتابیس این سایت به عنوان دیتا در این پروژه استفاده می شود و سایت [omdbapi](http://www.omdbapi.com/) به عنوان [API](http://en.wikipedia.org/wiki/Application_programming_interface) مورد استفاده قرار می گیرد.
هم چنین از فیلم‌های مابین سال‌های 2004 تا 2014 استفاده خواهد شد.
# کارهای انجام شده
***کارهای انجام شده:  مورد اول***
در سال 2012 یک گروه از دانشگاه استنفورد، مقاله ای با عنوان پیش بینی نمرات فیلم‌ها با استفاده از گوگل ترندز[^Predicting IMDB movie ratings using Google Trends] منتشر کردند که به تشریح آن می پردازیم:

همانطور که از عنوان پروژه مشخص است، این گروه پیش بینی خود را مبتنی بر ابزار گوگل ترندز[^google trends] انجام داده اند.

**مجموعه  داده**[^Data Set] :

1. **مجموعه داده آی ام دی بی** :
یکی از مجموعه داده‌های این گروه، دیتابیس خودِ آی ام دی بی است که اطلاعات خوب و مفیدی می دهد و از [این](http://www.omdbapi.com) API استفاده کرده اند. برای پروژه خود، 400 فیلم را مورد بررسی قرار داده اند (200 فیلم بد با نمره کمتر یا مساوی 6 و 200 فیلم خوب با نمره بیشتر از 6 ). و فیلم‌های قدیمی تر از 2004 مدنظرشان نبوده؛ چون آمارجستجوی  گوگل برای آن‌ها در دسترس نبوده است. برای هر فیلم، آن‌ها 5 مشخصه را استفاده کرده اند:
1)      عنوان فیلم
2)      نام کارگردان
3)      نام بازیگر#1
4)      نام بازیگر#2(  به ترتیب لیست بازیگران فیلم در سایت آی ام دی بی )
5)      تاریخ انتشار فیلم

2. **مجموعه داده google search frequencies** :
دو رویکرد برای سنجش میزان محبوبیت یک فیلم با این روش استفاده شده است:
1)      ترکیب آمار گوگل ترندز و گوگل اَدوُردز[^google AdWords]
2)      فقط آمار گوگل ترندز


اما لازم است توضیحی درمورد گوگل ترندز و گوگل اَدوُردز داده شود:
به طور خلاصه، **گوگل ترندز**  یکی از ابزار‌های جالب گوگل است که شما می توانید با استفاده از آن (Search Popularity Index (SPI یا شاخصِ- محبوبیت جستجوی یک کلمه یا عبارت خاص یا یک کوئری را دریک دوره زمانی و یک منطقه ی خاص به دست آورید.  این شاخص برمبنای اشتراک کوئری است، یعنی نسبت تعداد جستجو‌های کوئری موردنظر به کل تعداد کوئری‌ها در یک منطقه ی خاص در یک محدوده ی زمانی خاص.البته گوگل یک مرحله نرمال سازی دیگرهم انجام می دهد که مقدار اشتراک کوئری را بر بیشترین مقدار اشتراک کوئری در محدوده زمانی خاص تقسیم می کند و حاصل را در 100 ضرب می کند. اما گوگل برای هر کوئری این محاسبات را جداگانه حساب می کند که این واقعیت، اجازه ی مقایسه ی میزان محبوبیت دو  کوئری مختلف را باهم نمی دهد. برای حل این مشکل از ابزار گوگل اَدوُردز استفاده شده است. 

ابزار **گوگل اَدوُردز** یکی دیگر از ابزار گوگل است که کارایی زیادی برای رساندن تبلیغات به کاربران دارایِ پتانسیل دارد. اما دراین پروژه، از 
قسمت keyword tool این ابزار استفاده شده است. keyword tool میزان جستجوی یک کلمه یا عبارت را در یک منطقه ی خاص در بازه ی 12 ماه گذشته به ما می دهد. همچنین این اجازه را می دهد که ثابت نرمالسازی[^normalization constant] که در داده ی  ترندز محاسبه نمی شد، بازیابی شود. به همین خاطر در آزمایش اول-که در ادامه توضیح داده شده است-، زمان پایان تا هم اکنون است. در دو روش ترندز و AdWords ضمانت نشده است که از یک دیتابیس استفاده شود. به هرحال گروه معتقد است که با این روش، مرتبه بزرگی ثابت نرمالسازی را به خوبی تخمین زده می شود.
اما مشکل بزرگ استفاده از google AdWords keyword tool این است که keyword توسعه دهنده در دست نیست؛ چون استفاده از این ابزار و امکانات آن برای انجام کار، در دستورکار نبوده است. بنابراین نمی توان به صورت خودکار data AdWords  را جمع آوری کرد. به هرحال برای بررسی
 این رویکرد، AdWords data برای عنوان فیلم، نام کارگردان، بازیگر#1 و بازیگر#2 برای مجموعه ی 120 فیلم ( 60 فیلم خوب و 60 فیلم بد ) جمع آوری شده است.    

**استفاده  از داده‌ی ترندز در آزمایش**:
در هردو آزمایش، مشخصاتی مثل عنوان فیلم، کارگردان،  بازیگر#1 و بازیگر#2 استفاده شده است. آزمایش با فاصله زمانی ترندز کوئری[^trends query] به دو روش زیر انجام شده است:
1) از یک ماه قبل از انتشار فیلم تا هم اکنون برای آزمایش اول
2) از 8 ماه قبل از انتشار فیلم تا 4 ماه پس از انتشار برای آزمایش دوم
فاصله زمانی روش اول، روشی است که گوگل اتخاذ کرده است؛ و فاصله زمانی روش دوم، به این دلیل است که گروه معتقد است که خارج از این محدوده زمانی، اطلاعات معتبر نخواهد بود.

**آزمایش اول ( استفاده از گوگل ترندز و گوگل اَدوُردز )**:
با توجه به جمع آوری دستی اطلاعات (به دلیل استفاده از گوگل اَدوُردز ) مجموعه 120 فیلم اختیار شده است. برای اینکه نسبت $m≈20n$  ( که m تعداد نقاط درون مجموعه آزمایشی و n تعداد خصوصیات است. ) حفظ شود، یک بردار 4بعدی شامل کل جستجوهای انجام شده برای عنوان این فیلم، کارگردان، بازیگر#1 و بازیگر#2 بر محور زمان درنظر گرفته شده است؛ که زمان از یک ماه قبل از انتشار تا 4ماه پس از تاریخ انتشار فیلم محاسبه شده است.   محاسبات به صورت زیر انجام شده است:

+ A = .محاسبه می شود keyword با گرفتن یک  Google AdWords میزان جستجو در 12ماه گذشته در ایالات متحده که توسط 
+ t1 = یک ماه قبل ازتاریخ انتشار فیلم
+ t2 = ماه جاری
+  Xt = t1<t<t2 در آمریکا که  keyword برای همان ترندز داده   
+ G = ∑t Xt
و![توضیح تصویر](https://boute.s3.amazonaws.com/177-7.PNG)

**نتیجه آزمایش اول**:
هر فیلم به یکی از دو کلاس صفر و یک تخصیص داده شده است. فیلم با نمره <6 در کلاس صفر و فیلم با نمره >=6 در کلاس یک قرار می گیرد. در این آزمایش کارایی 3 الگوریتمL1-SVM, Multilayer perception, Logistic مقایسه شده است:
![توضیح تصویر](https://boute.s3.amazonaws.com/177-3.PNG)
همانطور که از اطلاعات جدول مشخص است، هر سه الگوریتم خیلی بد عمل می کنند. الگوریتم Logistic مانند پرتاب سکه هم شانس،  تقریبا 50-50 تقسیم می کند، L1-SVMتقریباً همه را در کلاس صفر قرار می دهد و Multilayer perceptron هم مانند پرتاب سکه غیرهم شانس به صورت 65-35 عمل می کند.  در واقع، این آزمایش نتیجه ی مطلوبی نداشته است.

**آزمایش دوم ( فقط استفاده از گوگل ترندز )**:
در این آزمایش از گوگل اَدوُردزگوگل اَدوُردز استفاده نشده است و فقط بر مبنای اطلاعات  گوگل ترندز پیش بینی انجام شده است. طبق نموداری که گوگل ترندز در اختیار قرار داده است، این نتیجه گرفته می شود که اوج جستجوی یک فیلم در زمان انتشار فیلم است که پیک نمودار است و تقریباً از یک هفته قبل از انتشار فیلم، جستجوها شروع به افزایش می کند ( شیب نمودار زیاد می شود. ) و همچنین حدود 4 ماه پس از انتشار فیلم، میزان جستجو دوباره خیلی کم می شود. بنابراین از آنجا که تصور می شود اطلاعات این محدوده زمانی مفید است، از یک ماه قبل از انتشار تا 4ماه پس از انتشار (محدوده زمانی 5ماهه ) برای هر فیلم مورد بررسی قرار می گیرد. سپس این بازه زمانی به دو بخش 1) یک ماه قبل از انتشار و 2) بعد از انتشار تقسیم شده است؛ که بخش دوم به 6بازه ی 2هفته ای تقسیم شده و بقیه ی زمان، بازه ی هفتم را تشکیل داده است. سپس ویژگی ای به عنوان سطح زیرمنحنی تعریف شده است و از آنجا که بخش قبل از انتشار کوچک است، به زیربازه تقسیم نشده و کلاً یک ویژگی فرض شده است. بنابراین، یک بردار با 8ویژگی برای هر query داریم. اینجا هم برای هر فیلم، 4مورد 1) عنوان فیلم 2) کارگردان 3) بازیگر#1 4) بازیگر#2 را مورد استفاده قرار می دهیم که درنتیجه $4*8=32$ ویژگی در مجموع خواهیم داشت.
![ شکل 3- نموداری که google trends برای یک فیلم دراختیار قرار داه است.](https://boute.s3.amazonaws.com/177-4.PNG)

**نتیجه آزمایش دوم**:
بر روی داده‌های این آزمایش هم همان الگوریتم‌ها اجرا شده است و نتایج زیر به دست آمده است: 
![ جدول 2- نتایج آزمایش دوم](https://boute.s3.amazonaws.com/177-5.PNG)
همانطور که مشاهده می شود، L1-SVM خیلی بهتر عمل می کند و تقریباً 72% پیش بینی درست انجام می دهد که برای فیلم خوب و بد، تقریباً به یک صورت عمل می کند. ولی MLP کمی ضعیف تر نتیجه داده است. دلیل این قضیه یه این صورت توضیح داده شده است که گاهی فیلم‌هایی در  آی ام دی بی نمره پایینی دارند، ولی جستجوی زیادی برای آن‌ها صورت گرفته است.(  مثال خودِ مقاله، فیلم هرگز نگو هرگز[^never say never] با حضور جاستین بیبر است که نمره 1.6 دارد ولی در این الگوریتم در زمره ی فیلم‌های خوب قرار گرفته است. )

اما تست‌هایی نیز روی داده‌ها انجام شده است؛ به این صورت که 8بازه ی زمانی تعریف شده به ترتیب افزایشی تست شده است ( یعنی بار اول: فقط پیش از انتشار، بار دوم: پیش از انتشار و 2هفته اول و... ) که نمودار آن در ذیل آمده است:
![شکل 4- نمودار دقت پیش بینی براساس تعداد feature‌ها](https://boute.s3.amazonaws.com/177-6.PNG)
یعنی هر بار مقدار بیشتری از سطح زیرمنحنی مورد استفاده قرار گرفته است. همانطور که مشخص است، در حالتی که فقط پیش از انتشار بررسی شود، دقت بیشتر از حالتی است که 2هفته، 4هفته و حتی 6هفته پس از انتشار را در نظر بگیریم؛ یعنی اگر فقط پیش از انتشار را بررسی کنیم، بهتر از حالتی است که کمتراز 8هفته پس از انتشار را بررسی کنیم.
همچنین در میان ویژگی‌های هرفیلم که از آی ام دی بی می گیریم، اگر فقط هریک ازعنوان، کارگردان یا بازیگر#1 به جای همه 4ویژگی مورد بررسی قرار گیرد، نتایج نزدیکی به حالت کلی می دهد؛ ولی بازیگر#2 به تنهایی، معیار خوبی نیست[2].

***کارهای انجام شده: مورد دوم***
یکی دیگر از کارهای این زمینه، با عنوان "پیش بینی موفقیت فیلم برمبنای داده‌های آی ام دی بی"[^ Predicting Movie Success Based on IMDB Data] است که توسط سه نفر از دانشجویان دانشگاه کالیکوت [^Calicut ]هندوستان انجام گرفته است. دیتای اولیه آنها از آی ام دی بی است که شامل فیلم‌های بین سال‌های 2000 تا 2012 آمریکایی است که اطلاعات آن‌ها در باکس آفیس وجود دارد که 1050 فیلم می شود. 

**بخش پیش پردازش داده :** به دلیل اینکه علاوه بر منبع اصلی یعنی آی ام دی بی، از منابع دیگر یعنی روتن تومیتو[^Rotten Tomato] و   ویکی پدیا[^Wikipedia]استفاده شده است، مشکل  فیلد گم شده پیش می آید که برای حل این مشکل، اندازه ی گرایش مرکزی برای آن ویژگی حساب شده است.( هم از میانگین وهم از میانه استفاده می کنند و سپس موارد تکراری حذف شده اند. ) 

**بخش ادغام و انتقال داده‌ها :** دراین مرحله، داده‌های مرحله ی قبل، در یک پایگاه داده جدید جمع آوری شده اند. این داده‌ها یا انتقال داده شده ویا تثبیت شده اند تا پروسه ی رگرسیون راحت‌تر و کاراتر شود. اما داده‌ها هم عددی(مانند نمره، تعداد رأی‌ها و ...) و هم غیرعددی(مانند نام کارگردان و ...) هستند درحالیکه برای رگرسیون، باید تمام داده‌ها عددی باشند. برای حل این‌مشکل، اندازه ی‌گرایش مرکزی درآمد باکس آفیس استفاده شده است.

**بخش انتخاب زیرمجموعه برای ویژگی :** دراین مرحله، میزان ارتباط ویژگی‌ها با یک ویژگیِ هدف مثلاً میزان فروش به دلار، برای انتخاب زیرمجموعه‌ی مناسب نیاز است که از روش عقبگرد حریصانه استفاده شده است. درابتدا کل مجموعه مورد استفاده قرار می گیرد که در هر مرحله، بدترین ویژگی مجموعه حذف می شود تا درنهایت تمام موارد نامرتبط حذف شده باشند.


اما سه مدل برای پیش بینی استفاده شده است:

1. **مدل رگرسیون خطی کمترین مربعات :** برای این کار، از گرادیان نزولی تصادفی استفاده شده است. اگر به هر ویژگی یک وزن داده شود، به صورت زیر محاسبه می شود:![توضیح تصویر](https://boute.s3.amazonaws.com/177-8.PNG)
	که  F‌ها ویژگی‌ها و تتا‌ها وزن‌ها هستند و  nهم تعداد ویژگی‌هاست.     
2. **مدل رگرسیون لاجستیک(منطقی) :** برای این کار، مسأله ی رگرسیون به یک مسأله ی کلاس بندی تبدیل خواهد شد که باید متغیر هدف به تعداد متناهی بازه ی هم اندازه تقسیم شود. باید یک سابقه نما از درآمد فیلم مورد نظر موجود باشد تا بازه‌های مختلفی برای پیش بینی ایجاد شود.
3. **اس وی ام :**  این روش، به دنبال تابعی است که انحرافی حداکثر برابر با Ɛ با هدف  y برای تمام مجموعه ی آزمایش داشته باشد و درعین حال، نمودار آن تا حد ممکن صاف و مستقیم باشد.  از تابع کرنل خطی برای منطبق کردن داده‌ها بر یک فضای با بُعد بالا که رگرسیون خطی اجرا می شود، استفاده شده است.

**نتایج:**
برای رگرسیون خطی، دقت 51%، برای رگرسیون لاجستیک، دقت 42.2% و برای اس وی ام  39% دقت به دست آمده است[3].


# آزمایش‌ها
تمام قسمت‌های پیاده‌سازی پروژه، در سایت گیت‌هاب[^GitHub]، از [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Movie%20Rating%20Predicting)  قابل مشاهده‎‌است.
برای فاز پیاده سازی، در ابتدا نیاز به دراختیار داشتن لیستی از فیلم‌های‌هالیوود مابین سال‌های 2004 تا 2014 بود. برای این کار، ابتدا صفحات ویکی پدیای فیلم‌های تک تک این سال‌ها، کراول[^crawl] شد ولی به دلیل اینکه این لیست خیلی با سایت آی ام دی بی سازگار نبود، لیست فیلم‌های این بازه‌ی زمانی، از خودِ سایت آی ام دی بی استخراج شد. مثلاْ صفحه مربوط به 50 فیلم‌ اول سال 2004 در [اینجا](http://www.imdb.com/search/title?at=0&sort=boxoffice_gross_us&title_type=feature&year=2004,2004) قابل مشاهده است. 
کد این قسمت در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Movie%20Rating%20Predicting/crawlFromImdb) قابل مشاهده است.
در مرحله‌ی بعد، باید اطلاعات موجود در سایت آی ام دی بی، برای تک تک فیلم‌ها استخراج می‌شد که برای این‌کار، از API که قبلاً معرفی شد، استفاده شد؛ به این صورت که کافیست به آن نام فیلم و سال اکران آن داده شود و اطلاعات فیلم به صورت رشته ی جیسون[^json] فرستاده می شود.
کد این قسمت برای بازه 2004 تا 2013 در [اینجا](https://github.com/hamidhero/AI_Project/blob/master/Movie%20Rating%20Predicting/UsingAPI_2004-2013.py) و برای سال 2014 در [اینجا](https://github.com/hamidhero/AI_Project/blob/master/Movie%20Rating%20Predicting/UsingAPI_2014only.py) قابل مشاهده است.
سپس به‌این صورت عمل شده‌است که برای تمام کارگردان‌ها و بازیگران، تمام فیلم‌هایی که در این بازه‌ زمانی در آن حضور داشته‌اند و نمرات آن‌ها به‌دست آمده‌است؛ یعنی برای هرکدام یک دیکشنری تشکیل‌شده‌است که کلید[^key] آن نام بازیگر یا کارگردان، و مقدار[^value] آن لیستی است که هر عنصر آن یک لیست دیگر است که شامل نام فیلم، نمره آی ام دی بی آن و سال انتشار آن است. سپس با توجه به نمرات فیلم‌های گذشته شخص، نمره فیلم بعدی او پیش‌بینی می‌شود. در نتیجه هرچه تعداد فیلم‌های شخص در دیتاست بیشتر باشد، نمره فیلم بعدی او دقیق‌تر خواهدبود. پس اگر تعداد فیلم‌های کمی برای یک شخص در دیتاست ثبت‌شده‌باشد، پیش‌بینی فیلم بعدی او کم‌دقت‌تر خواهدشد و همین امر باعث کاهش دقت نتایج کلی خواهدشد.
حالا که اطلاعات مورد نیاز را در دست داریم باید الگوریتمی به کار بگیریم و این داده‌ها را به آن بدهیم و نتایج به‌دست آمده را مورد بررسی قرار دهیم.
همان‌طور که در بخش کارهای انجام‌شده ذکر شد برای تخمین‌زدن نمره فیلم‌ها باید از روش رگرسیون استفاده کرد. 
در این فاز از کار برای پیش‌بینی نمره هر فیلم از کارگردان بازیگر#1 و بازیگر#2 استفاده می‌شود و سایر موارد نادیده گرفته‌ می‌شود که برای هر یک از سال‌های 2004 تا 2014 حدود 500 فیلم اول سایت آی ام دی بی به ترتیب لیست "یو اس باکس آفیس"[^US Box Office]مورد بررسی قرار گرفته‌است. درمجموع برای کارگردان‌ها و بازیگران (که در لیست بازیگران که در آی ام دی بی برای آن فیلم ثبت شده‌است اول یا دوم هستند[^یعنی ممکن است بازیگری در مدت این ۱۰ سال در فیلم‌های دیگری هم بازی کرده‌باشد ولی چون نامش در لیست بازیگران در جای اول یا دوم نیست آن فیلم برایش ثبت نشده‌باشد.])  فیلم ثبت شد.
برای این‌کار از یکی از کتاب‌خانه‌های پایتون[^Python]به نام [اِس کِی لِرن](http://scikit-learn.org/dev/index.html)  استفاده شده‌است که ابزاری برای داده‌کاوی[^Data Mining] و یادگیری ماشین[^Machine Learning]است و دراین‌جا از قسمت رگرسیون آن استفاده شده‌است[4]. 
رگرسیون دارای بخش‌های مختلفی است که یکی از آن‌ها، مدل‌های خطی عمومی[^Generalized Linear Models]است که در این پروژه از این روش‌ها استفاده شده‌است.
اما قبل از توضیح این روش‌ها بیان این نکته ضروری‎است که اطلاعاتی که به‎‌دست‌آمده‌است، کاملاً خام بوده و فقط شامل اعداد و ارقام است؛ در حالیکه در پیش‌بینی هر موضوعی، به‌خصوص موضوعاتی که براساس رأی و نظر مردم تعیین می‌شود، به عوامل بسیار زیاد دیگری بستگی دارد. به‌خصوص موضوعاتی که به سلیقه و طبع هرکس بستگی دارد. برای مثال، در میزان استقبال از یک فیلم -که موضوع کار این پروژه است- عوامل بسیاری علاوه بر سابقه ی قبلی دست‌اندرکاران فیلم -که در این پروژه درنظر گرفته‌شده‌است- دخیل هستند که چند نمونه در زیر نام برده خواهدشد:

*1. موضوع فیلم:*
 موضوع، خیلی روی میزان استقبال از یک فیلم تأثیرگذار است. ممکن است کارگردانی سابقه بسیار درخشان و خوبی داشته‌باشد و میزان استقبال از کارهای گذشته او خوب بوده‌باشد، ولی در فیلم جدیدش موضوعی را کار کرده‌باشد که برای جامعه تکراری و خسته‌کننده شده‌باشد و یا او نتوانسته‌باشد این موضوع را 
به‌ خوبی به تصویر کشیده‌باشد و درنتیجه استقبال از کار جدید او هیچ تناسبی با کارهای قبلی او نداشته‌باشد؛ البته عکس این موضوع هم می‌تواند اتفاق بیفتد و کارگردان گمنامی، با یک اثر جدید مورد اقبال مردم قراربگیرد. درمورد بازیگر هم دقیقاً همین احتمال وجود دارد.

*2. برهه زمانی نمایش فیلم:*
اینکه فیلم در چه برهه زمانی به نمایش گذاشته‌شود، یکی دیگر از فاکتورهای مهم در میزان استقبال از یک فیلم است. بارها اتفاق افتاده که -حتی در کشور خودمان- کارگردانی فیلمی با توجه به مشکلات و مسایل روز جامعه ساخته، ولی به دلایلی در آن زمان، اجازه اکران به آن فیلم داده‌نشده و بعد از مدتی -شاید چند سال- که فیلم اکران‌شده‌است، دیگر آن موضوع برای جامعه دغدغه نبوده و استقبال چندانی از آن نشده‌ و چه‌بسا مورد نقد قرارگرفته و نکوهش‌شده‌است؛ درحالیکه اگر در همان زمان اکران می‌شد، مورد استقبال قرارمی‌گرفت.

*3. تبلیغات:*
این فاکتور نیز می‌تواند هم اثر منفی و هم اثر مثبت داشته‌باشد؛ مثلاً پیرامون یک فیلم با عوامل نه‌چندان خوش‌سابقه، بنا به هر دلیلی -سیاسی و ...- تبلیغات گسترده‌ای صورت‌بگیرد و ناخودآگاه، توجه و اقبال مردم را به‌سوی آن متوجه سازد. همچنین فیلم‌های زیادی، هرچند با عوامل قوی، به دلایلی -مثل مشکلات عوامل با دولت و ...- از تبلیغات مناسب محروم شوند و خیلی از مردم، از آن بی اطلاع بمانند و درنتیجه استقبال خوبی از آن نشود.

*4. گرفتن جایزه در جشنواره:*
همانطور که واضح و آشکار است، جشنواره‌های مختلفی که در رابطه با سینما و فیلم در گوشه و کنار دنیا برگزار می‌شوند، همواره به شایسته‌ترین فیلم‌ها و افراد جایزه نمی‌دهند و هرکدام اهداف و فاکتورهای موردقبول خودشان را دارند؛ چنانکه درمورد رعایت جنبه عدالت در دادن جایزه‎‌های هرساله مراسم‌های مختلف -از جمله آکادمی اسکار[^Oscar Academy]- همواره بحث و تبادل‌نظر صورت‌می‌گیرد. اما به‌هرحال، وقتی فیلمی یا شخصی جایزه‌می‌برد، توجه همگان به آن جلب‌می‌شود و به‌خصوص در زمان کوتاهی پس از این اتفاق، استقبال مردم از آن فیلم یا شخص به‌صورت ناگهانی افزایش می‌یابد و اکثراً باعث ایجاد نمرات و نتایج غیرواقعی و کاذب می‌شود. 

همچنین عوامل دیگری هم مؤثرند که مجال بحث آن‌ها در اینجا نیست. همه این عوامل وفاکتورها از دقت تخمین‌ها که فقط براساس اعداد و ارقام خام و گذشته افراد هستند، می‌کاهد و متأسفانه این عوامل آنقدر تأثیرگذارند که دقت را تا حد زیادی دست‌خوش تغییر می‌کنند.
به همین دلیل دوباره تأکید می‌شود که در این فاز **فقط** تأثیر کارگردان، بازیگر#1 و بازیگر#2 مورد بررسی قرار گرفته‌است و سایر موارد نادیده گرفته‎شده‌است و در فاز بعدی سعی خواهدشد با روش‌هایی میزان دقت تخمین افزایش یابد.
در زیر، به توضیح روش‌ها پرداخته‌شده‌است: 
 قبل از توضیح، این نکته قابل ذکر است که برای پیاده‌سازی، روش کلی به‌ این‌صورت است که اطلاعات مربوط به فیلم‌های 2004 تا 2013 برای تخمین فیلم‌های سال 2014 استفاده‌شده‌ و سپس با مقدار واقعی آن‌ها مقایسه‌شده‌است. البته از میان حدود 500 فیلم 2014 که در دیتاست موجود بود، تنها 104 فیلم به‌این‌روش قابل تخمین‌زدن بودند؛ چراکه در سایر فیلم‌ها، برای یکی از کارگردان، بازیگر#1 ویا بازیگر#2، اطلاعاتی در دیتاست مربوط به سال‌های 2004 تا 2013 موجود نبوده‌است[^مثلاً اولین فیلم آن بازیگر به عنوان نقش اول یا دوم بوده‌است.]. همچنین میزان‌های‌مختلف تأثیر هریک از این 3 فاکتور درنظرگرفته‌شده‌است؛ در واقع، میانگین وزن‌دار این 3 فاکتور با وزن‌های مختلف برای هرکدام بررسی شده‌است؛ مثلاً یک‌بار تأثیر کارگردان پررنگ‌تر بوده و باردیگر تأثیر بازیگر#1 -البته با وزن‌های مختلف. کد نوشته‌شده برای گرفتن نتایج، و دادن ضرایب مختلف برای 3 فاکتور مورد بررسی، در [اینجا](https://github.com/hamidhero/AI_Project/blob/master/Movie%20Rating%20Predicting/query.py) قابل مشاهده‌است.   
 
**1. رگرسیون خطی کمترین مربعات:[^Ordinary Least Squares]**
‫‬در این روش سعی بر کمینه‌کردن مقدار خطا با تقریب خطی خطاست که فرمول ریاضی آن به صورت زیر است:
![روش کمترین مربعات](https://boute.s3.amazonaws.com/177-OrdinaryLeastSquares.JPG)

این روش، مورد آزمایش و پیاده‌سازی قرارنگرفت؛ چرا که قطعاً روش‌های بعدی بهتر عمل خواهند کرد و فقط به این دلیل که  این روش پایه‌ای برای روش‌های بعدی است بیان شد.

**2. رگرسیون ریج:[^Ridge Regression]**
این روش به نوعی بهبودیافته روش رگرسیون خطی کمترین مربعات است و فقط یک ترم به آن اضافه می‌شود و ضریبی به نام آلفا دارد که متغیر پیچیدگی گفته‌می‌شود. هرچه آلفا بزرگتر باشد میزان همبستگی بیشتر می‌شود. فرمول ریاضی آن به صورت زیر است:
![فرمول روش ریج](https://boute.s3.amazonaws.com/177-RidgeFormula.JPG)
![تصویر روش ریج](https://boute.s3.amazonaws.com/177-RidgeFigure.JPG)
 
این روش با آلفاهای مختلف (شامل 0.1، 0.3، 0.5، 0.7و 0.9)  و وزن‌های مختلف برای 3 فاکتور مورد بررسی، پیاده‌سازی شده‌است که بهترین نتیجه آن برای حالت زیر به‌دست‌آمد:
  *آلفا = 0.9*
  *وزن کارگردان =  0.3*
  *وزن بازیگر#1 = 0.4*
  *وزن بازیگر#2 = 0.3*
  *میزان میانگین خطای‌نسبی = 11.5141133096 % *
  برای نمونه، شرح نتایج بالا به این صورت است:
  ![1](https://boute.s3.amazonaws.com/177-1.JPG)
  ![2](https://boute.s3.amazonaws.com/177-2.JPG)
![3](https://boute.s3.amazonaws.com/177-3.JPG)
![4](https://boute.s3.amazonaws.com/177-4.JPG)

کد پیاده‌سازی و تمام نتایج آزمایشات این روش، در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Movie%20Rating%20Predicting/results/Ridge) قابل مشاهده‌است.
  
**3. رگرسیون لاسو:[^Lasso Regression]**
این روش به‌خاطر فرمول خاص خود ضرایب همبستگی پراکنده را بهتر تخمین می‌زند و همچنین داده‌ها با تعداد کم را بهتر بررسی می‌کند. فرمول آن در زیر آمده‌است:


![روش لاسو](https://boute.s3.amazonaws.com/177-LassoFormula.JPG)

این روش هم با آلفاهای مختلف (شامل 0.1، 0.3، 0.5، 0.7و 0.9)  و وزن‌های مختلف برای 3 فاکتور مورد بررسی، پیاده‌سازی شده‌است که بهترین نتیجه آن برای حالت زیر به‌دست‌آمد:
*آلفا = 0.9*
*وزن کارگردان = 0.6*  
*وزن بازیگر#1 = 0.3*  
*وزن بازیگر#2 = 0.1*   
*میزان میانگین خطای‌نسبی = 10.7591749291 % *

کد پیاده‌سازی و تمام نتایج آزمایشات این روش، در[اینجا](https://github.com/hamidhero/AI_Project/tree/master/Movie%20Rating%20Predicting/results/Lasso) قابل مشاهده‌است.

**4. شبکه الِاستیک:[^Elastic Net]**
این رگرسیون سعی بر ادغام هر دو روش ریج و لاسو دارد و زمانی بهتر عمل می‌کند که داده‌ها تعداد زیادی ویژگی همبسته به‌هم دارند. تابع هدف آن در زیر آمده‌است:
![روش شبکه الاستیک](https://boute.s3.amazonaws.com/177-ElasticNet.JPG)

این روش نیز با آلفاهای مختلف (شامل 0.1، 0.3، 0.5، 0.7و 0.9)  و وزن‌های مختلف برای 3 فاکتور مورد بررسی، پیاده‌سازی شده‌است که بهترین نتیجه آن برای حالت زیر به‌دست‌آمد:
*آلفا = 0.9*
*وزن کارگردان = 0.6*
*وزن بازیگر#1 = 0.3*
*وزن بازیگر#2 = 0.1*
*میزان میانگین خطای‌نسبی = 11.0076593189 %*

کد پیاده‌سازی و تمام نتایج آزمایشات این روش، در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Movie%20Rating%20Predicting/results/ElasticNet) قابل مشاهده‌است.

با توجه به اجرای این 3 الگوریتم روی دیتاست موجود، مشاهده‌می‌شود که برای هرسه، آلفا = 0.9 بهترین نتیجه را داشته‌است؛ و همچنین در دو مورد از سه مورد، کارگردان با ضریب (وزن) 0.6 بهترین نتیجه را رقم زده‌است. پس میتوان درمجموع، کارگردان را مهم‌ترین عامل دانست.
همچنین روش لاسو دربین سه روش بهترین نتیجه را داده‌است؛ چراکه میانگین تمام خطاهای نسبی برای روش‌ها به ترتیب به‌صورت زیر به‌دست آمد:
1. لاسو = 11.43%
2. شبکه الاستیک = 11.60%
3. ریج = 12.14%

همان‌طور که ذکر شد، تأثیر عوامل دیگر روی تخمین زیاد است و این، میزان دقت تخمین را پایین می‌آورد. در فاز بعدی سعی بر این خواهدبود که میزان خطا کاهش یابد.

# تکمیل پیاده‌سازی و بهبود نتایج
تمام پیاده‌سازی‌های این قسمت‌ در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Final%20Phase) قابل مشاهده‌است.
در قسمت‌ قبل توضیح داده‌شد که برای پیش‌بینی نمرات فیلم‌ها فقط از کارگردان و بازیگران نقش اول و دوم استفاده‌شد. در این فاز بنابراین شد که دقت پیش‌بینی نسبت به فاز قبل افزایش یابد. یکی از روش‌هایی که در راستای دستیابی به این هدف می‌تواند به‌کارگرفته‌شود افزایش تعداد آیتم‌های دخیل در نمره یک فیلم در محاسبات مربوط به نمره ی آن است. در این فاز برای انجام این کار دو آیتم بازیگر#3 و نویسنده به آیتم‌های قبلی اضافه‌شده‌است.
برای آزمایش‌کردن روش با این داده‌های اضافی جدید باز هم از مجموعه فیلم‌های سال 2014 استفاده می‌شود. اما به دلیل اینکه نویسنده ی یک فیلم ممکن است در بین سال‌های 2004 تا 2013 سابقه‌ای نداشته‌باشد تعداد فیلم‌هایی که در این فاز قابل پیش‌بینی هستند کاهش یافته‌ و به 47 فیلم رسیده‌است.
در این فاز هم از سه روش رگرسیون که در فاز قبل استفاده‌شد (یعنی ریج، لاسو و شبکه الاستیک) استفاده می‌شود و آلفاهای 0.5، 0.7 و 0.9 برای آن‌ها استفاده‌شد و برای 5 آیتم دخیل -کارگردان، بازیگر#1، بازیگر#2، بازیگر#3 و نویسنده- وزن‌های مختلفی آزمایش شد.
در رگرسیون ریج که نتایج آن، در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Final%20Phase/results/Ridge) قابل مشاهده‌است، بهترین حالت به صورت زیر است:
*آلفا = 0.9*
*وزن کارگردان =0.15*
*وزن بازیگر#1 = 0.45*
*وزن بازیگر#2 = 0.25*
*وزن بازیگر#3 = 0.05*
*وزن نویسنده = 0.1*
*میزان میانگین خطای‌نسبی = 10.0405941966 %*

در رگرسیون لاسو که نتایج آن، در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Final%20Phase/results/Lasso) قابل مشاهده‌است، بهترین حالت به صورت زیر است:
*آلفا = 0.9* 
*وزن کارگردان =0.3* 
*وزن بازیگر#1 = 0.4* 
*وزن بازیگر#2 = 0.2* 
*وزن بازیگر#3 = 0.05* 
*وزن نویسنده = 0.05* 
*میزان میانگین خطای‌نسبی = 9.48966260931 %*

در رگرسیون شبکه الاستیک که نتایج آن، در [اینجا](https://github.com/hamidhero/AI_Project/tree/master/Final%20Phase/results/ElasticNet) قابل مشاهده‌است، بهترین حالت به صورت زیر است: 
*آلفا = 0.7* 
*وزن کارگردان =0.3* 
*وزن بازیگر#1 = 0.45*  
*وزن بازیگر#2 = 0.1*  
*وزن بازیگر#3 = 0.05*  
*وزن نویسنده = 0.1*  
 *میزان میانگین خطای‌نسبی = 9.54131895558 %*

در این فاز با توجه به بهترین نتیجه برای هریک از سه روش، به نظر می‌رسد بازیگر#1 مهم‌ترین و بیشترین نقش را دارد و درمورد آلفا، باز هم آلفاهای نزدیک‌تر به یک (در این حالت دو مورد آلفا = 0.9 و یک مورد آلفا = 0.7) نتایج بهتری می‌دهد.

همچنین در این حالت هم روش رگرسیون لاسو بهترین نتایج را داراست؛ چراکه میانگین تمام خطاهای نسبی برای روش‌ها به ترتیب به‌صورت زیر به‌دست آمد:
1. لاسو = 10.87% 
2. شبکه الاستیک = 10.95% 
3. ریج = 11.37% 
که رگرسیون لاسو کمترین خطا را داراست و بعد از آن شبکه الاستیک و در انتها هم طبق انتظار رگرسیون ریج قرار دارد.

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

# مراجع

1. http://www.imdb.com/chart/top?ref_=nb_mv_3_chttp as visited on 13 May 2015
2. Predicting IMDb Movie Rating Using Google Trends, By Deniz Demir, Olga Kapralova, Hongze Lai, Stanford University, 2012   [لینک](https://www.google.com/url?q=http://cs229.stanford.edu/proj2012/DemirKapralovaLai-PredictingImdbMovieRatingsUsingGoogleTrends.pdf&sa=U&ei=yzwJVai1O6_ksATjn4GQDA&ved=0CAYQFjAA&client=internal-uds-cse&usg=AFQjCNE2JiMqzoA3BiFbPC0Q_ig98tJKvA)
3. Predicting Movie Success Based on IMDB Data,By Nithin VR, Pranav M, Sarath Babu PB, Lijiya A, Department of CSE, National Institute of Technology, Calicut, 2014   [لینک](http://www.ijdmta.com/papers/vol3issue1/ijdmta/paper10.pdf)
4. http://scikit-learn.org/stable/modules/linear_model.html as visited on 16 May 2015