naderyab.ir
naderyab.ir
خواندن ۶ دقیقه·۳ سال پیش

مقدمه ای بر الگوریتم های یادگیری ماشین: رگرسیون خطی

رگرسیون خطی
رگرسیون خطی

مقدمه

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

رگرسیون خطی چیست ؟

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

رگرسیون خطی
رگرسیون خطی

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

y = a_0 + a_1 * x ## Linear Equation

انگیزه الگوریتم رگرسیون خطی یافتن بهترین مقادیر برای a_0 و a_1 است. قبل از رفتن به الگوریتم، اجازه دهید به دو مفهوم مهم که برای درک بهتر رگرسیون خطی باید بدانید، نگاهی بیندازیم.

تابع هزینه

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

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

گرادیان کاهشی

مفهوم مهم بعدی مورد نیاز برای درک رگرسیون خطی، گرادیان کاهشی است. گرادیان کاهشی روشی برای به روز رسانی a_0 و a_1 جهت کاهش تابع هزینه (MSE) است. ایده این است که ما با مقادیری برای a_0 و a_1 شروع می کنیم و سپس این مقادیر را به طور مکرر تغییر می دهیم تا هزینه را کاهش دهیم. کاهش گرادیان به ما در چگونگی تغییر مقادیر کمک می کند.

گرادیان کاهشی
گرادیان کاهشی

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

تابع محدب (سمت چپ) در مقابل غیر محدب (سمت راست)
تابع محدب (سمت چپ) در مقابل غیر محدب (سمت راست)

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

ممکن است تعجب کنید که چگونه از گرادیان نزول برای به روز رسانی a_0 و a_1 استفاده کنید. برای به روز رسانی a_0 و a_1، از تابع هزینه گرادیان ها را محاسبه می‌کنیم. برای یافتن این گرادیان ها، مشتقات جزئی را با توجه به a_0 و a_1 می گیریم. اکنون، برای درک چگونگی یافتن مشتقات جزئی در فرمول زیر، نیاز است که Calcules بلد باشید، اما اگر آشنایی ندارد، مشکلی نیست می توانید آن را همانطور که هست در نظر بگیرید.

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

پیاده‌سازی

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

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

ابتدا اجازه دهید داده‌ها را ترسیم نماییم.

داده‌های آموزش
داده‌های آموزش
داده‌های تست
داده‌های تست
روش پیاده‌سازی ساده

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

https://gist.github.com/grohith327/34d8e17c27965ba899baa6dc0355a099#file-lr_sk_1-py

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

https://gist.github.com/grohith327/13099b9cdda47d6b742ae4b8043fff15#file-lr_sk_2-py

از scikit Learn برای اعمال‌کردن مدل رگرسیون خطی استفاده شده‌است. مدل را بر روی داده های آموزشی فیت می کنیم و مقادیر داده های آزمایش را پیش بینی می کنیم. سپس از R2 Score برای اندازه گیری دقت مدل استفاده می شده‌است.

روش پیاده‌سازی پیچیده‌تر

حال می‌خواهیم رگرسیون خطی را با توجه به معادلات بالا بسازیم. فقط از کتابخانه numpy برای محاسبات و از امتیاز R2 برای معیارها استفاده خواهیم کرد.

https://gist.github.com/grohith327/6f3a733dc90fc3595bad43d4f5658a2a#file-lr_np_1-py

مقدار 0.0 را برای a_0 و a_1 مقداردهی اولیه می کنیم سپس برای 1000 ایپاک میزان خطا را محاسبه کرده و با استفاده از خطا، گرادیان ها را محاسبه می کنیم سپس با استفاده از گرادیان ها، مقادیر a_0 و a_1 را به روزرسانی می کنیم. پس از 1000 ایپاک، بهترین مقادیر برای a_0 و a_1 به‌دست می‌آید و از این رو، می‌توانیم بهترین رگرسور را بیابیم.

https://gist.github.com/grohith327/0c65438acb7f43968e2b88d6f4cc636b#file-lr_np_2-py

مجموعه تست شامل 300 نمونه است، بنابراین باید a_0 و a_1 را از 700×1 به 300×1 تغییر شکل دهیم. اکنون می‌توانیم از معادله برای پیش‌بینی مقادیر در مجموعه تست و به دست آوردن امتیاز R2 استفاده کنیم.

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

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

نتیجه

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

برای خرید کتاب Hands-On Machine Learning with Scikit-Learn می‌توانید اینجا کلیک نمایید


مارا در صفحات اجتماعی دنبال کنید.


رگرسیون خطییادگیری ماشینعلمهوش مصنوعیکتاب
naderyab.ir
شاید از این پست‌ها خوشتان بیاید