در این مقاله با SVM یا Support Vector Machine که یکی از محبوب ترین الگوریتم های هوش مصنوعی هست (یکی از 10 الگوریتم برتر هوش مصنوعی هست) و با ترفند هسته که با ابعاد غیرخطی و بالاتر سروکار دارد آشنا خواهید شد . برای درک بهتر این الگوریتم بسیار مهم، موضوعاتی مانند ابرصفحه ها، ضرب کننده های لاگرانژ را لمس خواهیم کرد.
ماشین بردار پشتیبان یک الگوریتم یادگیری نظارت شده هست که بیشتر برای طبقه بندی استفاده می شود اما می توان از آن برای رگرسیون نیز استفاده کرد . ایده اصلی این هست که بر اساس دادههای برچسبگذاری شده (دادههای آموزشی) الگوریتم سعی میکند ابر صفحه بهینه را پیدا کند که بتوان از آن برای طبقهبندی نقاط داده جدید استفاده کرد. در دو بعد، هایپرپلن یک خط ساده هست.
معمولاً یک الگوریتم یادگیری سعی میکند رایجترین ویژگیها (آنچه یک کلاس را از کلاس دیگر متمایز میکند) یک کلاس را بیاموزد و طبقهبندی براساس آن ویژگیهای نمایندهای هست که آموخته شده هست (بنابراین طبقهبندی بر اساس تفاوت بین کلاسها هست). SVM برعکس عمل می کند . مشابه ترین نمونه ها را بین کلاس ها پیدا می کند . این بردارهای پشتیبانی خواهند بود .
به عنوان مثال، اجازه دهید دو کلاس، سیب و لیمو را در نظر بگیریم.
سایر الگوریتمها مشهودترین و نمایانترین ویژگیهای سیب و لیمو را یاد میگیرند، مانند سیب سبز و گرد هستند در حالی که لیموها زرد هستند و شکل بیضوی دارند.
در مقابل، SVM سیبهایی را جستجو میکند که بسیار شبیه به لیمو هستند، برای مثال سیبهایی که زرد هستند و شکل بیضوی دارند. این یک بردار پشتیبانی خواهد بود. بردار ساپورت دیگر یک لیمو شبیه سیب (سبز و گرد) خواهد بود.بنابراینالگوریتم های دیگریاد می گیردتفاوتدر حالی که SVM یاد می گیردشباهت ها.
اگر مثال بالا را به صورت دو بعدی تجسم کنیم، چیزی شبیه به این خواهیم داشت:
همانطور که از چپ به راست می رویم، همه نمونه ها به عنوان سیب طبقه بندی می شوند تا زمانی که به سیب زرد برسیم. از این نقطه، اطمینان به اینکه یک مثال جدید یک سیب هست کاهش می یابد در حالی که اعتماد به نفس کلاس لیمو افزایش می یابد. وقتی اعتماد کلاس لیمو از اعتماد کلاس سیب بیشتر شود، نمونه های جدید به عنوان لیمو (جایی بین سیب زرد و لیمو سبز) طبقه بندی می شوند.
بر اساس این بردارهای پشتیبان، الگوریتم سعی می کند بهترین هایپرپلنی را که کلاس ها را از هم جدا می کند، بیابد . در حالت دوبعدی، هایپرپلان یک خط هست، بنابراین به شکل زیر هست:
خوب، اما چرا مرز آبی را مانند تصویر بالا رسم کردم؟ من همچنین می توانم مرزهایی را مانند این ترسیم کنم:
همانطور که می بینید، ما تعداد بی نهایتی از احتمالات برای ترسیم مرز تصمیم داریم . پس چطور می توانیم بهترین را پیدا کنیم؟
به طور شهودی بهترین خط خطی هست که از هر دو نمونه سیب و لیمو فاصله زیادی دارد (بیشترین حاشیه را دارد). برای داشتن راه حل بهینه، باید حاشیه را به هر دو صورت به حداکثر برسانیم (اگر چند کلاس داریم، باید با در نظر گرفتن هر یک از کلاس ها آن را به حداکثر برسانیم).
بنابراین اگر تصویر بالا را با تصویر زیر مقایسه کنیم، به راحتی می توانیم مشاهده کنیم که اولی ابر صفحه بهینه (خط) و دومی یک راه حل زیر بهینه هست ، زیرا حاشیه به مراتب کوتاهتر هست.
از آنجایی که میخواهیم حاشیهها را با در نظر گرفتن همه کلاسها به حداکثر برسانیم ، به جای استفاده از یک حاشیه برای هر کلاس، از یک حاشیه “global” استفاده میکنیم که تمام کلاسها را در نظر میگیرد . این حاشیه مانند خط بنفش در تصویر زیر هست:
این حاشیه نسبت به مرز متعامد و با بردارهای پشتیبانی فاصله دارد.
پس کجا بردار داریم؟ هر یک از محاسبات (محاسبه فاصله و ابرصفحه های بهینه) در فضای برداری انجام می شود ، بنابراین هر نقطه داده یک بردار در نظر گرفته می شود. بعد فضا با تعداد ویژگی های مثال ها تعریف می شود.
در مجموع، بردارهای پشتیبان نقاط داده ای هستند که موقعیت و حاشیه هایپرپلین را مشخص می کنند . ما آنها را بردارهای "پشتیبانی" می نامیم ، زیرا اینها نقاط داده نماینده کلاس ها هستند، اگر یکی از آنها را جابجا کنیم، موقعیت و/یا حاشیه تغییر می کند . جابجایی سایر نقاط داده تأثیری بر حاشیه یا موقعیت ابرصفحه نخواهد داشت.
برای طبقه بندی، ما به تمام نقاط داده آموزشی نیاز نداریم (مانند مورد KNN)، ما باید فقط بردارهای پشتیبانی را ذخیره کنیم. در بدترین حالت، تمام نقاط بردار پشتیبانی خواهند بود، اما این بسیار نادر هست و اگر این اتفاق بیفتد، باید مدل خود را از نظر خطا یا اشکال بررسی کنید.
بنابراین اساساً یادگیری معادل یافتن هایپرپلن با بهترین حاشیه هست، بنابراین یک مسئله بهینه سازی ساده هست.
مراحل اساسی SVM عبارتند از:
این بسیار خوب و آسان هست ، اما پیدا کردن بهترین حاشیه، مشکل بهینهسازی بیاهمیت نیست (در دو بعدی آسان است، وقتی فقط دو ویژگی داریم، اما اگر N بعد با N یک عدد بسیار بزرگ داشته باشیم چه میشود)
برای حل مسئله بهینه سازی، از ضریب لاگرانژ استفاده می کنیم . برای درک این تکنیک میتوانید دو مقاله زیر را بخوانید: ضربکننده دوگانه لانگرانژ و توضیحی ساده درباره اینکه چرا ضربکنندههای لانگرانژ کار میکنند .
تا به حال ما دادههای قابل جداسازی خطی داشتیم، بنابراین میتوانستیم از یک خط به عنوان مرز کلاس استفاده کنیم. اما اگر مجبور باشیم با مجموعه داده های غیرخطی سر و کار داشته باشیم چه؟
نمونه ای از داده های غیر خطی:
در این حالت ما نمی توانیم یک خط مستقیم برای جدا کردن سیب از لیمو پیدا کنیم. پس چگونه می توانیم این مشکل را حل کنیم. ما از ترفند هسته استفاده خواهیم کرد!
ایده اصلی این هست که وقتی یک مجموعه داده در ابعاد فعلی جدایی ناپذیر هست، بعد دیگری اضافه کنید ، شاید به این ترتیب داده ها قابل تفکیک باشند. فقط به آن فکر کنید، مثال بالا به صورت دو بعدی هست و غیرقابل تفکیک هست، اما ممکنه در سه بعدی بین سیب ها و لیموها فاصله وجود داشته باشد، شاید تفاوت سطح وجود داشته باشد، بنابراین لیموها در سطح یک و سیب ها در سطح دو هستند. . در این حالت، ما به راحتی میتوانیم یک ابر صفحه جداکننده (در حالت سه بعدی، هایپرپلین یک صفحه هست) بین سطح 1 و 2 رسم کنیم.
برای حل این مشکل ما نباید فقط کورکورانه بعد دیگری اضافه کنیم ، بلکه باید فضا را تغییر دهیم تا این اختلاف سطح را عمدا ایجاد کنیم.
فرض کنید بعد دیگری به نام X3 را اضافه می کنیم . تغییر مهم دیگر اینه که در بعد جدید نقاط با استفاده از این فرمول x1² + x2² سازماندهی می شوند .
اگر صفحه تعریف شده با فرمول x² + y² را رسم کنیم ، چیزی شبیه به این خواهیم داشت:
حالا باید سیب ها و لیموها (که فقط نقاط ساده هستند) را به این فضای جدید ترسیم کنیم. خوب فکر کنید، ما چه کار کردیم؟ ما فقط از یک تبدیل استفاده کردیم که در آن سطوح را بر اساس فاصله اضافه کردیم . اگر در مبدا هستید، امتیازها در پایین ترین سطح خواهند بود. با دور شدن از مبدأ به این معنی هست که از تپه بالا می رویم (از مرکز هواپیما به سمت حاشیه حرکت می کنیم) بنابراین سطح نقاط بالاتر می رود. حال اگر در نظر بگیریم که منشا لیموی مرکز هست ، چیزی شبیه به این خواهیم داشت:
حالا به راحتی می توانیم این دو کلاس را از هم جدا کنیم. این تبدیل ها هسته نامیده می شوند . هسته های محبوب عبارتند از: هسته چند جمله ای، هسته گاوسی، تابع پایه شعاعی (RBF)، هسته RBF لاپلاس، هسته سیگموئید، هسته Anove RBF و غیره (به توابع هسته یا توضیحات دقیق تر به هسته های یادگیری ماشین مراجعه کنید ).
مثال ساده تر دیگر در 2 بعدی این هست:
پس از استفاده از کرنل و پس از تمام تبدیل ها به این موارد خواهیم رسید:
بنابراین پس از تبدیل، به راحتی می توانیم دو کلاس را تنها با استفاده از یک خط مشخص کنیم.
در برنامه های زندگی واقعی، ما یک خط مستقیم ساده نخواهیم داشت، اما منحنی های زیادی و ابعاد بالایی خواهیم داشت. در برخی موارد، ما دو ابرصفحه نداریم که دادهها را بدون هیچ نقطهای بین آنها از هم جدا میکند، بنابراین به برخی معاوضهها، تحمل برای نقاط پرت نیاز داریم . خوشبختانه الگوریتم SVM دارای یک پارامتر به اصطلاح منظم سازی برای پیکربندی مبادله و تحمل موارد پرت هست.
همانطور که در بخش قبل دیدیم، انتخاب هسته مناسب بسیار مهم هست، زیرا اگر تبدیل نادرست باشد، مدل می تواند نتایج بسیار ضعیفی داشته باشد. به عنوان یک قاعده کلی، همیشه بررسی کنید که آیا داده های خطی دارید و در این صورت همیشه از SVM خطی (هسته خطی) استفاده کنید. SVM خطی یک مدل پارامتریک هست، اما یک SVM هسته RBF اینطور نیست ، بنابراین پیچیدگی دومی با اندازه مجموعه آموزشی افزایش مییابد. نه تنها آموزش یک SVM هسته RBF گرانتر هست ، بلکه باید ماتریس هسته را نیز در اطراف نگه دارید ، و طرح ریزی در این فضای "بی نهایت" با ابعاد بالاترجایی که داده ها به صورت خطی قابل تفکیک می شوند، در طول پیش بینی نیز گران تر است. علاوه بر این، شما باید هایپرپارامترهای بیشتری را تنظیم کنید ، بنابراین انتخاب مدل نیز گران تر هست! و در نهایت، بیش از حد یک مدل پیچیده بسیار ساده تره!
پارامتر Regularization ( در پایتون C نامیده می شود ) به بهینه سازی SVM می گوید که چقدر می خواهید از دسته بندی هر نمونه آموزشی جلوگیری کنید.
اگر C بالاتر باشد ، بهینه سازی هایپرپلان حاشیه کوچکتری را انتخاب می کند ، بنابراین نرخ طبقه بندی از دست دادن داده های آموزشی کمتر خواهد بود .
از سوی دیگر، اگر C کم باشد ، حاشیه بزرگ خواهد بود ، حتی اگر نمونههای دادههای آموزشی طبقهبندیشده وجود نداشته باشد . این در دو نمودار زیر نشان داده شده:
همانطور که در تصویر می بینید، وقتی C کم هست، حاشیه بالاتره (بنابراین به طور ضمنی منحنی زیادی نداریم، خط دقیقاً از نقاط داده تبعیت نمی کند) حتی اگر دو سیب به عنوان لیمو طبقه بندی شوند. هنگامی که C بالا هست ، مرز پر از منحنی هست و تمام داده های آموزشی به درستی طبقه بندی شده. فراموش نکنید ، حتی اگر تمام داده های آموزشی به درستی طبقه بندی شده باشند، این بدان معنا نیست که افزایش C همیشه دقت را افزایش میده (به دلیل برازش بیش از حد).
پارامتر مهم بعدی گاما هست. پارامتر گاما تعیین می کند که تأثیر یک مثال آموزشی تا چه حد می رسد . این بدان معنیه که گامای بالا فقط نقاط نزدیک به ابر صفحه قابل قبول را در نظر می گیرد و گامای پایین نقاطی را در فاصله بیشتر در نظر می گیرد.
همانطور که می بینید، کاهش گاما به این نتیجه می رسد که پیدا کردن ابر صفحه صحیح، نقاطی را در فواصل بیشتر در نظر می گیرد، بنابراین نقاط بیشتر و بیشتری استفاده می شود (خطوط سبز نشان می دهد که در پیدا کردن ابر صفحه بهینه کدام نقاط در نظر گرفته شده).
آخرین پارامتر حاشیه هست. ما قبلاً در مورد حاشیه صحبت کردهایم، حاشیه بالاتر مدل بهتری را نشان میدهد ، بنابراین طبقهبندی (یا پیشبینی) بهتر. حاشیه باید همیشه حداکثر شود .
تمامی کدها و منابع مورد این سری مقالات در گیتهاب به آدرس زیر وجود داره ، حتما بررسی کنید!
https://github.com/MahdiMashayekhi-AI/Machine-Learning-Projects
از آنجایی که کتابخانه sklearn یک کتابخانه پایتون بسیار خوب و مفید هست ، ما کد زیادی برای تغییر نداریم. تنها تفاوت اینه که ما باید کلاس SVC (SVC = SVM در sklearn) را به جای کلاس KNeighborsClassifier از sklearn.neighbors از sklearn.svm وارد کنیم.
# Fitting SVM to the Training set from sklearn.svm import SVC classifier = SVC(kernel = 'rbf', C = 0.1, gamma = 0.1) classifier.fit(X_train, y_train)
پس از وارد کردن SVC، می توانیم مدل جدید خود را با استفاده از سازنده از پیش تعریف شده ایجاد کنیم. این سازنده پارامترهای زیادی دارد، اما من فقط مهم ترین آنها را توضیح می دهم، بیشتر اوقات شما از پارامترهای دیگر استفاده نمی کنید.
مهمترین پارامترها عبارتند از:
حالا خروجی اجرای این کد را ببینیم. مرز تصمیم گیری برای مجموعه آموزشی به صورت زیر هست:
همانطور که می بینیم و همانطور که در بخش تنظیمات پارامترها یاد گرفتیم ، چون C مقدار کمی (0.1) دارد، مرز تصمیم صاف هست.
حال اگر C را از 0.1 به 100 برسانیم، منحنی های بیشتری در مرز تصمیم خواهیم داشت:
اگر از C=0.1 استفاده کنیم اما اکنون گاما را از 0.1 به 10 برسانیم چه اتفاقی می افتد؟ اجازه بدید ببینم!
اینجا چه اتفاقی افتاد؟ چرا اینقدر مدل بد داریم؟ همانطور که در بخش پارامترهای تنظیم دیدید ، گامای بالا به این معنیه که هنگام محاسبه ابرصفحه قابل قبول، ما فقط نقاط نزدیک را در نظر می گیریم . اکنون چون چگالی نقاط سبز فقط در ناحیه سبز انتخاب شده زیاده ، در آن ناحیه نقاط به اندازه کافی به ابرصفحه قابل قبول نزدیک هستند، بنابراین آن ابرصفحه ها انتخاب شدند. مراقب پارامتر گاما باشید، زیرا اگر آن را روی یک مقدار بسیار بالا تنظیم کنید، میتواند تأثیر بسیار بدی بر نتایج مدل شما داشته باشد (مقدار بسیار بالا به چگالی نقاط داده بستگی دارد).
برای این مثال بهترین مقادیر برای C و Gamma 1.0 و 1.0 هستند. حال اگر مدل خود را روی مجموعه تست اجرا کنیم، نمودار زیر را دریافت خواهیم کرد:
و ماتریس سردرگمی به شکل زیر است :
همانطور که می بینید، ما فقط 3 مثبت کاذب و فقط 4 منفی کاذب داریم . دقت این مدل 93 درصده که واقعاً نتیجه خوبی است، ما نسبت به استفاده از KNN (که دقت 80 درصدی داشت) امتیاز بهتری به دست آوردیم .
توجه: دقت تنها معیاری نیست که در ML استفاده می شود و همچنین به دلیل پارادوکس دقت بهترین معیار برای ارزیابی یک مدل نیست . ما از این معیار برای سادگی استفاده می کنیم، اما بعداً، در فصل معیارهای ارزیابی الگوریتم های هوش مصنوعی، در مورد پارادوکس دقت صحبت خواهیم کرد و سایر معیارهای بسیار محبوب مورد استفاده در این زمینه را نشان خواهم داد.
در این مقاله ما یک الگوریتم یادگیری نظارت شده بسیار محبوب و قدرتمند، ماشین بردار پشتیبان را دیدیم . ما ایده اصلی را یاد گرفتیم که یک هایپرپلن چیست ، بردارهای پشتیبانی چیست و چرا اینقدر مهم هستند. ما همچنین نمایشهای بصری زیادی را دیدهایم که به ما در درک بهتر همه مفاهیم کمک کردند.
موضوع مهم دیگری که به آن پرداختیم، ترفند هسته هست که به ما در حل مسائل غیر خطی کمک کرد .
ممنون که این مطلب رو خوندید ، اگه سوالی درمورد برنامه نویسی داشتید میتونید در شبکه های اجتمایی من بپرسید.
وبسایت : mahdimashayekhi.ir
گیت هاب: MahdiMashayekhi-AI
لینکدین: MahdiMashayekhi
توییتر: Mashayekhi_AI
یوتیوب: MahdiMashayekhi
اینستاگرام: MahdiMashayekhi.ai