آموزش

مبانی رگرسیون خطی در پایتون

اینجا یاد می‌گیریم مسئله رگرسیون چه ویژگی‌هایی داره و الگوریتم رگرسیون خطی در پایتون چطور کار می‌کنه.

تاریخ انتشار:
23 تیر 1405
پایتون
15 دقیقه
علم داده
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

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

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

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

درک یک مسئله رگرسیون

رگرسیون جزو وظایف یادگیری نظارت‌شده (Supervised Learning) به حساب میاد. تو این دسته، دیتاست‌هایی که برای مدل‌سازی پیش‌بینی‌کننده یا آماری استفاده می‌شن، برچسب‌های پیوسته (continuous labels) دارن. حالا بیا یک مسئله رگرسیون رو یکم ریاضی‌وارتر تعریف کنیم.

به تصویر زیر نگاه کن:

تو تصویر بالا، X مجموعه‌ای از مقادیره که مساحت خانه‌های مختلف رو نشون می‌ده (بهش فضای مقادیر ورودی هم می‌گن) و y هم قیمت همون خانه‌هاست. دقت کن که این مقادیر رو h پیش‌بینی می‌کنه. h تابعیه که مقادیر X رو به y نگاشت می‌کنه (که اغلب بهش پیش‌بینی‌کننده یا predictor می‌گن). بنا به دلایل تاریخی، به این h تابع فرضیه (hypothesis) گفته می‌شه. یادت باشه که این دیتاست فقط یک ویژگی داره، یعنی مساحت خانه‌های مختلف؛ برای درک بهتر، فرض کن این یک دیتاست آموزشی کوچیکه.

توجه کن که مقادیر پیش‌بینی‌شده اینجا ذاتاً پیوسته هستن. بنابراین، هدف نهایی تو اینه که با داشتن یک مجموعه آموزشی، تابعی مثل $h : \mathcal{X} \rightarrow \mathcal{Y}$ رو به دست بیاری تا h(x) یک پیش‌بینی‌کننده «خوب» برای مقدار متناظر y باشه. همچنین، یادت نره که دامنه مقادیری که هم X و هم Y می‌پذیرن همه اعداد حقیقی هستن و می‌تونی اون رو به این شکل تعریف کنی: $\mathcal{X} = \mathcal{Y} = \mathbb{IR}$ که در اون، $\mathbb{IR}$ مجموعه تمام اعداد حقیقیه.

به هر جفت (x(i), y(i)) یک نمونه آموزشی می‌گیم. می‌تونی مجموعه آموزشی رو به این شکل تعریف کنی: {(x(i), y(i)) ; i = 1,...,m} (به شرطی که مجموعه آموزشی شامل m نمونه باشه و فقط یک ویژگی x تو دیتاست وجود داشته باشه).

 طبق گفته هان (Han)، کامبر (Kamber) و پی (Pei): «به طور کلی، این روش‌ها برای پیش‌بینی مقدار یک متغیر وابسته از یک یا چند متغیر مستقل استفاده می‌شن، جایی که متغیرها عددی هستن.» - داده‌کاوی: مفاهیم و تکنیک‌ها (نسخه سوم)

به همین سادگی!

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

رگرسیون خطی چطور کار می‌کنه؟

قبل از اینکه بریم سراغ جزئیات، بد نیست ببینیم اولین بار کی کشف شد. خب، داستان برمی‌گرده به قرن ۱۸. کارل فریدریش گاوس (Carl Friedrich Gauss) اولین بار ابتدایی‌ترین شکل رگرسیون آماری رو پیشنهاد داد، البته بحث‌های زیادی در این مورده. بیا وارد اون بحث‌ها نشیم، ولی اگه دوست داری بدونی بین گاوس و آدرین-ماری لژاندر (Adrien-Marie Legendre) چه بحث‌هایی شکل گرفته، یه نگاه به این لینک بنداز.

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

