ماشین بردار پشتیبان (Machine Vector Support) الگوریتم ساده دیگری است که با هزینه محاسباتی کمتر عملکرد نسبتاً خوبی ارائه میدهد. در رگرسیون، SVM با یافتن یک ابر صفحه در یک فضای N بعدی (N عدد از ویژگیها) کار میکند که با دادههای چندبعدی مطابقت دارد و در عین حال یک حاشیه را در نظر میگیرد. در طبقهبندی، همان ابرصفحه محاسبه میشود، اما تنها برای طبقهبندی مجزای نقاط داده در حین در نظر گرفتن یک حاشیه است که این امر صدق میکند. میتوان بسیاری از ابرصفحههای احتمالی را انتخاب کرد. با این حال، هدف یافتن هایپرپلن با ماکزیمم حاشیه است، یعنی حداکثر فاصله بین کلاسهای هدف.
SVM را میتوان هم برای مشکلات رگرسیون و هم برای طبقهبندی استفاده کرد اما به طور گستردهای برای طبقهبندی استفاده میشود.

قبل از اینکه ادامه مطلب را بخوانیم، بیایید چند اصطلاح را توضیح بدهیم.
هسته تابعی است که برای تبدیل دادهها به ابعاد بالاتر استفاده میشود.
Hyperplane خطی است که طبقات را از هم جدا میکند (برای مسائل طبقه بندی). برای رگرسیون، این خطی است که ما با دادههای خود برای پیشبینی مقادیر نتیجه ادامه میدهیم.
خطوط مرزی خطوطی هستند که منطقه را با خطایی که قبلاً ذکر کردیم تشکیل می دهند. آنها دو خط در اطراف سطح فوقالعاده هستند که نشان دهنده حاشیه هستند.
بردارهای پشتیبانی نزدیکترین نقاط داده به این خطوط مرزی هستند.
Kernel
پیشتر اشاره کردیم که هسته تابعی است که دادههای ما را به ابعاد بالاتر تبدیل میکند. خوب چقدر برای ما مفید است؟
گاهی اوقات دادهها به گونهای توزیع میشوند که با استفاده از یک خطخطی (جداکننده) نمیتوان یک تناسب دقیق به دست آورد. SVR میتواند دادههای بسیار غیرخطی را با استفاده از تابع هسته مدیریت کند. این تابع به طور ضمنی ویژگیها را به ابعاد بالاتر به معنای فضای ویژگی بالاتر نگاشت می کند. این به ما اجازه میدهد تا آن را با استفاده از یک ابر صفحه خطی نیز توصیف کنیم.


سه Kernel پرکاربرد عبارتند از:
- Linear kernel
- Polynomial kernel :
- Radial Basis Function (RBF) – برای مقابله با داده های همپوشانی خوب است
- رگرسیون بردار پشتیبانی (SVR)
SVR مانند مدلهای رگرسیون خطی سعی میکند منحنیای را پیدا کند که به بهترین وجه با مجموعه دادهها مطابقت داشته باشد. معادله ما برای مجموعه داده با یک ویژگی از رگرسیون خطی را به خاطر بسپرید:
y=w1x1+c
با در نظر گرفتن SVR برای یک مجموعه داده با یک ویژگی، معادله ایجاد شده مشابه به نظر میرسد اما با در نظرگرفتن یک خطا.
−e≤y−(w1x1+c)≤e
با نگاهی به معادله فوق مشخص میشود که در محاسبه هزینه، تنها نقاط خارج از ناحیه خطا در نظر گرفته میشود.
بهترین تناسب Hyperplane
البته SVR میتواند برای مجموعه دادههای پیچیده با ویژگیهای بیشتر، و با استفاده از اصطلاحات ویژگی ابعاد بالاتر، مشابه آنچه در رگرسیون چند جملهای است، استفاده شود.
Hyperplane زمانی که با حداکثر تعداد نقطه ممکن منطبق باشد، در بهترین تناسب با دادهها است. خطوط مرزی (مقدار e که فاصله از Hyperplane است) را طوری تعیین می کنیم که نزدیکترین نقاط به Hyperplane در داخل خطوط مرزی قرار گیرند.
به خاطر داشته باشید چون حاشیه (بین خطوط مرزی) قابل جایگیری خواهد بود، به عنوان خطا محاسبه نمیشود. حدس میزنم میتوانید تصور کنید که چگونه این اصطلاح به ما اجازه میدهد تا پیچیدگی مدل خود را تنظیم کنیم (underfitting/overfitting).
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
np.random.seed(5)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
T = np.linspace(0, 5, 5)[:, np.newaxis]
y = np.sin(X).ravel()
# Add noise to targets
y[::5] += 1 * (0.5 - np.random.rand(8))
# Fit regression model
SVR_rbf = SVR(kernel='rbf' )
SVR_lin = SVR(kernel='linear')
SVR_poly = SVR(kernel='poly')
y_rbf = SVR_rbf.fit(X, y).predict(X)
y_lin = SVR_lin.fit(X, y).predict(X)
y_poly = SVR_poly.fit(X, y).predict(X)
# look at the results
plt.scatter(X, y, c='k', label='data')
plt.plot(X, y_rbf, c='b', label='RBF')
plt.plot(X, y_lin, c='r',label='Linear')
plt.plot(X, y_poly, c='g',label='Polynomial')
plt.xlabel('data')
plt.ylabel('outcome')
plt.title('Support Vector Regression')
plt.legend()
plt.show()

