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

مقدمه‌ای بر الگوریتم‌های یادگیری ماشین: رگرسیون لجستیک (Logistic Regression)

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

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

تابع سیگموید (تابع لوجستیک)

الگوریتم رگرسیون لجستیک نیز از یک معادله خطی با پیش بینی کننده های مستقل برای پیش بینی یک مقدار استفاده می کند. مقدار پیش بینی شده می تواند بین منفی بی نهایت تا مثبت بی نهایت باشد. ما نیاز داریم که خروجی الگوریتم متغیر کلاس باشد، یعنی 1 برای کلاس yes و 0 برای کلاس no. بنابراین، ما خروجی معادله خطی را در محدوده [0،1] انتقال می‌دهیم. برای انتقال مقدار پیش بینی شده بین 0 و 1، از تابع سیگموئید استفاده می کنیم.

خروجی (z) معادله خطی را می گیریم و به تابع g(x) می دهیم که مقدار انتقال، h را برمی گرداند، مقدار h در محدوده 0 تا 1 قرار می گیرد.

همانطور که از نمودار می بینید، تابع سیگموئید برای مقادیر مثبت x به y=1 مجانبی می‌شود و برای مقادیر منفی x تبدیل به y=0 مجانبی می شود.

تابع هزینه

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

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

محاسبه گرادیان

ما مشتقات جزئی تابع هزینه را با توجه به هر پارامتر (theta_0، theta_1، …) می گیریم تا گرادیان ها را بدست آوریم. با کمک این گرادیان ها، می توانیم مقادیر theta_0، theta_1، … را به روز کنیم. برای درک معادلات زیر به مقداری حساب دیفرانسیل و انتگرال نیاز دارید.

اما، اگر قادر به درک آنها نیستید، می توانید در قسمت کامنت سوال بپرسید یا می توانید آنها را همانطور که هستند در نظر بگیرید.

پیاده‌سازی در پایتون

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

https://gist.github.com/iamjalipo/e19ea7df463bfec7b9df46a7eb1a02bd#file-logistic-01-py

ما داده ها را با استفاده از کتابخانه pandas بارگذاری می کنیم. مجموعه داده IRIS دارای سه مقدار هدف است (‘Iris-virginica’, ‘Iris-setosa’, ‘Iris-versicolor’). از آنجایی که می‌خواهیم یک الگوریتم طبقه‌بندی باینری را پیاده‌سازی کنیم، تصمیم گرفتم ردیف‌هایی را با مقدار هدف Iris-virginica رها کنم. اکنون، ما فقط دو کلاس هدف برای پیش‌بینی داریم. متغیرهای مستقل و وابسته را از مجموعه داده استخراج می کنیم. حال بیایید به مهیاسازی داده های آموزش و تست بپردازیم.

https://gist.github.com/iamjalipo/6c98ab4de5957a5ee2bd6dd849aedbd8#file-logistic-02-py

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

https://gist.github.com/iamjalipo/89bfa037454dbe9c292ea8c4b9663b8d#file-logistic-03-py

ما پارامترها (theta_0، theta_1،…) را با 0 مقداردهی اولیه می کنیم. در طول هر ایپاک، مقادیر را با استفاده از معادله خطی محاسبه می کنیم، مقادیر را در محدوده 0 تا 1 منتقل می کنیم و سپس خطا را محاسبه می کنیم. از تابع خطا، گرادیان ها را برای هر پارامتر محاسبه می کنیم و مقادیر آنها را با ضرب گرادیان ها در آلفا به روز می کنیم. آلفا نرخ یادگیری الگوریتم است. پس از 10000 ایپاک، الگوریتم ما به نقطه‌ی بهینه می‌رسد. سپس می‌توانیم الگوریتم خود را با داده های تست آزمایش کنیم.

https://gist.github.com/iamjalipo/a5c57dc313dadb37b2d512c73ffa0447#file-logistic-04-py

ما ویژگی های داده های تست را مشابه داده های آموزشی آماده می کنیم. ما همچنین مقادیر theta_0، theta_1، theta_2، theta_3 و theta_4 را از 90×1 به 10×1 برش می‌دهیم، زیرا تعداد نمونه‌های آزمایشی تنها 10 است. کلاس‌های تست را محاسبه می‌کنیم و دقت مدل خود را بررسی می‌کنیم.

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

https://gist.github.com/iamjalipo/2451a30763ee22e7111b0776d3ae8995#file-logistic-05-py
نمودار تغییرات میزان خطا
نمودار تغییرات میزان خطا

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

https://gist.github.com/iamjalipo/f4dbad22090659e6181bf54821164ce0#file-logistic-06-py

بیش از 50 خط کد به کمتر از 10 خط کد کاهش یافت. ما همچنین از طریق کلاس رگرسیون لجستیک کتابخانه scikit Learn دقت 100٪ را دریافت می کنیم.

نتیجه‌گیری

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

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



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

رگرسیون لجستیکیادگیری ماشینآمارریاضینادریاب
naderyab.ir
شاید از این پست‌ها خوشتان بیاید