آموزش ماشین بردار پشتیبان در یادگیری ماشین با پایتون

3 سال پیش

آموزش ماشین بردار پشتیبان در یادگیری ماشین با پایتون

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش ماشین بردار پشتیبان در یادگیری ماشین با پایتون خواهیم پرداخت.

پیشنهاد ویژه : پکیج آموزش صفر تا صد پایتون

مقدمه ای بر ماشین بردار پشتیبان در یادگیری ماشین با پایتون

ماشین های بردار پشتیبانی (SVM) الگوریتم های یادگیری ماشین نظارت شده قدرتمند و در عین حال قابل انعطاف هستند که هم برای طبقه بندی و هم برای رگرسیون استفاده می شوند. اما به طور کلی ، آنها در مشکلات طبقه بندی استفاده می شوند. در دهه ۱۹۶۰ ، SVM ها برای اولین بار معرفی شدند اما بعداً در سال ۱۹۹۰ اصلاح شدند. SVM ها روش منحصر به فرد خود را در مقایسه با الگوریتم های یادگیری ماشین دیگر دارند. اخیراً ، آنها به دلیل توانایی در کنترل چندین متغیر مداوم و طبقه ای بسیار محبوب هستند.

عملکرد SVM

یک مدل SVM اساساً نمایانگر کلاسهای مختلف در یک ابر هواپیما در فضای چند بعدی است. ابر هواپیما به صورت تکراری توسط SVM تولید می شود تا خطا به حداقل برسد. هدف SVM تقسیم مجموعه داده ها به کلاس ها برای یافتن حداکثر ابر هواپیما حاشیه ای (MMH) است.

موارد زیر مفاهیم مهمی در SVM هستند –

  • بردارهای پشتیبان– به نقاط داده ای که نزدیکترین نقطه به hyperplane هستند ، بردارهای پشتیبانی گفته می شود. خط جداسازی با کمک این نقاط داده تعریف خواهد شد.
  • Hyperplane – همانطور که در نمودار بالا مشاهده می کنیم ، یک صفحه یا فضای تصمیم گیری است که بین مجموعه ای از اشیا با کلاسهای مختلف تقسیم می شود.
  • حاشیه – ممکن است به عنوان شکاف بین دو خط در نقاط داده گنجه کلاسهای مختلف تعریف شود. می تواند به صورت فاصله عمود از خط تا بردارهای پشتیبانی محاسبه شود. حاشیه زیاد حاشیه خوب و حاشیه کم حاشیه بد محسوب می شوند.

 

هدف اصلی SVM تقسیم مجموعه داده ها به کلاس ها برای یافتن حداکثر hyperplane حاشیه ای (MMH) است و می توان آن را در دو مرحله زیر انجام داد –

اول، SVM به طور تکراری hyperplane تولید می کند که کلاسها را به بهترین روش تفکیک می کند.

سپس، hyperplane را انتخاب می کند که کلاسها را به درستی از هم جدا کند.

پیاده سازی SVM در پایتون

برای پیاده سازی SVM در پایتون با وارد کردن کتابخانه های استاندارد به شرح زیر شروع خواهیم کرد –

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns; sns.set()

در مرحله بعدی ، ما یک نمونه داده را با داشتن داده های خطی قابل تفکیک ، از sklearn.dataset.sample_generator برای طبقه بندی با استفاده از SVM – ایجاد می کنیم –

from sklearn.datasets.samples_generator import make_blobs
X, y = make_blobs(n_samples=100, centers=2, random_state=0, cluster_std=0.50)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='summer');

موارد زیر پس از تولید مجموعه داده نمونه با ۱۰۰ نمونه و ۲ خوشه  خواهد بود

ما می دانیم که SVM از طبقه بندی افتراقی پشتیبانی می کند. این کلاسها را با یافتن یک خط در صورت دو بعدی یا منیفولد در صورت چند بعدی تقسیم می کند. این بر روی مجموعه داده فوق به شرح زیر پیاده سازی شده است –

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='summer')
plt.plot([0.6], [2.1], 'x', color='black', markeredgewidth=4, markersize=12)
for m, b in [(1, 0.65), (0.5, 1.6), (-0.2, 2.9)]:
   plt.plot(xfit, m * xfit + b, '-k')
plt.xlim(-1, 3.5);

 

از خروجی فوق می توان دریافت که سه جدا کننده مختلف وجود دارد که نمونه های فوق را کاملاً تفکیک می کند.

