پیش‌بینی قیمت املاک

تغییرات پروژه از تاریخ 1396/10/07 تا تاریخ 1396/11/11
اگر تجربه جستجو برای خرید و یا اجاره خانه در شهر را داشته باشید، متوجه می‌شوید علاوه پارامترهای ساده‌ای از قبیل متراژ ومحله ، پارامترهای زیادی هستند که در قیمت خانه‌ها تاثیر می‌گذارند، مثلا سال ساخت، تعداد اتاق‌ها و یا حتی این که در چه طبقه‌ای باشد، بر قیمت خانه تاثیرگذار است. در واقع فروشنده‌های حرفه‌ای واحدهای مسکونی بر مبنای همین پارامترها بر روی املاک قیمت‌گذاری می‌کنند.
پس می‌توان از یک کامپیوتر هم انتظار داشت که اگر دانش مربوط به تاثیر پارامترها در قیمت مسکن را آموزش ببیند، همانند یک دلال حرفه‌ای مسکن بتواند قیمت دقیق واحدهای مسکونی را پیش‌بینی کند.
در این پروژه شما باید با استفاده از مجموعه داده‌های موجود در [این مسابقه](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)، بتوانید سامانه‌ای برای پیش‌بینی قیمت مسکن آموزش دهید.

# مقدمه

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

قیمت املاک به شاخص ها و متغیرهای فراوانی مانند متراژ، منطقه، سطح فرهنگی و اقتصادی جامعه و ... بستگی دارد. تشخیص و پیش بینی آن با توجه به همه این عناوین کار ساده ای نیست و به سالها تجربه و کار در این زمینه نیاز دارد. نیاز به بیان نیست که توانایی پیش بینی در این عرصه چقدر می‌تواند ارزشمند باشد.
در اینجا روش هایی را مطرح، نقد و بررسی می‌کنیم و می گوییم که چگونه می‌توان توسط آنها این تجربه‌ی گران بها را با استفاده از "یادگیری ماشین"  یا "machine learning" به کامپیوتر منتقل کرد.

# کارهای مرتبط
حل مسئله‌های پیش بینی با یادگیری ماشین و عموماً مسائلی که در آن داد های قبلی وجود دارد که ماشین توسط آن داده قبلی ردیف های بعدی را پیش بینی می کند معمولا با الگوریتم های **پسرفتی** یا **regression** انجام می گیرد.

**پسرفتی یا regression چیست؟!**
در الگوریتم های regression ماشین داده های قبلی را تحلیل کرده و توسط آن مدلی می‌سازد و الگو را یاد می گیرد، سپس توسط آن مدل با احتمال خوبی داده های بعدی را پیش بینی می کند. به طور ساده regression یک ابزاری یادگیری ماشین است که کمک میکنند با یادگیری روابط بین متغیر هدف (خروجی) و متغیرهای دیگر (ورودی) - که از داده های آماری قبلی به دست آمده - ‌ پیش‌بینی‌کنیم.
با این تعریف متغیر هدف ما که قیمت مثلا یک خانه است به متغیرهای دیگری همچون تعداد اتاق ها، متراژ، همسایگی آن خانه، منطقه و ... بستگی دارد. اگر ما یادگیری ماشین را به این متغیر ها اعمال کنیم می‌توانیم ارزش یک خانه را در یک منطقه جغرافیایی مشخص محاسبه کنیم.
عملکرد پسرفت ساده است : توسط داده های قبلی کافی رابطه بین متغیر هدف و متغیرهای دیگر را پیدا کرده و این رابطه را در داده های مشاهده شده واقعی اعمال می کنیم.
برای اینکه نشان بدهیم پسرفت چگونه کار می کنند مثالی ساده می زنیم :
در محاسبه قیمت یک ملک (متغیر هدف) فقط یک متغیر را در نظر می گیریم و آن هم مساحت آن خانه است (متغیر های دیگر).منطقی است که قیمت خانه ها رابطه‌ی خطی با مساحت  دارند. پس :
y = k0 + k1 * x
که در آن y قیمت ملک و x مساحت آن است.
حال کافیست با استفاده از الگوریتم های regression ضرایب k0 و k1 را بدیت بیاوریم و در پیش‌بینی بعدی از آن استفاده کنیم.

