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

۱. مقدمه

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

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

۲. کارهای مرتبط

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

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

در این عکس x مساحت خانه و y قیمت آن است. نقاط سیاه مشاهدات ما هستند. خطوط متغیر نشان می‌دهند وقتی k0 و k1 را تغییر می‌دهیم چه اتفاقی می‌افتد.


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

  1. جمع آوری داده: همان داده ای که ماشین قرار است از آن یاد گرفته و پیش بینی کند.

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

  3. چک کردن همبستگی بین متغیر ها: متغیر هایی که باهم همبستگی قوی دارند باید حذف شوند

  4. حذف داده‌های خارج از محدوده

  5. انتخاب الگوریتم regression : الگوریتم های متعددی برای آنالیز پسرفتی وجوددارد و ما دنبال دقیق ترین آن‌ها هستیم. ولی چگونه می‌توان دقت را بررسی کرد؟روش رایج برای این کار r^2 نام دارد که عملا یک امتیاز به اندازه‌ی مربع تفاضل قیمت پیش بینی شده و قیمت اصلی است. برای این کار معمولا از ۸۰٪ داده برای یادگیری و از ۲۰٪ باقیمانده برای تست دقت پیش بینی استفاده می‌شود.

حرف های بیان شده ترجمه و خلاصه‌ای ساده و قابل فهمی از این دو مقاله ( [۱] و [۲]) و کلاس دکتر Andrew Ng بود که توضیخات دقیق تر در آنان راجع به تک تک الگوریتم ها بیان شده.
در این مقاله [۱] انواع الگوریتم‌های regression معرفی و توضیح داده شده و در این مقاله [۲] مقایسه‌ی خوبی بین آنها بیان شده.

۳. آزمایش‌ها

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

۳.۱. زبان برنامه و کتابخانه‌های استفاده شده

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

۳.۱.۱. کتابخانه‌های استفاده شده

  1. ماژول sklearn : کتابخانه‌ای ساده و بسیار مناسب برای یادگیری ماشین ، داده کاوی و تحلیل داده است. که عملیات regression را بر پایه‌ی آن نوشتیم. در اینجا عملیات یادگیری اولیه و در نهایت الگوریتم‌های regression با ماژول sklearn نوشته شده. scikit-learn

  2. ماژول pandas: در این کتابخانه ابزارهایی قوی ،‌سریع و پویا در ساخت و مدیریت ساختمان‌داده‌های به نسبت بزرگ ارائه شده است که کار با آن‌ها را بسیار ساده تر می‌کند. در اینجا از آن برای خواندن داده از فایل و تبدیل آن به ساختمان داده‌ای قابل فهم برای زبان برنامه‌نویسی استفاده کردیم.pandas

  3. ماژول numpy: از این کتابخانه در python که با زبان C نوشته شده است در محاسبات علمی و سنگین مخصوصا در بستر ماتریس و آرایه‌های چند بعدی استفاده می‌شود. در این پیاده سازی از آن برای حساب‌های خطی و توابع ساده استفاده شده.numpy

  4. ماژول‌های ggplot و matplotlib: برای نمایش گرافیکی اطلاعات در نمودار‌های ساده و قابل فهم ، ggplot ابزاری کارآمد و کامل است. ما در اینجا از ggplot و matplotlob برای نمایش مرحله به مرحله‌ی اجرای برنامه از ابتدای نمایش اطلاعات اولیه ، فرایند یادگیری و ... تا انتهای مقایسه‌ی الگوریتم های regression به صورت بصری و گپیا استفاده کردیم.ggplot matplotlib

  5. ماژول statsmodels: این کتابخانه برای اجرا ، محاسبه و تخمین داده‌ها و تست‌های آماری توابع و کلاس‌های خوبی را ارائه می‌کند. در انجا ما صرفا برای ساده سازی داده‌ها و ارقام برای نمایش بهتر در ابزار های گرافیکیمان استفاده کردیم.statsmodels

۳.۲. داده‌ی استفاده شده

در این آزمایش از داده‌های فراهم شده از kaggle استفاده شده که از ۸۰٪ ابتدایی برای یادگیری و از ۲۰٪ باقی برای تست درستی نتایج استفاده شده است لینک دانلود داده


۳.۳. مراحل پیاده سازی

۳.۳.۱. آماده سازی داده

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

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

به طور مثال به نمودار مقایسه‌ی طول و عرض جغرافیایی با قیمت توجه کنید.

نقاط پررنگ به معنای قیمت بالا تر هستند

در این نمودار به خوبی مشاهدا می‌کنیم برخی مناطق (همانطور که می‌شود پیش‌بینی کرد) به نسبت باقی از قیمت های بالاتری برخوردار هستند و در برخی مناطق دیگر قیمت خانه ها از حدی تجاوز نمی‌کند. این نمودار به خوبی تناسب بین منطقه‌ی خانه با قیمت آن را بیان میکند.
اگر بخواهیم این نمودار را به نقشه‌ی جغرافیایی تشبیه کنیم (زیرا دقیقا با طول و عرض جغرافیایی گشیده شده است) شاید بتوان گفت مناطقی که چگالی قیمت در آنها بیشتر است (مثلا حدود طول منفی ۱۲۲.۲ عرض مثبت ۴۷.۶) مناطق مرکز شهر و تجاری و یا مناطق بالانشین (از لحاظ سطح زندگی) در شهر هستند.

در مثالی دیگر متغیر تعداد اتاق خواب را با قیمت مقایسه می‌کنیم.


همانطور که نمودار نشان می‌دهد نسبت بین تعداد اتاق خواب با قیمت کاملا خطی و مستقیم نیست. و به طور میانگین ، قیمت خانه‌هایی با ۵ یا ۶ اتاق خواب دارای بیشترین قیمت ها هستند. و به طرز عجیبی خانه‌هایی با ۹-۱۰ اتاق خواب (که پیش‌بینی می‌شود دارای مساحت بیشتری باشند و مجلل تر باشند) به طور میانگین و به نسبت دارای قیمت کمتری هستند.

در آخرین نمونه متغیر سال ساخت را مورد بررسی قرار می‌دهیم.


بر خلاف پیش‌بینی که احتمالا سال ساخت می‌تواند تاثیر زیادی در قیمت خانه داشته باشد (همانطور که تقریبا در تهران و شهرهای ایران شاهد آن هستیم) مشاهده می‌کنیم که به طور میانگین و به نسبت دو مثال قبلی تاثیر سال ساخت خانه روی قیمت آن زیاد نیست.
البته که کاهش قیمت جزئی دز حدود سال ۱۹۳۵ و افزایش جزئی در اطراف سال ۲۰۰۶ تا ۲۰۰۸ را مشاهدا می‌کنیم. که احتمالا ربط مستقیمی به خود سال ساخت ندارند و به تغیرات جزئی و جوی فرهنگ کلی ساخت و ساز بیشتر مربوط می‌شوند
برای فهم بهتر تغییرات فرهنگی کلی ساخت مثالی می‌زنیم: در تهران از حدود سال ۱۳۹۰-۱۳۹۱ به بعد فرهنگ ساخت نما‌های سنگی (تراورتن و سنگ‌قیچی) کمی جا افتاد و از چند سال بعد ساختمان‌ها رو به نما‌های آجری و یا مدرن آورده آند. اما علاقه‌ی مردم هنوز از نمای سنگین سنگ کم نشده و شاهد بالا بودن قیمت نماهای سنگی (که برای سال‌های ۱۳۹۰ تا ۱۳۹۵ هستند) نسبت به نمای مدرن هستیم. دیدیم در این مثال سال ساخت با فرهنگ ساخ و فرهنگ ساخت با قیمت رابطه‌ی مستقیم دارد. که رابطه‌ی خود سال ساخت را با قیمت غیر مستقیم می‌کند.


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

نمودار میله‌ای همبستگی متغیرهایی با بیشترین همبستگی نسبت به متغیر قیمت

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

در نهایت همبستگی بین تمامی متغیرها را با هم بررسی می‌کنیم:

جدول همبستگی دو به دوی متغیرها

همانطور که مشاهده می‌شود همبستگی زیادی بین دو متغیر sqft_above و sqft_living وجود داری که البته قابل پیش‌بینی هم بود. چیزی که عجیب است ، همبستگی کم دو متغیر sqft_living و sqft_living15 است. (ماهیت هر متغیر در این لینک در قسمت column Metadata قابل مشاهدا است.)


