در این مقاله قصد داریم یک آموزش جامع و کاربردی از مبحث ماشین بردار پشتیبان ارائه دهیم، به طوری که شما بتوانید مفاهیم SVM را به راحتی درک کنید.
چند روز پیش، کودکی را دیدم که پدرش از میوه فروشی، میوه می خرید. کودک می خواست توت فرنگی بخورد، اما به نظر می رسید بین دو میوه ظاهراً مشابه گیج شده باشد. پس از مدتی ، او می فهمد که کدام یک توت فرنگی است و یکی را از سبد بر می دارد. ماشین های بردار پشتیبان نیز همانند آن کودک کار می کنند. داده ها را بررسی می کنند و آن ها را به یکی از دو دسته طبقه بندی می کنند.
با خواندن مقاله زیر SVM را با جزییات بیشتر درک کنید.
مقدمه ای بر ماشین های بردار پشتیبان
ماشین بردار پشتیبان ( SVM ) یکی از محبوب ترین الگوریتم ها برای کلاسه بندی در الگوریتم های یادگیری ماشین است. پیشینه ریاضی آن ها در مرزبندی برای تمایز هندسی بین دو کلاس ، بسیار حائز اهمیت است. ما با مشاهده پیاده سازی ماشین های بردار پشتیبان در پایتون خواهیم دید که آن ها چگونه کار می کنند و در نهایت ، برخی از کاربردهای مهم را بررسی خواهیم کرد.
SVM چیست؟
ماشین های بردار پشتیبان نوعی الگوریتم یادگیری ماشین نظارت شده هستند که تجزیه و تحلیل داده ها را برای کلاسه بندی و تحلیل رگرسیون فراهم می کنند. SVM بیشتر برای کلاسه بندی استفاده می شود، اما می توانند برای رگرسیون هم مورد استفاده قرار گیرند. ما ترسیم را در فضای n بعدی انجام می دهیم. مقدار هر ویژگی نیز مقدار خاصی از مختصات را نشان می دهد. سپس ، ما ابرصفحه ایده آل که بین دو کلاس تمایز ایجاد می کند را پیدا می کنیم.
این بردار های پشتیبان ، نمایندگی مختصاتی از مشاهدات هستند. این یک روش مرزی برای تفکیک دو کلاس است.
فراموش نکنید که آموزش خوشه بندی یادگیری ماشین را بررسی کنید
SVM چگونه کار می کند؟
اصل اساسی کار ماشین های بردار پشتیبان ساده است : ایجاد یک ابرصفحه که مجموعه داده را به کلاس ها تفکیک کند. اجازه دهید ما با یک مسئله نمونه شروع کنیم. فرض کنید برای یک مجموعه داده خاص ، شما باید مربع های قرمز را از دایره های آبی کلاسه بندی کنید. هدف شما ایجاد خطی است که داده ها را به دو کلاس کلاسه بندی کرده و باعث ایجاد تمایز بین مربع های قرمز و دایره های آبی شود.
با اینکه می توان یک خط فرضی را که دو کلاس را جدا می کند فرض کرد ، اما خطوط زیادی وجود دارند که می توانند این کار را انجام دهند. بنابراین ، فقط یک خط وجود ندارد که بتواند این کار را انجام دهد و شما آن را انتخاب کنید. اجازه دهید برخی از خطوطی که می توانند بین دو طبقه به صورت زیر تمایز ایجاد کنند را ببینیم:
در تصویر فوق ، ما یک خط سبز و یک خط قرمز داریم. به نظر شما بهتر است کدام یک داده ها را به دو کلاس متمایز کند؟ اگر خط قرمز را انتخاب کنید ، آنگاه این خط ایده آلی است که دو کلاس را به درستی تقسیم می کند. با این حال، ما هنوز نمی دانیم که آیا این یک خط دارای عمومیت ، که داده های ما را به طور موثر کلاسه بندی می کند، می باشد یا خیر.
خط سبز نمی تواند خط ایده آل باشد چون خیلی به کلاس قرمز نزدیک است. بنابراین ، این خط ، یک تعمیم مناسب را که هدف نهایی ماست ارائه نمی دهد.
با توجه به SVM، ما باید نقاطی را پیدا کنیم که به هر دو کلاس نزدیک تر باشد. این نقاط به عنوان بردار های پشتیبان شناخته می شوند. در گام بعدی، فاصله بین صفحه تقسیم و بردارهای پشتیبان را پیدا می کنیم. فاصله بین نقاط و خط جداکننده به عنوان حاشیه ( Margin ) شناخته می شود. هدف یک الگوریتم SVM، به حداکثر رساندن این مقدار حاشیه است. هنگامی که حاشیه به حداکثر مقدار خود برسد ، ابرصفحه به صورت بهینه درمی آید.
مدل SVM سعی دارد با ایجاد یک مرز تصمیم گیری کاملاً مشخص ، فاصله بین دو کلاس را افزایش دهد. در حالت فوق ، ابرصفحه ما داده ها را تقسیم کرده است. در حالی که داده های ما ۲ بعدی بودند، ابرصفحه ۱ بعدی است. برای ابعاد بالاتر ، مثلاً یک فضای اقلیدسی n بعدی ، ما یک زیر مجموعه n-1 بعدی داریم که فضا را به دو قسمت جدا از هم تقسیم می کند.
در ادامه این آموزش SVM، پیاده سازی SVM در پایتون را خواهیم دید. لذا قبل از ادامه توصیه می کنم که مفاهیم پایتون خود را بازبینی کنید.
چگونه SVM را در پایتون پیاده سازی کنیم؟
در گام نخست، ما کتابخانه های مهمی را که برای اجرای SVM در پروژه خود از آن ها استفاده خواهیم کرد، وارد می کنیم.
کد:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import matplotlib.pyplot as plt from sklearn import datasets from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler %pylab inline
در مرحله دوم پیاده سازی SVM در پایتون ، ما از مجموعه داده iris که با روش ()load_iris در دسترس است استفاده خواهیم کرد. ما فقط در این تحلیل از طول و عرض استفاده خواهیم کرد.
کد:
pylab.rcParams['figure.figsize'] = (10, 6) iris_data = datasets.load_iris() # We'll use the petal length and width only for this analysis X = iris_data.data[:, [2, 3]] y = iris_data.target # Input the iris data into the pandas dataframe iris_dataframe = pd.DataFrame(iris_data.data[:, [2, 3]], columns=iris_data.feature_names[2:]) # View the first 5 rows of the data print(iris_dataframe.head()) # Print the unique labels of the dataset print('\n' + 'Unique Labels contained in this data are ' + str(np.unique(y)))
خروجی :
در گام بعدی ، ما داده های خود را با استفاده از تابع ()train_test_split به صورت زیر به مجموعه آموزش و آزمایش تقسیم می کنیم :
کد:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) print('The training set contains {} samples and the test set contains {} samples'.format(X_train.shape[0], X_test.shape[0]))
اکنون اجازه دهید داده های خود را تجسم کنیم. مشاهده می کنیم که یکی از کلاس ها به صورت خطی قابل تفکیک است.
کد:
markers = ('x', 's', 'o') colors = ('red', 'blue', 'green') cmap = ListedColormap(colors[:len(np.unique(y_test))]) for idx, cl in enumerate(np.unique(y)): plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], c=cmap(idx), marker=markers[idx], label=cl)
خروجی:
سپس ، مقیاس گذاری را روی داده های خود انجام خواهیم داد. مقیاس بندی اطمینان می دهد که تمام مقادیر داده ما در یک محدوده مشترک قرار دارند به گونه ای که مقادیر بسیار زیاد وجود نداشته باشد.
کد:
standard_scaler = StandardScaler() standard_scaler.fit(X_train) X_train_standard = standard_scaler.transform(X_train) X_test_standard = standard_scaler.transform(X_test) print('The first five rows after standardisation look like this:\n') print(pd.DataFrame(X_train_standard, columns=iris_dataframe.columns).head())
تصویر صفحه خروجی:
بعد از اینکه داده های خود را پیش پردازش کردیم ، مرحله بعدی پیاده سازی مدل SVM به صورت زیر است. ما از تابع SVC که توسط کتابخانه sklearn در اختیار ما قرار گرفته، استفاده خواهیم کرد. در این مثال ، کرنل خود را ‘ rbf ‘ انتخاب می کنیم.
کد:
SVM = SVC(kernel='rbf', random_state=0, gamma=.10, C=1.0) SVM.fit(X_train_standard, y_train) print('Accuracy of our SVM model on the training data is {:.2f} out of 1'.format(SVM.score(X_train_standard, y_train))) print('Accuracy of our SVM model on the test data is {:.2f} out of 1'.format(SVM.score(X_test_standard, y_test)))
بعد از این که دقت خود را به دست آوردیم، بهترین کار تجسم مدل SVM ماست. ما می توانیم این کار را با ایجاد تابعی به نام ()decision_plot و عبور مقادیر از آن ، به صورت زیر انجام دهیم :
کد:
import warnings def versiontuple(version): return tuple(map(int, (version.split(".")))) def decision_plot(X, y, classifier, test_idx=None, resolution=0.02): # setup marker generator and color map markers = ('s', 'x', 'o', '^', 'v') colors = ('red', 'blue', 'green', 'gray', 'cyan') cmap = ListedColormap(colors[:len(np.unique(y))]) # plot the decision surface x1min, x1max = X[:, 0].min() - 1, X[:, 0].max() + 1 x2min, x2max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1min, x1max, resolution), np.arange(x2min, x2max, resolution)) Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z = Z.reshape(xx1.shape) plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap) plt.xlim(xx1.min(), xx1.max()) plt.ylim(xx2.min(), xx2.max()) for idx, cl in enumerate(np.unique(y)): plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)
کد:
decision_plot(X_test_standard, y_test, SVM)
خروجی:
شبکه عصبی کانولوشنی – برای متخصص شدن باید این مفهوم را یاد بگیرید
مزایا و معایب بردار ماشین پشتیبان
مزایای SVM
- بهینه سازی تضمین شده : با توجه به ماهیت بهینه سازی محدب ، راه حل ، همیشه حداقل سراسری خواهد بود و نه حداقل محلی.
- فراوانی پیاده سازی ها : ما می توانیم به راحتی به آن دسترسی داشته باشیم ، چه از پایتون و چه از متلب.
- SVM می تواند برای داده های جداپذیر خطی و همچنین جداپذیر غیرخطی مورد استفاده قرار گیرد. داده های جداپذیر خطی حاشیه سخت است در حالی که داده های جداپذیر غیرخطی حاشیه نرم است.
- SVM ها با مدل های یادگیری نیمه نظارت شده مطابقت دارند. می تواند در مناطقی که داده ها دارای برچسب و همچنین بدون برچسب هستند استفاده شود. این مساله فقط به یک شرط برای مشکل کمینهسازی که به عنوان SVM Transductive شناخته میشود، نیاز دارد.
- نگاشت ویژگی به طور کامل یک بار بر پیچیدگی محاسباتی مدل کلی آموزشی مدل است. با این حال، با کمک ترفند کرنل، SVM میتواند نگاشت ویژگی را با استفاده از ضرب نقطه ساده انجام دهد.
معایب SVM
- SVM توانایی مدیریت ساختارهای متنی را ندارد. این منجر به از دست دادن اطلاعات ترتیبی و در نتیجه منجر به عملکرد بدتر می شود.
- SVM در حالت عادی نمی تواند مقدار اطمینان احتمالی را که مشابه رگرسیون لجستیک است، را بازگرداند. این روش توضیح زیادی ارائه نمی دهد با وجود این که اطمینان از پیش بینی در کاربرد های زیادی مهم است.
- انتخاب کرنل شاید بزرگترین محدودیت بردار ماشین پشتیبان باشد. با توجه به اینکه کرنل های زیادی وجود دارند، انتخاب کرنل مناسب برای داده ها دشوار است.
همه چیز را در مورد شبکه های عصبی بازگشتی و کاربرد های آن یاد بگیرید
چگونه پارامترهای SVM را تنظیم کنیم؟
کرنل
کرنل در SVM وظیفه تبدیل داده های ورودی به فرمت مورد نیاز را دارد. برخی از کرنل های مورد استفاده در SVM توابع خطی ، چند جمله ای و پایه شعاعی (RBF) هستند. برای ایجاد یک ابرصفحه غیرخطی ، از توابع RBF و چند جمله ای استفاده می کنیم. برای کاربرد های پیچیده ، باید از کرنل های پیشرفته تری برای جداسازی کلاس هایی که ماهیت غیرخطی دارند استفاده کرد. با این تبدیل ، می توان کلاسه بند های دقیق را بدست آورد.
منظم سازی ( Regularization )
ما می توانیم منظم سازی را با تنظیم آن در پارامترهای C Scikit-learn انجام دهیم. C یک پارامتر جریمه است که یک خطا یا هر شکلی از کلاسه بندی اشتباه را نشان می دهد. با این کلاسه بندی اشتباه ، می توان درک کرد که این خطا تا چه حد قابلتحمل است. از طریق این، شما میتوانید خسارت بین عبارت اشتباه کلاسه بندی شده و مرز تصمیم گیری را خنثی کنید. با یک مقدار C کوچکتر ، ابرصفحه کم حاشیه و با مقدار C بزرگتر ، ابرصفحه ای با مقدار بزرگتر بدست می آوریم.
گاما
با مقدار کمتر گاما ، یک مجموعه نامتناسب از مجموعه داده های آموزشی ایجاد می شود. برعکس ، مقدار گاما زیاد ، به مدل اجازه می دهد تا تناسب بیشتری داشته باشد. مقدار کم گاما ، برای محاسبه یک صفحه جداکننده ، فقط به نقاط نزدیک توجه می کند در حالی که مقدار گاما زیاد ، برای محاسبه خط جداکننده نهایی ، تمام نقاط داده را در نظر می گیرد.
کاربرد های SVM
برخی از حوزه هایی که از ماشین های بردار پشتیبان استفاده می شود به شرح زیر هستند:
تشخیص چهره
SVM ها می توانند با ایجاد یک جعبه مربع شکل که چهره را از بقیه جدا می کند ، تصاویر افراد در یک محیط را کلاسه بندی کنند.
طبقه بندی متن و فرامتن
از SVM می توان برای طبقه بندی اسناد استفاده کرد به این معنا که طبقه بندی متن و فرامتن را انجام می دهد. بر اساس امتیاز تولید شده ، مقایسه ای با مقدار آستانه انجام می دهد.
بیوانفورماتیک
در زمینه بیوانفورماتیک ، SVM ها برای طبقهبندی پروتیین و ژنوم مورد استفاده قرار میگیرند. آن ها می توانند ساختار ژنتیکی بیماران را بر اساس مشکلات بیولوژیکی آن ها دسته بندی کنند.
تشخیص دستخط
حوزه دیگری که از ماشین های بردار پشتیبان برای تشخیص بصری استفاده می شود ، تشخیص دستخط است.
خلاصه
در این مقاله ، ما در مورد ماشین های بردار پشتیبانی مطالعه کردیم. ما یاد گرفتیم که این الگوریتم های SVM چگونه کار می کنند و همچنین آن ها را با یک مثال واقعی پیاده سازی کردیم. ما همچنین در مورد کاربردهای مختلف SVM در زندگی روزمره خود بحث کردیم. امیدوارم اکنون شما نظریه کامل SVM را درک کرده باشید. نظرات خود را با ما درمیان بگذارید.
بیشتر بخوانید :