بیا یک دیتاست آموزشی براش در نظر بگیریم. دوباره از همون دیتاست پیش‌بینی قیمت خانه استفاده می‌کنیم تا موضوع رو بررسی کنیم، اما این بار با دو تا ویژگی. صورت مسئله که همون پیش‌بینی قیمت خانه‌ست، دقیقاً همون می‌مونه.

همون‌طور که قبلاً گفتیم، حالا مقادیر x دوبعدی هستن؛ یعنی دیتاستت دو تا ویژگی داره. مثلاً x1(i) مساحت iامین خانه تو مجموعه آموزشیه و x2(i) تعداد اتاق‌خواب‌هاشه.

برای انجام رگرسیون، باید تصمیم بگیری h رو چطور نمایش بدی. به عنوان یک انتخاب اولیه، فرض کنیم می‌خوای y رو به عنوان یک تابع خطی از x تقریب بزنی:

hθ(x) = θ0 + θ1x1 + θ2x2

اینجا θiها پارامترها (یا وزن‌هایی) هستن که فضای توابع خطی از $\mathcal{X}$ به $\mathcal{Y}$ رو مقداردهی می‌کنن. به زبون ساده‌تر، از این پارامترها برای نگاشت دقیق $\mathcal{X}$ به $\mathcal{Y}$ استفاده می‌شه. اما برای اینکه درک موضوع برات ساده بمونه، تو عبارت hθ(x) اندیس θ رو حذف می‌کنیم و فقط به صورت h(x) می‌نویسیمش. برای ساده‌تر کردن این نمادگذاری، قرارداد می‌کنیم که x0 = 1 در نظر گرفته بشه (که این همون عرض از مبدأ یا intercept هست)، به طوری که:

سمت راست عبارت بالا، هر دو متغیر θ و x رو به عنوان بردار در نظر می‌گیری و اینجا n تعداد نمونه‌های ورودیه (بدون در نظر گرفتن x0).

اما سوال اصلی که الان پیش میاد اینه که چطور باید پارامترهای θ رو انتخاب کنی یا یاد بگیری؟ تو نمی‌تونی نمونه‌های ورودی خودت رو طوری عوض کنی که قیمت‌ها بهتر پیش‌بینی بشن. تنها چیزی که برای رسیدن به نتیجه دلخواه در اختیار داری، تنظیم همین پارامترهای θ هست.

یک روش خیلی خوب اینه که h(x) رو حداقل برای نمونه‌های آموزشی که داری، تا جای ممکن به y نزدیک کنی. برای اینکه این موضوع رو رسمی‌تر و دقیق‌تر متوجه بشی، بیا سعی کنیم تابعی تعریف کنیم که برای هر مقدار از θ، مشخص کنه مقادیر h(x(i)) چقدر به y(i)های متناظرشون نزدیکن. این تابع باید یه چیزی شبیه به این باشه:

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

تو همین الان یکی از مهم‌ترین فرمول‌های دنیای علم داده، یادگیری ماشین و آمار رو دیدی. به این فرمول تابع هزینه (cost function) می‌گن.

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

مهمه بدونی که رگرسیون خطی معمولاً به دو شکل اصلی تقسیم می‌شه:

  • رگرسیون خطی ساده؛ که فقط با دو متغیر سر و کار داره (همونی که اول دیدی)
  • رگرسیون خطی چندگانه؛ که با بیشتر از دو متغیر کار می‌کنه (همونی که الان دیدی)

این موارد خیلی ساده و سرراست هستن ولی معمولاً باعث سردرگمی می‌شن.

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

یادت باشه که تو این مبحث، به پارامترها ضرایب مدل هم گفته می‌شه.

بهینه‌سازی یک مدل رگرسیون خطی با رویکردهای مختلف:

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

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

رگرسیون حداقل مربعات:

بخش قبلی رو با این ایده تموم کردیم که θ رو طوری انتخاب کنی که J(θ) به حداقل برسه. برای این کار، بیا از یک الگوریتم جستجو استفاده کنیم که با یک حدس اولیه برای θ شروع می‌شه و به صورت تکراری با تغییر مقادیر θ پیش می‌ره تا J(θ) کوچیک و کوچیک‌تر بشه، تا جایی که در نهایت به مقداری از θ همگرا بشی که J(θ) کمترین مقدار ممکن رو داشته باشه. به طور مشخص، ساختار الگوریتم گرادیان کاهشی (gradient descent) رو در نظر بگیر که با یک θ اولیه شروع می‌شه و بارها قانون به‌روزرسانی زیر رو اجرا می‌کنه:

(این به‌روزرسانی به طور همزمان برای تمام مقادیر j = 0, ..., n انجام می‌شه.) اینجا، α به عنوان نرخ یادگیری شناخته می‌شه. این یک الگوریتم کاملاً طبیعیه که مکرراً یک قدم در مسیر پرشیب‌ترین کاهش J برمی‌داره. در واقع این عبارت α کنترل می‌کنه که الگوریتم چقدر پرشیب تو مسیر کاهش J حرکت کنه. می‌تونی این موضوع رو تو تصویر زیر بهتر ببینی:

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

فقط یادت باشه که برای یک نمونه آموزشی، این شرایط قانون به‌روزرسانی زیر رو به ما می‌ده:

به این قانون به‌روزرسانی، الگوریتم حداقل میانگین مربعات یا LMS که مخفف Least Mean Squares هست می‌گن و به عنوان قانون یادگیری ویدرو-هاف (Widrow-Hoff) هم شناخته می‌شه.

بیا چند تا نکته مهم درباره فرمول OLS رو با هم خلاصه کنیم.

«روش حداقل مربعات معمولی دنبال به حداقل رسوندن مجموع مربع خطاهای تفاضله. یعنی وقتی یک خط رگرسیون روی داده‌ها در نظر می‌گیریم، فاصله هر نقطه تا اون خط رو حساب می‌کنیم، به توان دو می‌رسونیم و در نهایت همه این خطاهای مجذور شده رو با هم جمع می‌کنیم. این دقیقاً همون چیزیه که روش حداقل مربعات معمولی سعی داره کمینه‌اش کنه.» جیسون براونلی (Jason Brownlee)

بهینه‌سازی با گرادیان کاهشی

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

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

عبارت α (نرخ یادگیری) اینجا خیلی مهمه چون اندازه گام بهبود رو تو هر تکرار مشخص می‌کنه.

در حال حاضر به طور معمول دو نوع روش گرادیان کاهشی داریم:

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

اینجا بحث گرادیان کاهشی برای این آموزش تموم می‌شه. حالا می‌ریم سراغ یک راه دیگه برای بهینه‌سازی مدل رگرسیون خطی، یعنی منظم‌سازی.

منظم‌سازی

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

به طور کلی، روش‌های منظم‌سازی با جریمه کردن ضرایبِ ویژگی‌هایی که مقادیر خیلی بزرگی دارن کار می‌کنن و از این طریق سعی می‌کنن خطا رو کاهش بدن. این کار نه تنها نرخ خطا رو بهتر می‌کنه، بلکه معمولاً پیچیدگی مدل رو هم میاره پایین. این ویژگی مخصوصاً وقت‌هایی که با دیتاستی پر از ویژگی‌های متنوع سر و کار داری و مدل پایه‌ات نمی‌تونه اهمیت ویژگی‌ها رو درست تشخیص بده، خیلی به درد می‌خوره (خودتم می‌دونی که همه ویژگی‌های یک دیتاست به یک اندازه مهم نیستن).

دو نوع فرآیند منظم‌سازی مختلف برای اجرای رگرسیون خطی وجود داره:

رگرسیون لاسو (Lasso Regression): یک عبارت جریمه به فرمول اضافه می‌کنه که معادل قدر مطلقِ اندازه ضرایبه (بهش منظم‌سازی L1 هم می‌گیم). عبارت‌های جریمه به این شکل هستن:

که تو اون:

  • $\lambda$ یک فاکتور ثابته که اضافه شده تا بتونی سرعت بهبود خطا رو کنترل کنی (نرخ یادگیری).
  • دیتاست دارای (M+1) ویژگیه؛ پس مقادیر از 0 تا M متغیرن. wj همون ضریبه.