ماشینهای بردار پشتیبان برای Classification
ما قبلاً دیدیم که چگونه الگوریتم ماشین بردار پشتیبان (SVM) برای رگرسیون کار میکند. برای Classification نیز این موضوع تقریباً یکسان است. در واقع SVM بیشتر برای مسائل Classification استفاده میشود. من معتقدم که می توانید تصور کنید که چرا این اتفاق میافتد.
برای رگرسیون، اشاره کردیم که SVM سعی میکند منحنیای را پیدا کند که به بهترین وجه با مجموعه دادهها مطابقت داشته باشد، و سپس با استفاده از آن منحنی، برای یک نقطه جدید پیشبینی کند. بنابراین، منحنی یکسان را میتوان به راحتی برای Classification دادهها در دو کلاس مختلف استفاده کرد. برای فضای چندبعدی با n بعد (به معنی داده با n تعداد ویژگی)، مدل برازش یک Hyperplane (که مرز تصمیم نیز نامیده میشود) است که به بهترین وجه این دو کلاس را متمایز میکند. تصویر بخش رگرسیون که در آن هسته را توضیح دادیم به یاد بیاورید.

حاشیه فاصله بین نزدیکترین نقطههای هر کلاس است که فاصله Hyperplane تا نزدیکترین نقاط (بردارهای پشتیبان) است.آن نوع Hyperplane که به بهترین وجه با دادهها مطابقت دارد، به این معنی است که این دو کلاس را به بهترین شکل از هم جدا میکند، یعنی Hyperplane با حداکثر حاشیه ممکن است. بنابراین، الگوریتم SVM، هایپرپلن را با حداکثر حاشیه (فاصله تا نزدیکترین نقاط) جستجو می کند.
همانطور که قبلاً در بخش رگرسیون ذکر کردیم، برخی از مجموعه دادهها برای طبقهبندی توسط یک ابر صفحه خطی مناسب نیستند. در این مورد، دوباره «ترفند Kernel» به کمک ما میآید که به طور ضمنی دادهها را به ابعاد بالاتر نگاشت میکند، بنابراین این امکان را برای ما فراهم میکند. دادههایی که باید توسط یک Hyperplane خطی طبقهبندی شوند. از آنجایی که قبلاً در مورد انواع Kernel و نحوه عملکرد آن صحبت کردیم، با یک مثال ادامه خواهیم داد:
بیایید به استفاده از مجموعه داده Cancer از کتابخانه یادگیری scikit ادامه دهیم:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y = True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_sub = X[:, 0:2]
# create a mesh to plot in
x_min, x_max = X_sub[:, 0].min() - 1, X_sub[:, 0].max() + 1
y_min, y_max = X_sub[:, 1].min() - 1, X_sub[:, 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))
#import the SVM model
from sklearn import svm
C = 1.0 # SVM regularization parameter
svc = svm.SVC(kernel='linear').fit(X_sub, y) #play with this, change kernel to rbf
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_sub[:, 0], X_sub[:, 1], c=y, cmap=plt.cm.Paired)
plt.scatter(X_sub[svc.support_, 0], X_sub[svc.support_, 1],c='k', 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()

#Create and instance of the classifier model with a linear kernel
lsvm = svm.SVC(kernel="linear")
#fit the model to our train split from previous example
lsvm.fit(X_train,y_train)
#Make predictions using the test split so we can evaluate its performance
y_pred = lsvm.predict(X_test)
بیایید عملکرد مدل را با مقایسه پیشبینیها با مقادیر واقعی مجموعه تست مقایسه کنیم:
from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
print("Precision:",metrics.precision_score(y_test, y_pred))
print("Recall:",metrics.recall_score(y_test, y_pred))

ما توانستیم به دقت 95.6 درصدی برسیم که بسیار خوب است. بیایید نمرات training و test را با هم مقایسه کنیم تا Overfitting را بررسی کنیم.
print("training set score: %f" % lsvm.score(X_train, y_train))
print("test set score: %f" % lsvm.score(X_test, y_test))

به نظر می رسد نمره training کمی بالاتر از نمره test باشد. می توانیم بگوییم که مدل Overfitting است، اگرچه زیاد نیست.
اگر از این مقاله لذت بردید، دیگر مقالههای ما را هم مطالعه کنید!
منبع: hackernoon
Leave feedback about this