همانطور که بحث شد ، هدف اصلی SVM تقسیم مجموعه داده ها به کلاس ها برای یافتن یک hyperplane حداکثر حاشیه ای (MMH) است ، از این رو به جای ترسیم یک خط صفر بین کلاس ها ، می توانیم دور هر خط یک حاشیه عرض تا نزدیکترین نقطه ترسیم کنیم. این را می توان به شرح زیر انجام داد –

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='summer')
   for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:
   yfit = m * xfit + b
   plt.plot(xfit, yfit, '-k')
   plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none',
         color='#AAAAAA', alpha=0.4)
plt.xlim(-1, 3.5);

 

خروجی، ما می توانیم به راحتی “حاشیه” را در طبقه بندی های افتراقی مشاهده کنیم. SVM خطی را انتخاب می کند که حاشیه را به حداکثر برساند.

در مرحله بعدی ، ما برای آموزش مدل SVM بر روی این داده ها از طبقه بندی بردار پشتیبانی Scikit-Learn استفاده خواهیم کرد. در اینجا ، ما از هسته خطی برای متناسب کردن SVM به شرح زیر استفاده می کنیم –

from sklearn.svm import SVC # "Support vector classifier"
model = SVC(kernel='linear', C=1E10)
model.fit(X, y)

 

خروجی به شرح زیر است –

SVC(C=10000000000.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
kernel='linear', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)

 

اکنون برای درک بهتر موارد زیر توابع تصمیم گیری برای ۲D SVC را ترسیم می کند –

def decision_function(model, ax=None, plot_support=True):
   if ax is None:
      ax = plt.gca()
   xlim = ax.get_xlim()
   ylim = ax.get_ylim()

 

برای ارزیابی مدل ، ما باید شبکه ای را به صورت زیر ایجاد کنیم –

x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30)
Y, X = np.meshgrid(y, x)
xy = np.vstack([X.ravel(), Y.ravel()]).T
P = model.decision_function(xy).reshape(X.shape)

 

بعد، ما باید مرزها و حاشیه های تصمیم گیری را به شرح زیر ترسیم کنیم –

ax.contour(X, Y, P, colors='k',
   levels=[-1, 0, 1], alpha=0.5,
   linestyles=['--', '-', '--'])

 

اکنون ، به طور مشابه بردارهای پشتیبانی را به صورت زیر ترسیم کنید –

if plot_support:
   ax.scatter(model.support_vectors_[:, 0],
      model.support_vectors_[:, 1],
      s=300, linewidth=1, facecolors='none');
ax.set_xlim(xlim)
ax.set_ylim(ylim)

 

اکنون ، از این عملکرد متناسب با مدلهای ما به شرح زیر استفاده کنید –

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='summer')
decision_function(model);

 

ما می توانیم از خروجی فوق مشاهده کنیم که یک طبقه بندی SVM متناسب با داده های حاشیه ای است یعنی خطوط تکه تکه شده و بردارهای پشتیبان عناصر محوری  را لمس می کند. این نقاط بردار پشتیبانی در ویژگی support_vectors_ طبقه بندی به صورت زیر ذخیره می شوند –

model.support_vectors_

 

خروجی به شرح زیر است –

array([[0.5323772 , 3.31338909],
   [۲٫۱۱۱۱۴۷۳۹, ۳٫۵۷۶۶۰۴۴۹],
   [۱٫۴۶۸۷۰۵۸۲, ۱٫۸۶۹۴۷۴۲۵]])

 

هسته های SVM

در عمل ، الگوریتم SVM با هسته پیاده سازی می شود که فضای داده ورودی را به فرم مورد نیاز تبدیل می کند. SVM از تکنیکی به نام ترفند هسته استفاده می کند که در آن هسته فضای ورودی بعدی کم را می گیرد و آن را به فضای بعدی بالاتر تبدیل می کند. به عبارت ساده ، هسته مشکلات غیر قابل تفکیک را با افزودن ابعاد بیشتر به مشکلات قابل تفکیک تبدیل می کند. SVM را قدرتمندتر ، انعطاف پذیر و دقیق تر می کند. موارد زیر برخی از انواع هسته های استفاده شده توسط SVM است –

هسته خطی

این ماده می تواند به عنوان یک محصول نقطه ای بین هر دو مشاهده استفاده شود. فرمول هسته خطی به شرح زیر است –

k(x,xi) = sum(x*xi)

از فرمول فوق می توان دریافت که محصولی که بین دو بردار گفته می شود 𝑥 & the حاصل جمع ضرب هر جفت مقادیر ورودی است.

هسته چند جمله ای