رگرسیون ریج (Ridge Regression): یک عبارت جریمه به تابع اضافه می‌کنه که معادل مربع اندازه ضرایبه (که بهش منظم‌سازی L2 هم می‌گن). این عبارت‌های جریمه شبیه به این هستن:

آیا هنوز هم ارزش داره برای یادگیری رگرسیون خطی وقت بذاریم؟

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

تازه، یک مفهوم ساده تو زمینه استخراج روابط بین متغیرها، باعث شکل‌گیری کلی مفاهیم جدید شد و از اون مهم‌تر، یک خانواده بزرگ از الگوریتم‌های جدید رو به وجود آورد، یعنی همون مدل‌های خطی تعمیم‌یافته (Generalized Linear Models). پس برای کسی که داره خودش رو برای ورود به دنیای علم داده، یادگیری ماشین یا هوش مصنوعی آماده می‌کنه، این همون الگوریتمیه که اصلاً نباید نادیده‌اش گرفت. تا الان حتماً خودتم به خوبی اینو متوجه شدی!

حالا دیگه وقتشه که خودت شروع کنی و یک سیستم رگرسیون خطی ساده رو تو پایتون پیاده‌سازی کنی!

مطالعه موردی تو پایتون

برای این مطالعه موردی، اول از کتابخونه statsmodel تو پایتون استفاده می‌کنیم. این یک کتابخونه خیلی معروف و جاافتاده‌ست که کلاس‌ها و توابعی رو برای تخمین مدل‌های مختلف آماری، انجام تست‌ها و اکتشافات داده‌های آماری در اختیارت می‌ذاره. برای داده‌ها، قراره از دیتاست معروف مسکن بوستون استفاده کنی. کتابخونه قدرتمند scikit-learn خودش از قبل این دیتاست رو داره، پس نیازی نیست جداگانه دانلودش کنی.

بیا این بررسی رو با وارد کردن کتابخونه statsmodels و دیتاستت شروع کنیم:

خروجی
Boston House Prices dataset
===========================

Notes
------
Data Set Characteristics:  

    :Number of Instances: 506

    :Number of Attributes: 13 numeric/categorical predictive

    :Median Value (attribute 14) is usually the target

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

    :Missing Attribute Values: None

    :Creator: Harrison, D. and Rubinfeld, D.L.

This is a copy of UCI ML housing dataset.
http://archive.ics.uci.edu/ml/datasets/Housing


This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.

The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
prices and the demand for clean air', J. Environ. Economics & Management,
vol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics
...', Wiley, 1980.   N.B. Various transformations are used in the table on
pages 244-261 of the latter.

The Boston house-price data has been used in many machine learning papers that address regression
problems.   

