مقدمه ای بر الگوریتم های یادگیری ماشین - ماشین بردار پشتیبان (SVM)

ماشین بردار پشتیبانمقدمهمی‌پندارم که با الگوریتم‌های رگرسیون خطی و رگرسیون لجستیک آشنا شده‌باشید. اگر نه، پیشنهاد می کنم قبل از حرکت به سمت ماشین بردار پشتیبان، نگاهی به آنها بیندازید. ماشین بردار پشتیبان الگوریتم ساده دیگری است که هر متخصص یادگیری ماشین باید در پس ذهن خود داشته باشد. ماشین بردار پشتیبان توسط بسیاری ترجیح داده می شود زیرا دقت قابل توجهی با توان محاسباتی کمتر تولید می کند. ماشین بردار پشتیبان، به اختصار SVM می تواند برای هر دو وظایف رگرسیون و دسته‌بندی استفاده شود. اما، به طور گسترده ای در اهداف دسته‌بندی استفاده می شود.ماشین بردار پشتیبان چیست ؟هدف از الگوریتم ماشین بردار پشتیبان، یافتن یک ابر صفحه در یک فضای N بعدی (N – تعداد ویژگی ها) است که نقاط داده را با تفکیک بالا دسته‌بندی می کند.پیدا کردن بهترین ابرصفحهپیدا کردن بهترین ابرصفحهبرای جدا کردن دو دسته از نقاط داده، ابرصفحه های زیادی ممکن است وجود داشته‌باشد که می توان از بین آنها انتخاب کرد. هدف ما این است که صفحه ای را پیدا کنیم که حداکثر حاشیه (margin)، یعنی حداکثر فاصله بین نقاط داده هر دو کلاس را داشته باشد. به حداکثر رساندن فاصله حاشیه مقداری، دسته‌بندی کردن نقاط جدید با دقت بالاتر تظمین می‌کند.ابر صفحات و بردار‌های پشتیبانیک ابرصفحه در فضای دوبعدی و سه‌بعدیابرصفحه‌ها مرزهای تصمیم گیری هستند که به طبقه بندی نقاط داده کمک می کنند. نقاط داده ای که در دو طرف ابر صفحه قرار می گیرند را می توان به کلاس های مختلف نسبت داد. همچنین، ابعاد ابرصفحه به تعداد ویژگی ها بستگی دارد. اگر تعداد ویژگی های ورودی 2 باشد، آنگاه هایپرپلن فقط یک خط است. اگر تعداد ویژگی های ورودی 3 باشد، ابر صفحه به یک صفحه دو بعدی تبدیل می شود. تصور زمانی که تعداد ویژگی ها از 3 بیشتر شود دشوار می شود.بردارهای پشتیبانبردارهای پشتیبان نقاط داده ای هستند که به ابر صفحه نزدیکتر هستند و بر موقعیت و جهت ابر صفحه تأثیر می گذارند. با استفاده از این بردارهای پشتیبانی، حاشیه دسته‌بندی کننده را به حداکثر می رسانیم. حذف بردارهای پشتیبانی موقعیت ابرصفحه را تغییر می دهد. باید توجه داشت که موقعیت و در نظرگرفتن این نقاط، نکاتی هستند که به ما در ساخت SVM کمک می کنند.حاشیه‌ی بزرگ (Large Margin)در رگرسیون لجستیک، خروجی تابع خطی را می گیریم و مقدار را به محدوده [0,1] با استفاده از تابع سیگموئید انتقال می‌دهیم. اگر مقدار انتقال داده‌شده بزرگتر از یک مقدار آستانه (0.5) باشد، به آن برچسب 1 و در غیر این صورت برچسب 0 به آن اختصاص می دهیم. در SVM، خروجی تابع خطی، اگر بزرگتر از 1 باشد آن را نظیر یک کلاس و اگر خروجی -1 باشد، با کلاس دیگری در نظر می‌گیریم. از آنجایی که مقادیر آستانه در SVM به 1 و -1 تغییر کرده‌است، این محدوده ([-1,1]) را بعنوان حاشیه در نظر می‌گیریم.تابع هزینه و بروزرسانی گرادیاندر الگوریتم SVM، ما به دنبال به حداکثر رساندن حاشیه بین نقاط داده و ابرصفحه هستیم. تابع هزینه که به به حداکثر رساندن این حاشیه کمک می کند، تابع خطای hinge است.اگر مقدار پیش‌بینی‌شده و مقدار واقعی علامت یکسانی داشته باشند، خطا صفر است. اگر برخلاف این بود، ما میزان ضرر را محاسبه می کنیم. ما همچنین یک پارامتر تعدیل‌کننده (regularizer) به تابع هزینه اضافه می کنیم که هدف آن ایجاد تعادل بین حداکثر کردن حاشیه و میزان ضرر است. پس از افزودن پارامتر تعدیل‌کننده، توابع هزینه به صورت زیر می‌شود.اکنون که تابع خطا را داریم، مشتقات جزئی را با توجه به وزن ها می گیریم تا گرادیان‌ها را پیدا کنیم. با استفاده از گرادیان‌ها می توانیم وزن های خود را به روز رسانی کنیم.هنگامی که دسته‌بندی اشتباهی وجود ندارد، یعنی مدل ما به درستی، کلاس نقاط را پیش بینی می کند، ما فقط نیاز داریم گرادیان را از پارامتر تعدیل‌کننده به روز کنیم.هنگامی که یک دسته‌بندی اشتباه وجود دارد، یعنی مدل در پیش بینی کلاس نقاط داده اشتباه می کند، دز این هنگام خطا را به همراه پارامتر تعدیل‌کننده برای به روز رسانی گرادیان لحاظ می کنیم.پیاده‌سازی SVM در زبان پایتونمجموعه داده ای که ما برای پیاده سازی الگوریتم SVM خود استفاده خواهیم کرد مجموعه داده Iris است. می توانید آن را از این لینک دانلود کنید. https://gist.github.com/iamjalipo/9cd77445f4c86bec735ec96599361f89#file-svm-01-py از آنجایی که مجموعه داده Iris دارای سه کلاس است، یکی از کلاس ها را حذف می کنیم. این به‌ ما کمک می‌کند تا با یک دسته‌بندی دو کلاسه مواجه باشیم. https://gist.github.com/iamjalipo/a78b8a84bb9609f64cc76030ddc50588#file-svm-02-py نمایش نقاط داده در صفحه‌ی دوبعدی مجموعه‌ی داده ما شامل ۴ ویژگی می‌باشد. ما فقط از دو ویژگی استفاده خواهیم کرد، یعنی Sepal Length و Petal Length. ما این دو ویژگی را می گیریم و آنها را در فضای دو بعدی ترسیم می کنیم. از نمودار بالا، می توانید استنباط کنید که می توان از یک بردار خطی برای جداسازی نقاط داده استفاده کرد. https://gist.github.com/iamjalipo/3d2d7336239b40a66ce473dd2f8222d5#file-svm-03-py ما ویژگی های مورد نیاز را استخراج می کنیم و آن را به داده های آموزشی و تست تقسیم می کنیم. 90 درصد داده ها برای آموزش و 10 درصد بقیه برای تست استفاده می شود. اکنون مدل SVM خود را با استفاده از کتابخانه numpy می‌سازیم. https://gist.github.com/iamjalipo/7f33632b4a98bde4000e41239a26a03f#file-svm-04-py آلفا α= (0.0001) نرخ یادگیری است و پارامتر تعدیل‌کننده λ بر روی (epoch)/1 تنظیم شده است. بنابراین، مقدار تعدیل‌کننده با افزایش ایپاک‌ها کاهش می‌یابد. https://gist.github.com/iamjalipo/dc300035ecc70dcf1a12c533d913106b#file-svm-05-py اکنون ویژگی ها را از داده های تست استخراج می کنیم و مقادیر را پیش بینی می کنیم. مقادیر پیش‌بینی شده را با مقادیر واقعی مقایسه می کنیم و دقت مدل خود را چاپ می کنیم.راه ساده دیگری برای پیاده سازی الگوریتم SVM وجود دارد. ما می توانیم از کتابخانه Scikit Learn استفاده کنیم و فقط توابع مربوطه را برای پیاده سازی مدل SVM فراخوانی کنیم. تعداد خطوط کد لازم برای پیاده‌سازی به طور قابل توجهی کاهش می یابد. https://gist.github.com/iamjalipo/e8c44eef5f70b25dc0f2abb8b59d5006#file-svm-06-py نتیجهماشین بردار پشتیبان یک الگوریتم زیبا و قدرتمند است. ازش به خوبی استفاده کن :))برای خرید کتاب Hands-On Machine Learning with Scikit-Learn می‌توانید اینجا کلیک نماییدمارا در صفحات اجتماعی دنبال کنید.تلگرام : t.me/naderyabاینستاگرام: https://www.instagram.com/naderyabiran/توییتر: https://twitter.com/naderyabوبلاگ: https://naderyab.ir/blog/