ماشین بردار پشتیبان – به همراه کدنویسی پایتون و R


کسب مهارت در زمینه الگوریتمهای یادگیری ماشین، کاری دشوار و غیر قابل انجام محسوب نمیشود. بسیاری از افراد مبتدی، یادگیری ماشین را با یادگیری رگرسیون آغاز میکنند. رگرسیون مبحثی ساده و یادگیری آن آسان است. اما همه مسائل را نمیتوان با رگرسیون حل کرد. بسیاری از مسائل با روشی غیر از رگرسیون حل میشوند.
الگوریتمهای یادگیری ماشین مانند انواع سلاحهای جنگی از قبیل تبرزین، شمشیر، خنجر و چاقو هستند. همه آنها وسایل تیز و برندهای هستند؛ اما هر یک کاربرد خاص خود را دارند و باید در جایگاه خاصشان مورد استفاده قرار گیرند. الگوریتمهای یادگیری ماشین نیز بسیار متنوع هستند و هر یک برای حل نوع خاصی از مسائل قابل استفاده به حساب میآیند. میتوان تصور کرد «رگرسیون» مانند شمشیری است که قادر به قطعهقطعه کردن و برش دادن دادهها به صورت کارا و مؤثر است، ولی توانایی کار کردن با دادههای دارای پیچیدگی بالا را ندارد.
در حالی که «ماشین بردار پشتیبان» که به انگلیسی به آن Support Vector Machine - و به اختصار SVM - گفته میشود، مانند یک چاقوی بسیار تیز و بران است که برای کار بر روی مجموعه دادههای کوچکتر مناسب است؛ ولی در همین حوزه میتواند، در ساخت مدلها، از برخی از الگوریتمهای دیگر بسیار قدرتمندتر عمل کند. در این نوشتار، یکی از مهمترین الگوریتمهای یادگیری ماشین، یعنی الگوریتم ماشین بردار پشتیبان (SVM)، از صفر تا صد مورد بررسی قرار گرفته است.
سرفصل مطالبی که در این مطلب به آنها پرداخته شده است عبارتند از:
- ماشین بردار پشتیبان (SVM) چیست؟
- الگوریتم ماشین بردار پشتیبان چگونه کار میکند؟
- پیادهسازی ماشین بردار پشتیبان در زبانهای برنامهنویسی پایتون و R
- مزایا و معایب الگوریتم ماشین بردار
ماشین بردار پشتیبان چیست؟
«ماشین بردار پشتیبان» (SVM) یک الگوریتم نظارتشده یادگیری ماشین است که هم برای مسائل طبقهبندی و هم مسائل رگرسیون قابل استفاده است؛ با این حال از آن بیشتر در مسائل طبقهبندی استفاده میشود. در الگوریتم SVM، هر نمونه داده را به عنوان یک نقطه در فضای n-بعدی روی نمودار پراکندگی دادهها ترسیم کرده (n تعداد ویژگیهایی است که یک نمونه داده دارد) و مقدار هر ویژگی مربوط به دادهها، یکی از مؤلفههای مختصات نقطه روی نمودار را مشخص میکند.
سپس، با ترسیم یک خط راست، دادههای مختلف و متمایز از یکدیگر را دستهبندی میکند (مطابق شکل ۱).
شکل ۱ - ترسیم دادهها در فضای n-بعدی در الگوریتم ماشین بردار پشتیبان
به بیان ساده، بردارهای پشتیبان در واقع مختصات یک مشاهده منفرد هستند. ماشین بردار پشتیبان مرزی است که به بهترین شکل دستههای دادهها را از یکدیگر جدا میکند. برای مطالعه بیشتر درباره تعریف بردار پشتیبان و مشاهده چند مثال درباره آن می توانید مطلب «ماشین بردار پشتیبان — به زبان ساده» را مطالعه کنید.
الگوریتم ماشین بردار پشتیبان چگونه کار میکند؟
پیش از این، فرآیند جداسازی دو دسته با یک خط راست مورد بررسی قرار گرفت. اکنون، این پرسش مطرح میشود که «چگونه میتوان این خط راست مناسب را تعیین کرد؟». پاسخ این سؤال در ادامه آورده شده است.
تشخیص خط راست صحیح (سناریو اول): در شکل ۲ سه خط راست B، A و C وجود دارند. اکنون نیاز به تعیین خط راست صحیح برای دستهبندی ستارههای آبی و دایرههای قرمز است.
شکل ۲ - تشخیص خط راست صحیح با الگوریتم ماشین بردار پشتیبان (سناریو ۱)
یک قانون کلیدی وجود دارد که برای تعیین خط راست صحیح باید آن را همواره به یاد داشت: «خط راستی که دو دسته را به طور بهتری از یکدیگر جدا میکند، خطی است که باید انتخاب شود.». در این سناریو، خط «B» به شکل بسیار عالی هر دو دسته را از یکدیگر جدا میکند.
شناسایی خط راست صحیح (سناریو دوم): در شکل 3 هر سه خط B، A و C دسته ستارههای آبی را به خوبی از دایرههای قرمز جدا میکنند. پس چگونه میتوان خط راست صحیح را انتخاب کرد؟
شکل ۳ - تشخیص خط راست صحیح با الگوریتم ماشین بردار پشتیبان (سناریو ۲)
با توجه به شکل ۳، محاسبه فاصله نزدیکترین نقطه داده (که از هر دستهای میتواند باشد) از خط راست میتواند به انتخاب خط راست صحیح کمک کند. به این فاصله حاشیه گفته میشود.
شکل ۴: تشخیص خط راست صحیح با محاسبه حاشیه در الگوریتم ماشین بردار پشتیبان (سناریو ۲)
در مثال بالا میتوان مشاهده کرد که فاصله خط راست C در مقایسه با هر دو خط A و B از نزدیکترین نقاط دادهای موجود در هر کلاس، بیشتر است. بنابراین، خط C را به عنوان خط راست صحیح برمیگزینیم. دلیل دیگر واضح برای انتخاب این خط استحکام بیشتر آن است. اگر خط راست حاشیه کمی داشته باشد، احتمال طبقهبندی نشدن برخی دادهها (miss-classification) وجود دارد.
تشخیص خط راست صحیح (سناریو سوم): در شکل 5 برای تعیین دسته دایرههای قرمز و ستارههای آبی از قوانین تشریح شده در بخش پیش قبلی برای تعیین خط راست صحیح استفاده میشود.
شکل 5: تشخیص خط راست صحیح در الگوریتم ماشین بردار پشتیبان (سناریو 3)
برخی ممکن است خط B را به دلیل حاشیه بیشتری که در مقایسه با A از نزدیکترین نقطه داده موجود دارد انتخاب کنند. اما، نکته مهم آن است که در اصول تعیین خط راست در الگوریتم ماشین بردار پشتیبان، خط راستی که دستهها را به درستی تقسیم کند (صحت) بر خطی که حاشیه بیشتری دارد، دارای اولویت است. بنابراین در این مثال، خط راست B یک خطای طبقهبندی دارد و خط A همه دادهها را به درستی طبقهبندی کرده است. بنابراین خط راست A صحیح است.
آیا میتوان دادههای دارای دورافتادگی را دستهبندی کرد؟ (سناریو چهارم): در شکل ۶، امکان طبقهبندی دو دسته با یک خط راست وجود ندارد، زیرا یکی از ستارههای آبی به صورت یک دورافتادگی در قلمرو دیگر دسته یعنی دایرههای قرمز است.
شکل ۶ - تشخیص خط راست صحیح در الگوریتم ماشین بردار پشتیبان هنگام وجود دورافتادگی (سناریو ۴)
همانگونه که پیش از این بیان شد، وجود یک ستاره آبی در قلمرو دسته دیگر به عنوان یک دورافتادگی برای دسته ستاره آبی محسوب میشود. یکی از ویژگیهای ماشین بردار پشتیبان آن است که دورافتادگیها را نادیده گرفته و تنها خط راستی را که بیشترین حاشیه را با نقاط داده دستهها دارد انتخاب میکند.
شکل 7: تشخیص خط راست صحیح در الگوریتم ماشین بردار پشتیبان هنگام وجود دورافتادگی (سناریو ۴)
حل مسائل نیازمند خط غیر راست جهت جداسازی دستهها (سناریو پنجم): در شکل ۷، نمیتوان یک خط راست بین دو کلاس داشت، بنابراین این سؤال مطرح میشود که ماشین بردار پشتیبان چگونه میتواند این دو دسته را طبقهبندی کند. تاکنون و در مثالهای پیشین تنها خط راست مورد بررسی قرار گرفت.
شکل 8: حل مسائل نیازمند خط غیر راست در الگوریتم ماشین بردار پشتیبان (سناریو ۵)
ماشین بردار پشتیبان میتواند این مسئله را به سادگی حل کند. این مسئله با افزودن یک ویژگی جدید قابل حل است. این ویژگی جدید تبدیل z=x^2+y^2 است که باید بر روی دادهها اعمال شود. اکنون میتوان دادهها را روی محور x و z ترسیم کرد.
شکل ۹: حل مسائل نیازمند خط غیر راست در الگوریتم ماشین بردار پشتیبان (سناریو ۵)
در نمودار شکل ۹، نقاط داده با شرایط زیر در نظر گرفته شدهاند:
- همه مقادیر برای z همواره مثبت خواهند بود، زیرا z مجموعه مربعات x و y است.
- در نمودار اصلی، دایرههای قرمز به محورهای x و y اصلی نزدیکترند و این امر موجب میشود مقادیر z کاهش پیدا کند و دایرههای قرمز در نمودار جدید به محور x نزدیکتر هستند و ستارههای آبی نسبت به دایرههای قرمز فاصله بیشتری از محور x ها دارند.
در الگوریتم ماشین بردار پشتیبان، داشتن یک خط راست بین این دو کلاس آسان است. اما، سؤال دیگری که در این مرحله مطرح میشود آن است که آیا لازم است این ویژگی به صورت دستی به خط راست اضافه شود؟ پاسخ منفی است، ماشین بردار پشتیبان از روشی که به آن ترفند هسته (کرنل) گفته میشود، استفاده میکند. در این روش در واقع توابعی وجود دارند که فضای ورودی بُعد پایین را دریافت کرده و آن را به فضای بُعد بالاتر تبدیل میکنند. این تبدیل، یک مسئله غیر قابل جداسازی را به مسئله قابل جداسازی مبدل میکند. به این توابع، تابعهای هسته (کرنل) گفته میشود.
توابع کرنل بیشتر در مسائل جداسازی غیرخطی مفید هستند. این توابع برخی از دادههای فوقالعاده پیچیده را تبدیل میکنند و سپس فرآیندی را مییابند که با استفاده از آن بتوانند این دادهها را بر اساس برچسبهایی که کاربر تعریف کرده، جداسازی کنند. هنگامی که به خط جداساز در فضای ورودی اصلی نگاه میکنیم، این خط شبیه به یک دایره است (شکل ۱۰).
شکل ۱۰: حل مسائل نیازمند خط غیر راست در الگوریتم ماشین بردار پشتیبان (سناریو ۵)
در ادامه، چگونگی اعمال الگوریتم ماشین بردار پشتیبان در چالشهای علوم داده مورد بررسی قرار میگیرد.
پیادهسازی ماشین بردار پشتیبان در زبانهای برنامهنویسی پایتون و R
در پایتون، کتابخانه scikit-learn به طور گسترده برای پیادهسازی الگوریتمهای یادگیری ماشین مورد استفاده قرار میگیرد و بنابراین الگوریتم ماشین بردار پشتیبان نیز در این کتابخانه موجود است و از ساختار کدی مشابه دیگر الگوریتمها (فراخوانی کتابخانه، ساختشی، مناسبسازی مدل و پیشبینی)، پیروی میکند.
کد زیر پیادهسازی این الگوریتم در زبان پایتون و با استفاده از کتابخانه scikit-learn است.
#Import Library from sklearn import svm #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create SVM classification object model = svm.svc(kernel='linear', c=1, gamma=1) # there is various option associated with it, like changing kernel, gamma and C value. Will discuss more # about it in next section.Train the model using the training sets and check score model.fit(X, y) model.score(X, y) #Predict Output predicted= model.predict(x_test)
بسته e1071 در زبان برنامهنویسی R برای ساخت ماشین بردار پشتیبان استفاده میشود. این بسته دارای توابع کمکی (Helper) است که شبیه تابع طبقهبندی بیزی ساده عمل میکنند. در ساخت ماشین بردار پشتیبان در زبان R و پایتون از رویکرد مشابهی استفاده شده است. کد زیر پیادهسازی این الگوریتم در زبان برنامهنویسی R و با استفاده از بسته e1071 است.
#Import Library require(e1071) #Contains the SVM Train <- read.csv(file.choose()) Test <- read.csv(file.choose()) # there are various options associated with SVM training; like changing kernel, gamma and C value. # create model model <- svm(Target~Predictor1+Predictor2+Predictor3,data=Train,kernel='linear',gamma=0.2,cost=100) #Predict Output preds <- predict(model,Test) table(preds)
پارامترهای الگوریتم ماشین بردار پشتیبان چگونه تنظیم میشوند؟
تنظیم پارامترها برای الگوریتم ماشین بردار پشتیبان به طور مؤثر باعث بهبود کارایی مدل میشود.
در ادامه لیست پارامترهای موجود برای SVM در زبان پایتون مورد بررسی قرار گرفته است.
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)
در ادامه برخی از پارامترهای مهمی که تأثیر بیشتری بر کارایی مدل دارند، یعنی «کرنل»، «گاما» و «C» مورد بررسی قرار میگیرند.
کرنل: این پارامتر پیش از این مورد بررسی قرار گرفت. گزینههای گوناگونی شامل «linear»، «rbf»، «poly» برای کرنل وجود دارند و در حالت پیشفرض کرنل روی پارامتر rbf قرار دارد. rbf و poly برای خط جداساز غیر راست مفید هستند. در مثال زیر، از یک کرنل خطی (linear) بر روی دو ویژگی از مجموعه داده معروف iris برای طبقهبندی گونههای آن استفاده شده است.
مثال: داشتن کرنل خطی
import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets
# import some data to play with iris = datasets.load_iris() X = iris.data[:,:2] # we only take the first two features. We could # avoid this ugly slicing by using a two-dim dataset y = iris.target
# we create an instance of SVM and fit out data. We do not scale our # data since we want to plot the support vectors C = 1.0 # SVM regularization parameter svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)
# create a mesh to plot in x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 h = (x_max / x_min)/100 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1) Z = svc.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.xlim(xx.min(), xx.max()) plt.title('SVC with linear kernel') plt.show()
شکل ۱۱: طبقهبندی مجموعه داده IRIS با استفاده از کرنل خطی در الگوریتم ماشین بردار پشتیبان
مثال: داشتن کرنل rbf
نوع کرنل در خط کد زیر به rbf تغییر داده شده است و تأثیر آن به وضوح در نمودار قابل مشاهده است.
svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)
شکل 12: طبقهبندی مجموعه داده IRIS با استفاده از کرنل RBF در الگوریتم ماشین بردار پشتیبان
پیشنهاد میشود در صورت زیاد بودن تعداد ویژگیها (۱۰۰۰<) از کرنل خطی استفاده شود زیرا دادهها در فضای بُعد بالا به صورت خطی قابل جداسازی هستند. همچنین میتوان از کرنل rbf استفاده کرد؛ اما نباید فراموش کرد که به منظور پیشگیری از بیش برازش حتماً باید اعتبارسنجی متقابل (cross-validation) انجام شود.
گاما (gamma): ضریب کرنل برای rbf، poly و sigmoid است. هرچه مقدار گاما بیشتر باشد، الگوریتم تلاش میکند برازش را دقیقاً بر اساس مجموعه دادههای تمرینی انجام دهد و این امر موجب تعمیم یافتن خطا و وقوع مشکل بیش برازش (Over-Fitting) میشود.
مثال: در مثال زیر مقادیر گامای گوناگون برای مجموعه داده IRIS مورد بررسی قرار گرفته است.
svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)
شکل 13: طبقهبندی مجموعه داده IRIS با استفاده از مقادیر گاما گوناگون در الگوریتم ماشین بردار پشتیبان
C: پارامتر جریمه C، برای جمله خطا است. این پارامتر همچنین برقراری تعادل بین مرزهای تصمیمگیری هموار و طبقهبندی نقاط داده تمرینی را کنترل میکند.
شکل ۱۴: طبقهبندی مجموعه داده IRIS با استفاده از مقادیر C گوناگون در الگوریتم ماشین بردار پشتیبان
برای داشتن ترکیبی مؤثر از این پارامترها و پیشگیری از بیش برازش همواره باید مقدار اعتبارسنجی متقابل (cross validation) را در نظر داشت.
در زبان R نیز میتوان پارامترهای الگوریتم ماشین بردار پشتیبان را به شیوهای مشابه آنچه پیش از این برای پایتون گفته شد تنظیم کرد. در زیر پارامترهای مرتبط با بسته e1071 بیان شدهاند:
- پارامتر کرنل میتواند روی یکی از گزینههای linear، poly یا rbf تنظیم شود.
- مقدار گاما میتواند با تنظیم پارامتر Gamma تعیین و تنظیم شود.
- مقداری که در پایتون با نام C وجود دارد در زبان برنامهنویسی R از طریق پارامتر Cost تعیین میشود.
مزایا و معایب الگوریتم ماشین بردار پشتیبان
- مزایا
- حاشیه جداسازی برای دستههای مختلف کاملاً واضح است.
- در فضاهای با ابعاد بالاتر کارایی بیشتری دارد.
- در شرایطی که تعداد ابعاد بیش از تعداد نمونهها باشد نیز کار میکند.
- یک زیر مجموعه از نقاط تمرینی را در تابع تصمیمگیری استفاده میکند (که به آنها بردارهای پشتیبان گفته میشود)، بنابراین در مصرف حافظه نیز به صورت بهینه عمل میکند.
- معایب
- هنگامی که مجموعه دادهها بسیار بزرگ باشد، عملکرد خوبی ندارد، زیرا نیازمند زمان آموزش بسیار زیاد است.
- هنگامی که مجموعه داده نوفه (نویز) زیادی داشته باشد، عملکرد خوبی ندارد و کلاسهای هدف دچار همپوشانی میشوند.
- ماشین بردار پشتیبان به طور مستقیم تخمینهای احتمالاتی را فراهم نمیکند و این موارد با استفاده از یک اعتبارسنجی متقابل (Cross Validation) پرهزینه پنجگانه انجام میشوند. این امر با روش SVC موجود در کتابخانه scikit-kearn پایتون، مرتبط است.
سخن پایانی
در این نوشتار الگوریتم ماشین بردار پشتیبان همراه با جزئیات مورد بررسی قرار گرفت. چگونگی عملکرد، فرآیند پیادهسازی در پایتون، ترفندهایی که مدل را با استفاده از تنظیم پارامترهای آن کاراتر میسازد و مزایا و معایب الگوریتم تشریح شد.
پیشنهاد میشود هنگام استفاده از الگوریتم ماشین بردار پشتیبان با تنظیم پارامترها، مدل ایجاد شده را قدرتمندتر سازید.
- مهمترین الگوریتمهای یادگیری ماشین (به همراه کدهای پایتون و R)
- مدل سازی، برازش و تخمین
- گنجینه آموزش های یادگیری ماشین و داده کاوی
- آموزش تکمیلی برنامه نویسی پایتون
- آموزش برنامهنویسی R و نرمافزار R Studio
- آموزش یادگیری ماشین (Machine Learning) با پایتون (Python)
==
^^
درود به شما مطالب مبانی نظری را خیلی ابتدایی بیان کردهاید شاید اگر مبانی ریاضی آنرا نیز مطرح می کردید به درک بیشتر و عمیق تر موضوع کمک شایان توجهی می کرد. با تشکر
عالی
عالی بود
بسیار عالی