بعد از بررسی همبستگی متغیرهای پیوسته با قیمت و دیدن آن‌ها در نمودار ، نوبت به متغیرهای گسسته مثل condition و grade است.
در اینجا فقط نمودار همبستگی متغیر grade (امتیاز کلی داده شده توسط King County grading system به خانه) را به صورت نموداری نشان می‌دهیم ، زیرا پیش‌بینی می‌شود همبستگی زیاد و واضحی بین آن و قیمت وجود داشته باشد.


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


۳.۴. مدل سازی پسرفتی ( عملیات regression) و تخمین‌های نهایی

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

  • رگرسیون خطی

  • رگرسیون خطی با استفاده از چند جمله‌ای (درجه ۲ و ۳) (توضیحات در بخش B مقاله پیوست شده در همین گزینه)

  • رگرسیون LASSO با استفاده از چند جمله‌ای درجه ۲

  • رگرسیون ElasticNet با استفاده از چند جمله‌ای درجه ۲

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

۳.۴.۱. رگرسیون خطی

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

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

۳.۴.۲. رگرسیون خطی با استفاده از چند جمله‌ای

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

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

اندازه‌ی RMSE در این آزمایش 198662.97287543735 محاسبه شد

۳.۴.۳. رگرسیون LASSO (یا least absolute shrinkage and selection operator)

در این روش وقتی همبستگی بین متغیر ها زیاد می‌شود با تغییر ناچیز الگوریتم‌های OLS و RIDGE در تلاشیم به مقدار کمینه‌ی مربع باقی‌مانده‌ها دست یابیم. با این تفاوت که در OLS از هیچ نرمال کردنی استفاده نمیکردیم ( که در همبستگی‌های بزرگ مقدار خطا را زیاد می‌کرد) و در ridge از L2 norm استفاده می‌کردیم.
حال آنکه در LASSO از L1 norm استفاده می‌کنیم. (توضیح و فرق بین نرمال کردن L1 وL2 )

β = 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 حساب شد.

۳.۴.۵. مقایسه‌ی روش‌های رگرسیون

در اینجا ۴ الگوریتم رگرسیون را مورد بررسی قرار دادیم و عملکرد هرکدام را دیدیم. برای دید بهتر نسبت به عملکردها همه را یک جا در یک نمودار ببینیم:

مقایسه‌ی ۴ روش بررسی شده

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


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

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

۴. مراجع

۵. پیوندهای مفید

تایید شده

در بخش کار های مرتبط مطالب کمی به صورت کلی بیان شد که جا داشت دقیق‌تر و کمی بیشتر باشد. مثلا در قسمت نحوه‌ی استفاده از الگوریتم های regression در یادگیری ماشین مورد چهارم یعنی حذف داده‌های خارج از محدوده میتوانست بهتر بیان شود (خارج از چه محدوده‌ای؟)
اما در بخش آزمایش ها مطالب بسیار خوب بیان شده است. از نظر ترتیب بیان مطالب و قبال فهم بودن آن‌ها ایرادی به مقاله‌ی شما وارد نیست. ۴ روش مختلف الگوریتم regression به خوبی (مختصر و مفید) معرفی شده‌اند. تنها نکته‌ی قابل ذکر مربوط به نمودار boxplot of grade and price است که کمی نامفهوم هست و بهتر بود توضیح کوتاهی برای مفهوم boxplot داده می‌شد.
با آرزوی موفقیت.

رد شده

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

وحید خرازی

سلام

  • پیاده‌سازی شما خوب است و تحلیل‌های خوبی نسبت به پارامترهای داده مساله داشتید البته بهتر بود که در مورد الگوریتم‌ها و پارامتر‌های انتخاب شده در الگوریتم‌ها توضیح بیشتری می‌دادید.

  • کدهای ترسیم‌ها را در گیت‌هاب پیدا نکردم لطفا آن‌ها را هم بارگزاری کنید.

  • متن‌تان هم هنوز ایراداتی از نظر نگارشی دارد و برخی از توضیحات کاملا نامفهموم است.

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

موفق باشید.