![در این عکس x مساحت خانه و y قیمت آن است. نقاط سیاه مشاهدات ما هستند. خطوط متغیر نشان می‌دهند وقتی k0 و k1 را تغییر می‌دهیم چه اتفاقی می‌افتد.](https://lh4.googleusercontent.com/k-MKW_9H0l3PK80m9GsIPtKVEPX9bNpNqFYVGumB5rnkzdUAR4SjuXZYlluFJNZJDQ5P0k0s5EzYhZUAmekTsNNPxy_2D8xbsJnkSUiJfdBWXQe7R_54l-gwRpsYme6QArDLwLX_)

----------

**نحوه‌ی استفاده از الگوریتم های regression در یادگیری ماشین**

1.  جمع آوری داده: همان داده ای که ماشین قرار است از آن یاد گرفته و پیش بینی کند.
2.   آنالیز داده: تبدیل داده به فرمی که برای ماشیین قابل فهم باشد. فرمی که تمامی متغیر های وابسته به هر مورد در یک ردیف داده مشخص شده است.
مثال هایی از متغیر هایی که در این مرحله به هر ردیف نسبت داده می‌شود:
دارای باغ
سال ساخت
منطقه
متراژ (مساحت کل)
دارای گاراژ
تعداد اتاق خواب
سطح زندگی (سطح زندگی تعیین شده برای هر منطقه)
نوع ملک (ویلایی-آپارتمان)
...
3. چک کردن همبستگی بین متغیر ها: متغیر هایی که باهم همبستگی قوی دارند باید حذف شوند
4. حذف داده‌های خارج از محدوده
5. **انتخاب الگوریتم regression** : الگوریتم های متعددی برای آنالیز پسرفتی وجوددارد و ما دنبال دقیق ترین آن‌ها هستیم. ولی چگونه می‌توان دقت را بررسی کرد؟روش رایج برای این کار r^2 نام دارد که عملا یک امتیاز به اندازه‌ی مربع تفاضل قیمت پیش بینی شده و قیمت اصلی است. برای این کار معمولا از ۸۰٪ داده برای یادگیری و از ۲۰٪ باقیمانده برای تست دقت پیش بینی استفاده می‌شود.  

حرف های بیان شده [ترجمه](https://yalantis.com/blog/predictive-algorithm-for-house-price/) و خلاصه‌ای ساده و قابل فهمی از این دو مقاله ( [۱] و  [۲]) و کلاس دکتر Andrew Ng بود که توضیخات دقیق تر در آنان راجع به تک تک الگوریتم ها بیان شده.
در این مقاله [۱] انواع الگوریتم‌های regression معرفی و توضیح داده شده و در این مقاله  [۲] مقایسه‌ی خوبی بین آنها بیان شده.

# آزمایش‌ها
در بخش قبل راجع به روش regression در حل مسائل پیشبینی با استفاده از داده های قبلی حرف زدیم. و گفتیم مهم ترین قسمت آن انتخاب الگوریتم regression است. اما حرفی از هیچکدام از آنها ، اینکه کدام در چه شرایطی بهتر عمل میکنند و دقت کدام از باقی بیشتر است نزدیم.
در قسمت پیاده سازی برخی از آن‌ها (که ساده تر هستند!) را پیاده سازی میکنیم و به صورت عملی خواهیم دید که هر کدام چه عملکردی دارند.

##زبان برنامه و کتابخانه‌های استفاده شده
زبان استفاده شده python3 هست که زبان مناسبی برای الگوریتم‌های سطح بالا و یادگیری هست. 

### کتابخانه‌های استفاده شده 

1.  ماژول sklearn : کتابخانه‌ای ساده و بسیار مناسب برای یادگیری ماشین ، داده کاوی و تحلیل داده است. که عملیات regression را بر پایه‌ی آن نوشتیم. در اینجا عملیات یادگیری اولیه و در نهایت الگوریتم‌های regression با ماژول sklearn نوشته شده. [scikit-learn](http://scikit-learn.org/)
2. ماژول pandas: در این کتابخانه ابزارهایی قوی ،‌سریع و پویا در ساخت و مدیریت ساختمان‌داده‌های به نسبت بزرگ ارائه شده است که کار با آن‌ها را بسیار ساده تر می‌کند. در اینجا از آن برای خواندن داده از فایل و تبدیل آن به ساختمان داده‌ای قابل فهم برای زبان برنامه‌نویسی استفاده کردیم.[pandas](https://pandas.pydata.org/)
3. ماژول numpy: از این کتابخانه در python که با زبان C نوشته شده است در محاسبات علمی و سنگین مخصوصا در بستر ماتریس و آرایه‌های چند بعدی استفاده می‌شود. در این پیاده سازی از آن برای حساب‌های خطی و توابع ساده استفاده شده.[numpy](http://www.numpy.org/)
4. ماژول‌های ggplot و matplotlib: برای  نمایش گرافیکی اطلاعات در نمودار‌های ساده و قابل فهم ، ggplot  ابزاری کارآمد و کامل است. ما در اینجا از ggplot و matplotlob برای نمایش مرحله به مرحله‌ی اجرای برنامه از ابتدای نمایش اطلاعات اولیه ، فرایند یادگیری و ... تا انتهای مقایسه‌ی الگوریتم های regression به صورت بصری و گپیا استفاده کردیم.[ggplot](http://ggplot.yhathq.com/) [matplotlib](https://matplotlib.org/)
5. ماژول statsmodels: این کتابخانه برای اجرا ، محاسبه و تخمین داده‌ها و تست‌های آماری توابع و کلاس‌های خوبی را ارائه می‌کند. در انجا ما صرفا برای ساده سازی داده‌ها و ارقام برای نمایش بهتر در ابزار های گرافیکیمان استفاده کردیم.[statsmodels](http://www.statsmodels.org/stable/index.html)

## داده‌ی استفاده شده
در این آزمایش از داده‌های فراهم شده از kaggle استفاده شده که از ۸۰٪ ابتدایی برای یادگیری و از ۲۰٪ باقی برای تست درستی نتایج استفاده شده است [لینک دانلود داده](https://www.kaggle.com/harlfoxem/housesalesprediction/data)


----------


## مراحل پیاده سازی

### آماده سازی داده
در ابتدا همان‌طور که گفته شد داده‌ی مورد نظر را با استفاده از ابزار موجود در sklearn به دو قسمت برای یادگیری و تست تقسیم می‌کنیم.
سپس تک تک متغیر ها را با  متغیر هدف یعنی همان قیمت (price) مقایسه کرده و همبستگی (correlation) بین آن‌ها را پیدا میکنیم آنگاه برای فهم بهتر ، آن‌ها را به صورت تصویری در قالب نمودار (با ابزار ggplot) نمایش می‌دهیم.

قبل از ادامه حدث می‌زنید چه متغیر و معیارهایی یک خانه بیشترین تاثیر را روی قیمت آن دارند؟ 

به طور مثال به نمودار مقایسه‌ی طول و عرض  جغرافیایی با قیمت توجه کنید.
![نقاط پررنگ به معنای قیمت بالا تر هستند](http://uupload.ir/files/mws2_screenshot_from_2017-12-26_23-21-01.png)
در این نمودار به خوبی مشاهدا می‌کنیم برخی مناطق (همانطور که می‌شود پیش‌بینی کرد) به نسبت باقی از قیمت های بالاتری برخوردار هستند و در برخی مناطق دیگر قیمت خانه ها از حدی تجاوز نمی‌کند. این نمودار به خوبی تناسب بین منطقه‌ی خانه با قیمت آن را بیان میکند.
اگر بخواهیم این نمودار را به نقشه‌ی جغرافیایی تشبیه کنیم (زیرا دقیقا با طول و عرض جغرافیایی گشیده شده است) شاید بتوان گفت مناطقی که چگالی قیمت در آنها بیشتر است (مثلا حدود طول منفی ۱۲۲.۲  عرض مثبت ۴۷.۶) مناطق مرکز شهر و تجاری و یا مناطق بالانشین (از لحاظ سطح زندگی) در شهر هستند.

در مثالی دیگر متغیر تعداد اتاق خواب را با قیمت مقایسه می‌کنیم.
![](http://uupload.ir/files/pfjl_screenshot_from_2017-12-26_23-35-42.png)
همانطور که نمودار نشان می‌دهد نسبت بین تعداد اتاق خواب با قیمت کاملا خطی و مستقیم نیست. و به طور میانگین ، قیمت خانه‌هایی با ۵ یا ۶ اتاق خواب دارای بیشترین قیمت ها هستند. و به طرز عجیبی خانه‌هایی با ۹-۱۰ اتاق خواب (که پیش‌بینی می‌شود دارای مساحت بیشتری باشند و مجلل تر باشند) به طور میانگین و به نسبت دارای قیمت کمتری هستند.

در آخرین نمونه متغیر سال ساخت را مورد بررسی قرار می‌دهیم.
![](http://uupload.ir/files/fg9q_screenshot_from_2017-12-26_23-37-18.png)
بر خلاف پیش‌بینی که احتمالا سال ساخت می‌تواند تاثیر زیادی در قیمت خانه داشته باشد (همانطور که تقریبا در تهران و شهرهای ایران شاهد آن هستیم) مشاهده می‌کنیم که به طور میانگین و به نسبت دو مثال قبلی تاثیر سال ساخت خانه روی قیمت آن زیاد نیست. 
البته که کاهش قیمت جزئی دز حدود سال ۱۹۳۵ و افزایش جزئی در اطراف سال ۲۰۰۶ تا ۲۰۰۸ را مشاهدا می‌کنیم. که احتمالا ربط مستقیمی به خود سال ساخت ندارند و به تغیرات جزئی و جوی فرهنگ کلی ساخت و ساز بیشتر مربوط می‌شوند
 برای فهم بهتر تغییرات فرهنگی کلی ساخت مثالی می‌زنیم: در تهران از حدود سال ۱۳۹۰-۱۳۹۱ به بعد فرهنگ ساخت نما‌های سنگی (تراورتن و سنگ‌قیچی) کمی جا افتاد و از چند سال بعد ساختمان‌ها رو به نما‌های آجری و یا مدرن آورده آند. اما علاقه‌ی مردم هنوز از نمای سنگین سنگ کم نشده و شاهد بالا بودن قیمت نماهای سنگی (که برای سال‌های ۱۳۹۰ تا ۱۳۹۵ هستند) نسبت به نمای مدرن هستیم. دیدیم در این مثال سال ساخت با فرهنگ ساخ و فرهنگ ساخت با قیمت رابطه‌ی مستقیم دارد. که رابطه‌ی خود سال ساخت را با قیمت غیر مستقیم می‌کند.


----------

در آخر پس از بررسی تمامی متغیر ها ، مقدار همبستگی متغیرها را با قیمت پیدا میکنیم. در اینجا نمای گرافیکی همبستگی متغیرها با قیمت را به شکل نمودار میله‌ای مشاهده می‌کنیم.
![نمودار میله‌ای همبستگی متغیرهایی با  بیشترین همبستگی نسبت به متغیر قیمت](http://uupload.ir/files/v8xl_screenshot_from_2017-12-26_23-29-20.png)
همانطور که می‌بینیم (و می‌توانستیم پیش‌بینی کنیم) بیشترین همبستگی‌ها با قیمت ، برای متغیر های مربوط به متراژ خانه هستند و سپس تعداد سرویس بهداشتی و تعداد خواب. 
در آخرین رتبه (که در نمودار جا گرفته است) هم متغیر سال ساخت را می‌بینیم که همانطور که از نمودار مستقل همبستگی‌اش در بالاتر معلوم بود همبستگی کمی با قیمت دارد.

در نهایت همبستگی بین تمامی متغیرها را با هم بررسی می‌کنیم:
![جدول همبستگی دو به دوی متغیرها](http://uupload.ir/files/u95b_screenshot_from_2017-12-27_01-01-22.png)
همانطور که مشاهده می‌شود همبستگی زیادی بین دو متغیر `sqft_above` و `sqft_living` وجود داری که البته قابل پیش‌بینی هم بود. چیزی که عجیب است ، همبستگی کم دو متغیر `sqft_living` و `sqft_living15` است. (ماهیت هر متغیر در [این لینک](https://www.kaggle.com/harlfoxem/housesalesprediction/data) در قسمت column Metadata قابل مشاهدا است.)


----------

بعد از بررسی همبستگی متغیرهای پیوسته با قیمت و دیدن آن‌ها در نمودار ، نوبت به متغیرهای گسسته مثل `condition` و `grade` است.
در اینجا فقط نمودار همبستگی متغیر `grade` (امتیاز کلی داده شده توسط King County grading system به خانه) را به صورت نموداری نشان می‌دهیم ، زیرا پیش‌بینی می‌شود همبستگی زیاد و واضحی بین آن و قیمت وجود داشته باشد.
![](http://uupload.ir/files/0e_screenshot_from_2017-12-27_23-50-57.png)
همانطور که پیش‌بینی می‌شد هرچه امتیاز داده شده به خانه بیشتر باشد به طور میانگین از قیمت بالاتری برخوردار خواهد بود.


----------

## مدل سازی پسرفتی ( عملیات regression) و تخمین‌های نهایی
تا به حال بیشتر وقتمان صرف مجاسبه‌ی ضرایب همبستگی بین متغیرها با هم و با متغیر هدف و train کردن شد. که البته خود پایه‌ی الگوریتم‌های رگرسیون هستند و بخش بسیار مهمی برای مسائل پسرفتی به شمار می‌آیند.
حال وقت آن رسیده که به قولمان عمل کنیم و وارد بخش شیرین regression و پیش‌بینی‌های نهایی شویم.
در اینجا ما این ۴ الگوریتم regression را مورد بررسی قرار داده و در هر بخش توضیحاتی راجع به نحوه‌ی عملکرد هرکدام خواهیم داد:

+ [رگرسیون خطی](https://en.wikipedia.org/wiki/Linear_regression)
+ رگرسیون خطی با استفاده از [چند جمله‌ای](http://www.stat.columbia.edu/~martin/W2024/R9.pdf) (درجه ۲ و ۳) (توضیحات در بخش B مقاله پیوست شده در همین گزینه)
+ رگرسیون [LASSO](https://en.wikipedia.org/wiki/Lasso_%28statistics%29) با استفاده از چند جمله‌ای درجه ۲
+ رگرسیون [ElasticNet](https://en.wikipedia.org/wiki/Elastic_net_regularization) با استفاده از چند جمله‌ای درجه ۲

البته که sklearn برای هر ۴ تا روش ابزار های خوبی را دارد که در ادامه‌ی مسیر کمک شایانی به ما می‌کنند.
توضیحات داده شده در هر بخش ، خلاصه‌ای موجز و مفید ار پیوند‌های داده شده در هر مورد هستند.

###رگرسیون خطی
ایده‌ی رگرسیون خطی ساده است. با استفاده از ضرایبی که در قسمت قبل به دست آورده ایم می‌توانیم ترکیب خطی‌ای از متغیرها برای متغیر هدف ( یا قیمت) بنویسیم. عملا تابعی (مرتبه اول) از قیمت به متغیر ها درست می‌کنیم ، و با استفاده از آن قیمت یک خانه را با درصد خطای خوبی پیش‌بینی می‌کنیم.

$$ Price = β_0 + β_1*sqftLiving + β2*floors + ... + E_0 $$

### رگرسیون خطی با استفاده از چند جمله‌ای
در رگرسیون وقتی از چند جمله‌ای استفاده می‌کنیم که بین دو متغیر رابطه‌ی غیر خطی و منحنی باشد.
به طور مثال رابطه‌ی بین متغیر تعداد طبقه با قیمت خطی نیست. به این صورت که فاطبه قیمت بین خانه‌ی ۳ طبقه با ۲ طبقه بیشتر است از فاطله قیمت بین تک طبقه با ۲ طبقه. یعنی رابطه‌ی بین تعداد طببقات و قیمت غیر خطی و منحنی است.
$$ Price = β_0 + β_1*sqftLiving^2 + β2*floors^3 + ... + E_0 $$
اندازه‌ی [RMSE](https://en.wikipedia.org/wiki/Root-mean-square_deviation) در این آزمایش 198662.97287543735 محاسبه شد

###رگرسیون LASSO (یا least absolute shrinkage and selection operator)
در این روش وقتی همبستگی بین متغیر ها زیاد می‌شود با تغییر ناچیز الگوریتم‌های [OLS](https://en.wikipedia.org/wiki/Ordinary_least_squares) و [RIDGE](http://ncss.wpengine.netdna-cdn.com/wp-content/themes/ncss/pdf/Procedures/NCSS/Ridge_Regression.pdf) در تلاشیم به مقدار کمینه‌ی مربع باقی‌مانده‌ها دست یابیم. با این تفاوت که در OLS از هیچ نرمال کردنی استفاده نمیکردیم ( که در همبستگی‌های بزرگ مقدار خطا را زیاد می‌کرد) و در ridge از L2 norm استفاده می‌کردیم. 
حال آنکه در LASSO از L1 norm استفاده می‌کنیم. ([توضیح و فرق بین نرمال کردن L1 وL2](http://www.chioka.in/differences-between-the-l1-norm-and-the-l2-norm-least-absolute-deviations-and-least-squares/) )
$$ β = min(||Y=Xβ||^2 + lambda_1||β||_1) $$
مقدار RMSE مساوی 191895.22046476055 محاسبه شد.

###رگرسیون Elastic Net
رگرسیون Elastic Net ادغامی ساده از دو روش LASSO و RIDGE در قسمت normalize کردن است. در این روش دو راه L1 و L2 با هم به طورت خطی ادغام می‌شوند. که در این روش خطا‌های صورت گرفته در حذف test case هایی با همبستگی زیاد و یا همبستگی زیاد عادی بین دو متغیر را بسیار کاهش می‌دهد.
$$ β = min(||Y=Xβ||^2 + lambda_1||β||_1 + lambda_2||β||^2) $$
در نهایت مقدار RMSE به اندازه‌ی 191772.519363836 حساب شد.

###مقایسه‌ی روش‌های رگرسیون
در اینجا ۴ الگوریتم رگرسیون را مورد بررسی قرار دادیم و عملکرد هرکدام را دیدیم. برای دید بهتر نسبت به عملکردها همه را یک جا در یک نمودار ببینیم:
![مقایسه‌ی ۴ روش بررسی شده](http://uupload.ir/files/pb0u_screenshot_from_2017-12-28_03-25-11.png)
در نهایت و در نتیجه مشاهده می‌کنیم که می‌توان با استفاده از مدل سازی **چند جمله‌ای** عملکرد الگوریتم‌های رگرسیون را بهبود بخشید. 
و این به این معناست که در مثال واقعی پیش‌بینی قیمت املاک متغیر ها با هم نسبت خطی ندارند.


----------


**نحوه‌ی اجرای کد**
تمامی کد و تست کیس ها و نتایج را می‌توانید در [گیت‌هاب](https://github.com/mammalofski/house-price-prediction) مشاهده کنید.

برای اجرای کد ابتدا باید برنامه‌ها و ماژول‌های مورد نیاز را از فایل requirements.txt را با دستور `pip3 install -r requirements.txt`  (پیشنهادا در virtualenv) نصب کرده و سپس اقدام به اجرای هرکدام از ۴ الگوریتم که  در ۴ فایل پایتون جدا هستند کنید.

#بهبود نتایج
در بخش کار های مرتبط گفتیم یکی از مراحل عملیات regression حذف کردن داده‌های خارج از محدوده است. زیرا در مراحل تخمین ضرایب همبستگی روی نتایج اثر گذاشته از دقت آن‌ها کم می‌کند.
اما در مرحله‌ی پیاده سازی حرفی از حذف آنان نزدیم در حالی که با مشاهده‌ی نمودار‌ها متوجه تعداد نه چندان کمی از آن‌ها می شویم.
پس در این بخش داده‌های خارج از محدوده (یا outliers) حذف خواهیم کرد و خواهیم دید که روی دقت تخمین‌مان اثری خواهد داشت یا خیر.

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

برای شروع در نموداری که برای همبستگی تعداد خواب با قیمت در قسمت پیاده سازی رسم شد مشاهده میکنیم تعداد بیشتر از ۷-۸ خواب یک خانه‌ی احتمالا اشرافی بوده ممکن است روی ضرایبمان تاثیر بگذارد. لذا آن‌ها را حذف می‌کنیم.
همچنین قیمت خانه‌هایی با بیش از ۸۱۰۰ متر مربع مساحت معمولا به طور عادی حساب نمی‌شوند. به این معنا که دیگر به طور نسبتا خطی قیمت در آن محدوده زیاد نمی‌شود و رشد آن تقریبا نمایی است.
و در آخر خانه‌هایی که متراژ بیش از ۷۰۰۰ متر در طبقه‌های بالایی دارند نیز مد نظر تخمین ما نیستند و بهتر است حذف شوند.
(می‌شد تک تک نمودارّای قبل و بعد را در اینجا آورد، اما جای زیادی گرفته و به اندازه‌ی آن آورده‌ی علمی ندارد)

البته که با این تخمین و حدثی که ما از روی مشاهده‌ی چشمی نمودارها زدیم انتظار تقویت چشم گیری نخواهیم داشت. چرا که حذف آن‌ها به دو چیز بستگی دارد:
1. تعیین دقیق و هوشمندانه‌ی حدود outlier ها - که نیازمند  علم و تجربه‌ی بیشتر به آمار و ارقام ملک و مستغلات است.
2. تعیین هدف دقیق تر برای جامعه‌ی هدف. (هر محدوده برای outlier ها بستگی به هدف تخمین دارد. به طور مثال ما به تقریب گفتیم هدف ما املاک قابل خرید برای عموم مردم است. می‌توان هم داده‌ی یادگیری و هم داده‌ی تست را دقیق تر هدف بندی کرد)

حال ۴ الگوریتم بالایی را همانطور که در قسمت پیاده سازی انجام دادیم دوباره بعد از حذف outlier ها اجرا می‌کنیم تا نتایج را ببینیم.
ابتدا برای یادآوری دوباره مروری بر نتایج بدون حذف داده‎های خارج از محدوده می‌کنیم : 

	{
		'Normal Linear Regression': 271173.65754008014,
		'LinearRegression Step2 Polynominal': 198668.8112075311,
		'Lasso': 191895.22046476055,
		'ElasticNet Regression': 191772.519363836
	}


حال پس از حذف outlier ها نتایج را مشاهده می‌کنیم:

	{
		'Normal Linear Regression': 262449.41115302074,
		'LinearRegression Step2 Polynominal': 183747.90593598946,
		'Lasso': 180733.0166421391,
		'ElasticNet Regression': 182733.0166421391
	}

چیزی که مشاهده می‌کنیم به این صورت است که  خطای هرکدام حدود 3 تا 4 درصدکمتر شده است. 
وجود بهبود مثبت (حتی 1 درصد ) به ما می‌گوید که راه انتخابی برای ادامه‌ی بهبود می‌تواند راه خوبی باشد و این به این معناست که پیشبینی ما از اثر مثبت حذف داده‌های خارج از محدوده تقریبا درست بوده و با انجام حتی تقریبی و مشاهده‌ای آن موفق به بهبود نتایج شدیم.

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

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

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


----------


# مراجع
+ [آموزش یادگیری ماشین با مثال پیش بینی قیمت املاک](https://www.coursera.org/learn/machine-learning)
+  [۱]: Predicting House Prices Using Multiple Listings Data Journal of Real Estate Finance and Economics [لینک دانلود](http://uupload.ir/view/f06y_dubin1998.pdf/)
+  [۲]:   Spatial Dependence, Housing Submarkets, and House Price Prediction by Steven C. Bourassa, Eva Cantoni, Martin Hoesly- J Real Estate Finan Econ [لینک دانلود](http://uupload.ir/view/lx1k_bourassa2007.pdf/)
+  [۳]: Determinants of house prices in Turkey: Hedonic regression versus artificial neural netwok by Hassan Selim
+[۴]: [راه حلی برای مسئله](https://www.kaggle.com/arthurtok/feature-ranking-rfe-random-forest-linear-models)
+[۵]: [راه حلی برای مسئله](https://www.kaggle.com/jiashenliu/predict-house-price-step-by-step-python/)
+[۶]: [راه حلی برای مسئله](https://www.kaggle.com/auygur/step-by-step-house-price-prediction-r-2-0-77/output/)


# پیوندهای مفید


+ [لینک صفحه مسابقه پیش‌بینی قیمت املاک](https://www.kaggle.com/c/house-prices-advanced-regression-techniques)
+ [Case Study - Predicting Housing Prices](https://www.coursera.org/learn/ml-regression)
+ [Example of logistic regression in Python using scikit-learn](http://www.dataschool.io/logistic-regression-in-python-using-scikit-learn/)
+ [Supervised learning: predicting an output variable from high-dimensional observations](http://scikit-learn.org/stable/tutorial/statistical_inference/supervised_learning.html)