این یک شکل کلیتر از هسته خطی است و فضای ورودی منحنی یا غیر خطی را از هم متمایز می کند. فرمول هسته چند جمله ای در زیر آمده است –

K(x, xi) = 1 + sum(x * xi)^d

در اینجا d درجه چند جمله ای است که باید آن را به صورت دستی در الگوریتم یادگیری مشخص کنیم.

هسته تابع شعاعی (RBF)

هسته RBF که بیشتر در طبقه بندی SVM استفاده می شود ، فضای ورودی را در فضای بعدی نامشخص ترسیم می کند. فرمول زیر آن را از نظر ریاضی توضیح می دهد –

K(x,xi) = exp(-gamma * sum((x – xi^2))

در اینجا دامنه گاما از ۰ تا ۱ است. ما باید آن را به صورت دستی در الگوریتم یادگیری مشخص کنیم. مقدار پیش فرض خوب گاما ۰٫۱ است.

همانطور که ما SVM را برای داده های قابل تفکیک خطی پیاده سازی کردیم ، می توانیم آن را در پایتون برای داده هایی که به طور خطی قابل تفکیک نیستند ، پیاده سازی کنیم. با استفاده از هسته می توان این کار را انجام داد.

مثال

در زیر مثالی برای ایجاد طبقه بندی SVM با استفاده از هسته وجود دارد. ما از مجموعه داده های عنبیه از scikit-learn استفاده خواهیم کرد –

ما با وارد کردن بسته های زیر شروع خواهیم کرد –

import pandas as pd
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt

 

از این مجموعه داده ، دو ویژگی اول را به شرح زیر می گیریم –

iris = datasets.load_iris()

 

بعد ، ما مرزهای SVM را با داده های اصلی به شرح زیر ترسیم می کنیم –

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))
X_plot = np.c_[xx.ravel(), yy.ravel()]

 

اکنون ، ما باید مقدار پارامتر تنظیم را به صورت زیر ارائه دهیم –

C = 1.0

 

بعد ، می توان شی  طبقه بندی کننده SVM را به صورت زیر ایجاد کرد –

Svc_classifier = svm.SVC(kernel=’linear’, C=C).fit(X, y)

Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap=plt.cm.tab10, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('Support Vector Classifier with linear kernel')

 

خروجی

 

Text(0.5, 1.0, 'Support Vector Classifier with linear kernel')

 

برای ایجاد طبقه بندی SVM با هسته rbf ، می توانیم هسته را به صورت زیر به rbf تغییر دهیم –

Svc_classifier = svm.SVC(kernel='rbf', gamma =‘auto’,C=C).fit(X, y)
Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap=plt.cm.tab10, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('Support Vector Classifier with rbf kernel')

 

خروجی

Text(0.5, 1.0, 'Support Vector Classifier with rbf kernel')

 

ما مقدار گاما را “auto” قرار می دهیم اما می توانید مقدار آن را از ۰ تا ۱ نیز ارائه دهید.

جوانب مثبت و منفی طبقه بندی کننده های SVM
جوانب مثبت طبقه بندی SVM

طبقه بندی SVM دقت بسیار خوبی را ارائه می دهد و با فضای ابعادی بالا به خوبی کار می کند. طبقه بندی کننده های SVM اساساً از زیر مجموعه ای از نکات آموزشی استفاده می کنند ، بنابراین در نتیجه از حافظه بسیار کمتری استفاده می شود.

منفی طبقه بندی های SVM

آنها زمان آموزش بالایی دارند از این رو در عمل برای مجموعه داده های بزرگ مناسب نیستند. عیب دیگر این است که طبقه بندی کننده های SVM با کلاسهای همپوشانی خوب کار نمی کنند.

 

منبع.

 

لیست جلسات قبل آموزش یادگیری ماشین با پایتون 

  1. آموزش یادگیری ماشین با پایتون
  2.  مبانی یادگیری ماشین با پایتون  
  3. آموزش اکوسیستم یادگیری ماشین با پایتون 
  4. آموزش متدها در یادگیری ماشین با پایتون 
  5. آموزش بارگیری داده ها برای پروژه های یادگیری ماشین
  6. آموزش درک داده ها با آمار در یادگیری ماشین
  7. آموزش آماده سازی داده ها در یادگیری ماشین با پایتون 
  8. آموزش انتخاب ویژگی داده ها در یادگیری ماشین با پایتون
  9. آموزش طبقه بندی در یادگیری ماشین با پایتون
  10. آموزش رگرسیون لجستیک در یادگیری ماشین با پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه