رگراسیون لجستیک به زبان ساده

سلام (= اگه به پست های قبلیم نگاهی انداخته باشین، درباره رگراسیون (Regression) توضیح دادم و لازم بود مطلبی هم درباره ی دسته بندی (Classification) بنویسم. یه مطلب برای مفهوم و یه مطلب هم برای پیاده سازی توی پایتون. اینجا قراره درباره مفهوم و فرایند کار رگراسیون لجستیک (Logistic Regression) حرف بزنیم. نه اشتباه نکنین! این رگراسیون با اون رگراسیون فرق داره -ــــ- رگراسیون لجستیک شاخه ای از دسته بندیه و هیچ ربطی هم به رگراسیون( که پیش بینی عددی و کمّی انجام میده) نداره! قبل از شروع پیشنهاد میکنم درباره ی رگراسیون خطی بخونین؛ چون خیلی به درک مفاهیم این مبحث کمک میکنه. اینجا خودم یه توضیح به زبان ساده براش گذاشتم(= خب، بریم سر اصل مطلب. طبق معمول یه دیتاست داریم که قراره بدیم به سیستم، سیستم اون رو بررسی کنه و به کمک الگوریتمی که ازش کشف کرده برای ما مقادیری رو پیش بینی کنه. توی رگراسیون پیش بینی به این صورت بود که یه عدد (که میتونست هرمقداری باشه) به ما خروجی میداد. مثلا دمای هوا رو به سیستم میدادیم و سیستم میزان فروش بستنی فروشی رو برامون حدس میزد. اما توی دسته بندی، قضیه یکم فرق داره. اینجا سیستم قراره از بین چندتا گزینه انتخابی رو انجام بده. مثلاً وزن و قد یه فرد رو بگیره، و جنسیتش رو حدس بزنه. پس سیستم اینجا قراره «انتخاب» کنه. مثالی که اینجا میخوایم بررسی کنیم، باز هم به بستنی مربوطه (= به نمودار پایین نگاه کنین:این نمودار بستنی خریدنِ آقای حیف نونه که تو دماهای مختلف ثبت شده! یک توی محور ایگرگ ها یعنی توی اون دما بستنی خریده و صفر یعنی نخریده. طبیعتاً هرچی دما بالاتر رفته احتمال بستنی خریدنش بیشتر شده. هرچند روزی هم بوده که سرد بوده ولی زده به سرش و بستنی خریده، و یا روزای گرمی که پول نداشته بستنی بخره! اما کلیت نمودار درستی رابطه دما با خرید بستنی رو نشون میده. خب؛ بیاین این رابطه رو پیدا کنیم. به نمودار دوباره نگاه کنین؛ از حوالی دمای 18 درجه و بیشتر، حیف نون غالباً بستنی خریده و برای قبل از اون حس کرده هوا زیادی سرده واسه بستنی خوردن (هرچند بستنی تو هر دمایی میچسبه (= ). پس الگوریتمی که قراره پیاده سازی کنیم باید این رو متوجه بشه و به ازای ورودی های بیشتر از 18 بگه بستنی خریده و برای ورودی های کمتر از 18 بگه نخریده. از اونجایی که رگراسیون خطی رو بلدیم، میتونیم ازش به عنوان یه مدل پیشبینی کننده استفاده کنیم. یعنی به صورت نمودار پایین:همونطوری که میبینین، میتونیم این خط رو رسم کنیم؛ نکته اینه که به ازای ورودی هایی که بهش میدیم، اگه خروجی از 0.5 بزرگتر یا مساویش باشه، سیستم اون رو یک درنظر میگیره (یعنی بستنی خریده) و به ازای خروجی های کوچیکتر از 0.5 هم 0 رو خروجی میده (یعنی بستنی نخریده). برنامه همونجوری که میخواستیم برای دماهای بیشتر از 18 به ما 1 خروجی میده و برای کمتر از اون هم 0 خروجی میده. تا اینجا به نظر میاد مشکل حل شده و ما با همون دانسته های قبلیمون از پس این مسئله هم براومدیم؛ اما یه مشکلی برای این مدل وجود داره! فرض کنین توی دمای 57 درجه که دمای عجیب و خیلی زیادیه، آقای حیف نون بستنی خریده. یعنی نمودار زیر:حالا اگه برای این حالت هم با کمک رگراسیون خطی یه خط بسازیم، بعضی از پیشبینی های درست قبلی از بین میره و دیگه اون مرز 18درجه رعایت نمیشه. درواقع به خاطر یه دیتای دورافتاده، تمام پیشبینی ها واسه دیتاهای دیگه دچار تغییر و بعضا اشتباه میشه. به این صورت:همونطور که می بینین مرز 18درجه به 20درجه تبدیل شده و به ازای ورودی های 18 و 20 جواب اشتباه 0 رو درنظر گرفته. پس رگراسیون خطی برای این نوع از مسئله پیشنهاد خوبی نیست؛ چون کافیه یه دیتای دورافتاده داشته باشیم تا درستی تمام حدسای قبلی زیرسوال بره. پس باید غیر از معادله خط ساده، یه تابعی داشته باشیم که برای مقادیر دورافتاده، بقیه مقادیر رو دچار مشکل نکنه و حدس معقولی هم بده. خوشبختانه، این تابع وجود داره و بهش میگیم تابع سیگموید (Sigmoid)! ببینین:از خواص خوب این تابع اینه که همیشه بین صفر و یک قرار میگیره و برای مسئله ما بی نقص به نظر میاد. با فرض اینکه با مفاهیم تابع فرض (hypothesis) و تابع هزینه (cost) آشنایی دارین یکم بیشتر درباره ی تابع سیگموید توضیح میدم. (اگه هم نمیدونین این دو تابع چی ان و به چه درد میخورن این مطلب رو بخونین =) ) تابع فرض توی رگراسیون خطی به صورت y = θ₀ + θ₁x بود و یه خط رو برامون می ساخت. اما اینجا تابع فرض رو مساوی تابع سیگموید میذاریم و اینجوری حدسی که سیستم میزنه همیشه بین 0 و 1 قرار میگیره. از طرفی اگه یه عدد دور افتاده مثل 57درجه رو ورودی بهش بدیم، با تقریب خیلی خوبی 1 حدس میزنه. پس این از تابع فرضمون. اما تابع هزینه چی؟ اگه از تابع هزینه توی رگراسیون خطی استفاده کنیم به نمودار عجیب و غریبی میرسیم که پر از مینیمم های موضعیه و ممکنه هیچوقت به مینیمم مطلق نرسیم:خب باز هم میگم، از قیافه فرمول بالا نترسین! ما اینجا کاری باهاش نداریم (= فقط بدونین اون بی ریخت، تابع هزینه برای رگراسیون خطیه! اما تابع هزینه برای رگراسیون لجستیک فرق میکنه. اینجا تابع هزینه یک تابع لگاریتمیه که فرمولش به این صورت نوشته میشه:خوشبختانه به اندازه ی فرمول قبلی ترسناک نیست (= اما به اندازه ی کافی گیج کننده هست! بذارین توضیحش بدم. ما توی رگراسیون خطی میومدیم فاصله ی هر نقطه روی نمودار با نقطه ای که برنامه حدس زده رو حساب میکردیم و جمع میزدیم و این جمع رو به حداقل میرسوندیم. اینجا اما لازم نیست فاصله دو نقطه رو حساب کنیم. نقاط روی نمودار یا صفر هستن یا یک و برای هرحالتشون یه تابع داریم. فرض کنیم برای نقطه ی 20درجه که y=1 هست (ینی تو دمای 20 درجه بستنی خریده)، قراره تابع هزینه رو حساب کنیم. میریم سراغ شرط اول و تابع هزینه مون میشه J = -log(hθ(x)) . اگه نمودار این تابع رو رسم کنیم این شکلی میشه:حالا این نمودار چه چیزی رو داره به ما میگه؟ میدونیم که توی این حالت جواب حقیقی 1 بوده (y=1). حالا هرچی اون hθ(x) (یا همون تابع فرض) به 1 نزدیک تر باشه مقدار تابع هزینه هم کمتر و کمتر میشه. تاجایی که اگه hθ(x) مساوی یک باشه، تابع هزینه مساوی صفر میشه (به نمودار نگاه کنین). این یعنی سیستم کاملاً درست جواب رو حدس زده! از طرف دیگه، هرچی پیشبینی از جواب حقیقی دورتر باشه (یعنی hθ(x) به صفر نزدیک تر باشه) تابع هزینه هم بزرگتر میشه و یه جورایی داره میفهمونه که این جواب خوبی نیست. به همین شکل میتونیم حالت دوم تابع هزینه که به ازای y=0 هست رو توضیح بدیم. نمودارش رو براتون میذارم، اما تفسیر و توضیحش با خودتون! (=مابقی مراحل مثل رگراسیون خطیه. یعنی به حداقل رسوندن تابع هزینه، به همون صورتی انجام میشه که توی رگراسیون خطی انجام میدادیم. حالا با روشهایی مثل گرادیان نزولی (Gradient Descent) یا معادله ی نرمال (Normal Equation) و یا روش های دیگه. خب این مطلب هم تموم شد! توی مطلب بعدی قراره این الگوریتم رو توی پایتون پیاده سازی کنیم! (=