**References**

   - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.
   - Quinlan, R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.
   - many more! (see http://archive.ics.uci.edu/ml/datasets/Housing)

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

اینجا یکم دانش کار با pandas به کارت میاد. اگه دوست داری مفاهیم اولیه pandas رو مرور کنی، حتماً به این برگه تقلب (cheat sheet) نگاهی بنداز.

تو این مرحله، قبل از اینکه تغییری روی داده‌ها بدی، باید چند تا نکته مهم رو درباره رگرسیون خطی در نظر بگیری. می‌شد این مطالب رو کمی زودتر تو همین آموزش یاد بگیری، اما دونستن این عوامل تو این مرحله کمکت می‌کنه تا خیلی بهتر بهشون مسلط بشی.

  • فرض خطی بودن: رگرسیون خطی بهترین گزینه برای فهمیدن رابطه بین متغیرهای ورودی و خروجیه. برای این کار، رگرسیون خطی فرض می‌کنه که این رابطه یک رابطه خطیه (که البته ممکنه همیشه این‌طوری نباشه). اما تو می‌تونی همیشه داده‌هات رو طوری تبدیل کنی که یک رابطه خطی شکل بگیره. مثلاً، اگه داده‌هات رابطه نمایی دارن، می‌تونی از تبدیل لگاریتمی برای خطی کردن این رابطه استفاده کنی.
  • همبستگی بین ویژگی‌ها: همبستگی معیاری برای محاسبه ریاضیِ اهمیت یک ویژگی دیتاسته. وقتی مقادیری داری که ویژگی‌ها توشون به شدت با هم مرتبطن، رگرسیون خطی نمی‌تونه این رابطه رو درست ارزیابی کنه و مدل تمایل به بیش‌برازش (Overfitting) پیدا می‌کنه. بنابراین، بهترین کار اینه که ویژگی‌هایی که همبستگی بالایی با هم دارن رو پیدا کنی و قبل از اعمال رگرسیون خطی، اون‌ها رو حذف کنی. اگه می‌خوای تو این مورد بیشتر بدونی، به این لینک تو سایت Kaggle سر بزن.

حالا بیا یکم کار رو عملی‌تر پیش ببریم. برای راحتی کار فعلاً فقط ویژگی RM  که میانگین تعداد اتاق‌ها باشه رو در نظر می‌گیریم. یادت باشه که ماژول Statsmodels به صورت پیش‌فرض، هیچ مقدار ثابتی به مدل اضافه نمی‌کنه (عبارت θ0 رو یادت بیار). بیا ببینیم این موضوع وقتی عبارت ثابت تو مدل رگرسیون نداریم، چطور پیش می‌ره:

این خروجی چیه؟! اولین باری که می‌بینیش ممکنه واقعاً گیج‌کننده به نظر برسه. بیا قدم به قدم مهم‌ترین بخش‌هاش رو با هم بررسی کنیم:

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

  • یک مقدار خاص هم مربوط به ویژگی R-Squared هست. R-squared در واقع درصد واریانس توضیح داده شده توسط مدل رو نشون می‌ده. یعنی همون کسری که واریانس خطاها توش کمتر از واریانس متغیر وابسته در نظر گرفته می‌شه. مقادیر R-squared می‌تونن بین 0 تا 1 باشن و معمولاً به صورت درصدی از 0٪ تا 100٪ بیان می‌شن. این مقدار، برآوردی از رابطه بین تغییرات متغیر وابسته رو بر اساس تغییرات متغیر مستقل به ما می‌ده. اما بهت نمی‌گه مدلی که انتخاب کردی مدل خوبیه یا نه، و حتی مشخص نمی‌کنه که آیا داده‌ها و پیش‌بینی‌های مدل دچار سوگیری بودن یا نه. بالا یا پایین بودن مقدار R-squared لزوماً خوب یا بد نیست، چون نمی‌تونه اعتبار مدل رو تایید کنه و ربطی هم به انتخاب درست متغیر نداره. ممکنه برای یک مدل عالی، R-squared پایینی به دست بیاری یا برعکس، برای مدلی که اصلاً درست برازش نشده، R-squared بالایی داشته باشی.

  • ضریب 3.634 به این معنیه که اگه متغیر RM یک واحد بزرگ‌تر بشه، مقدار پیش‌بینی‌شده برای متغیر MEDV هم 3.634 واحد افزایش پیدا می‌کنه.

  • یک فاصله اطمینان 95٪ هم برای RM وجود داره، یعنی مدل با 95٪ اطمینان پیش‌بینی می‌کنه که مقدار RM تو بازه بین 3.548 تا 3.759 باشه.

در حال حاضر این‌ها همون نکات مهمی هستن که تو این مرحله باید بهشون دقت کنی.

به راحتی می‌شه یک عرض از مبدأ به مدل رگرسیون خطی اضافه کرد. می‌تونی این کار رو با اجرای X = sm.add_constant(X) انجام بدی (اینجا X اسم همون دیتافریمیه که ورودی، یعنی متغیرهای مستقل رو مدیریت می‌کنه).

همون‌طور که کاملاً مشخصه، اضافه شدن عبارت ثابت مستقیماً روی مقادیر ضریب تأثیر گذاشته. بدون عبارت ثابت، خط مدل از مبدأ مختصات می‌گذشت، اما حالا روی محور یک عرض از مبدأ با مقدار 34.67- داری. از طرفی شیب متغیر RM هم تغییر کرده و از 3.634 به 9.1021 رسیده.

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

حالا بیا این خروجی رو تفسیر کنیم:

این مدل مقدار R-squared خیلی بالاتری داره؛ یعنی 0.948. این عدد اساساً معنیش اینه که مدل تونسته 94.8٪ از پراکندگی متغیر وابسته رو توجیه کنه. حالا بیا سعی کنیم رابطه بین دو متغیر RM و LSTAT رو با میانگین ارزش خانه‌ها متوجه بشیم. با افزایش یک واحد تو RM، متوسط MEDV به اندازه 4.9069 افزایش پیدا می‌کنه و وقتی LSTAT یک واحد زیاد می‌شه، MEDV به اندازه 0.6557 کاهش پیدا می‌کنه. در نتیجه این آمار نشون می‌ده که ضرایب مربوط به RM و LSTAT برای پیش‌بینی میانگین ارزش خونه‌ها از نظر آماری کاملاً معنادارن.

اگه بخوایم این رابطه رو به زبون ساده‌تر و عامیانه تفسیر کنیم، می‌شه:

  • خونه‌هایی که اتاق‌های کمتری دارن، احتمالاً قیمت‌هاشون هم پایین‌تره.
  • تو محله‌هایی که ساکنین از نظر وضعیت اجتماعی-اقتصادی تو سطح پایین‌تری هستن، احتمالاً ارزش خونه‌ها هم پایین‌تره.

این‌طوری خیلی منطقی‌تر شد! نه؟

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

در ادامه، بیا ببینیم چطور می‌تونیم متد رگرسیون خطی رو با scikit-learn طراحی و پیاده‌سازی کنیم. تو قبلاً اطلاعات این دیتاست رو بارگذاری کردی، اما حالا باید کلاس linear_model رو هم به محیط اضافه کنی.

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

خروجی
[30.00821269 25.0298606  30.5702317  28.60814055 27.94288232]

اگه می‌خوای جزئیات دقیق‌تری از مدلت (مثل شاخص R-squared، ضرایب یا بقیه اطلاعات ثابت و غیره) به دست بیاری، خیلی راحت با نوشتن چند تا پارامتر می‌تونی این کار رو بکنی.

خروجی
0.7406077428649427
خروجی
array([-1.07170557e-01,  4.63952195e-02,  2.08602395e-02,  2.68856140e+00,
       -1.77957587e+01,  3.80475246e+00,  7.51061703e-04, -1.47575880e+00,
        3.05655038e-01, -1.23293463e-02, -9.53463555e-01,  9.39251272e-03,
       -5.25466633e-01])

جمع‌بندی!

عالی بود! تونستی تا آخرش پیش بیای. یادگیری یکی از پایه‌ای‌ترین الگوریتم‌های یادگیری ماشین اصلاً کار راحتی نبود، ولی خیلی خوب از پسش برومدی. تو نه تنها با اصول رگرسیون خطی ساده آشنا شدی، بلکه کلی از مفاهیم پایه و ویژگی‌های اصلی یادگیری ماشین رو هم یاد گرفتی. ضمناً یک مطالعه موردی فشرده و عملی رو هم انجام دادی.

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

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

برای آماده‌سازی محتوای این آموزش از منابع زیر استفاده شده:

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

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

اشتراک‌گذاری
فهرست مطالب
  • درک یک مسئله رگرسیون
  • رگرسیون خطی چطور کار می‌کنه؟
  • بهینه‌سازی یک مدل رگرسیون خطی با رویکردهای مختلف:
  • رگرسیون حداقل مربعات:
  • بهینه‌سازی با گرادیان کاهشی
  • منظم‌سازی
  • آیا هنوز هم ارزش داره برای یادگیری رگرسیون خطی وقت بذاریم؟
  • مطالعه موردی تو پایتون
  • جمع‌بندی!

دریافت اپلیکیشن فینکا

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