0
09922334435

نگاهی به الگوریتم Support Vector Machine

استفاده از SVM با طبقه بندی زبان طبیعی

فهرست مطالب

ماشین بردار پشتیبان (SVM) یک طبقه‌بندی کننده است که توسط یک صفحه داده ها را جدا می‌کند. به عبارت دیگر، با توجه به داده‌های آموزشی برچسب‌گذاری شده (یادگیری تحت نظارت)، الگوریتم یک صفحه بهینه را بدست می آورد که نمونه‌های جدید را دسته‌بندی می‌کند.

 

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

ماشین بردار پشتیبان چیست؟

هدف از الگوریتم ماشین بردار پشتیبان، یافتن یک صفحه در یک فضای N بعدی (N – تعداد ویژگی ها) است که به طور مشخص داده ها را طبقه بندی می کند.

آیا SVM رگرسیون است یا طبقه بندی؟

برای جدا کردن دو دسته از داده، صفحه های زیادی وجود دارد که می توان انتخاب کرد. هدف ما این است که صفحه ای را پیدا کنیم که حداکثر حاشیه یعنی حداکثر فاصله بین داده های هر دو کلاس را داشته باشد.

 

به حداکثر رساندن فاصله بین کلاس های مختلف مقداری حاشیه امن را فراهم می‌کند تا بتوان داده هایی که در آینده داده میشود را با اطمینان بیشتری طبقه بندی کرد.

Hyperplanes و بردارهای پشتیبانی

Hyperplanes یا صفحات مرزهای تصمیم گیری هستند که به طبقه بندی داده کمک می کنند.

 

داده هایی که در هر دو طرف Hyperplanes قرار می‌گیرند را می‌توان به کلاس های مختلف نسبت داد. همچنین، ابعاد hyperplanes به تعداد ویژگی ها بستگی دارد.

 

اگر تعداد ویژگی های ورودی ۲ باشد، آنگاه Hyperplane فقط یک خط است. اگر تعداد ویژگی های ورودی ۳ باشد، صفحه به صورت یک صفحه دو بعدی تبدیل می شود. تصور زمانی که تعداد ویژگی ها از ۳ بیشتر شود دشوار می شود.

مزیت SVM چیست؟

داده هایی که در حاشیه دسته ها قرار دارند بر موقعیت و جهت صفحات تأثیر می گذارند.

 

با استفاده از این بردارهای پشتیبانی، حاشیه طبقه‌بندی‌کننده را به حداکثر می‌رسانیم. حذف این داده ها موقعیت HyperPlane را تغییر می دهد. اینها نکاتی هستند که به ما در ساخت SVM کمک می کنند.

یافتن حداکثر حاشیه برای مشخص کردن صفحات

در رگرسیون لجستیک، خروجی تابع خطی را می گیریم و با استفاده از تابع سیگموئید مقدار را در محدوده [۰,۱] در نظر می‌گیریم. اگر مقادیر بزرگتر از مقدار آستانه (۰٫۵) باشد، به آن برچسب ۱ و در غیر این صورت یک برچسب ۰ به آن اختصاص می دهیم.

 

در SVM، خروجی تابع خطی را می گیریم و اگر آن خروجی بزرگتر از ۱ باشد، شناسایی می کنیم.

 

آن را با یک کلاس و اگر خروجی ۱- باشد، با کلاس دیگری شناسایی می کنیم. از آنجایی که مقادیر آستانه در SVM به ۱ و -۱ تغییر می کنند.

به‌روزرسانی‌های تابع هزینه و گرادیان

در الگوریتم SVM، ما به دنبال به حداکثر رساندن حاشیه بین داده ها و صفحات هستیم. تابع ضرری که در به حداکثر رساندن حاشیه کمک می کند، از hinge loss است.

چگونه طبقه بندی کننده SVM خود را آموزش دهم؟

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

 

ما همچنین یک پارامتر تنظیم به تابع هزینه اضافه می کنیم. هدف از پارامتر regularization تعادل بین حداکثر کردن و ضرر است. پس از افزودن پارامتر تنظیم، تابع هزینه به صورت زیر بدست می آید.

چرا SVM در رگرسیون استفاده نمی شود؟

اکنون که تابع ضرر را داریم، مشتقات جزئی را با توجه به وزن ها می گیریم تا شیب ها را پیدا کنیم. با استفاده از گرادیان ها می توانیم وزن های خود را به روز کنیم.

SVM چگونه پیش بینی می کند؟

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

هنگامی که یک طبقه بندی اشتباه وجود دارد، یعنی مدل ما در پیش بینی کلاس داده ما اشتباه می کند، ما از loss به همراه پارامتر regularization برای انجام به روز رسانی گرادیان لحاظ می کنیم.

محدودیت های SVM چیست؟

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

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

				
					import pandas as pd

df = pd.read_csv('/Users/rohith/Documents/Datasets/Iris_dataset/iris.csv')
df = df.drop(['Id'],axis=1)
target = df['Species']
s = set()
for val in target:
    s.add(val)
s = list(s)
rows = list(range(100,150))
df = df.drop(df.index[rows])

import matplotlib.pyplot as plt

x = df['SepalLengthCm']
y = df['PetalLengthCm']

setosa_x = x[:50]
setosa_y = y[:50]

versicolor_x = x[50:]
versicolor_y = y[50:]

plt.figure(figsize=(8,6))
plt.scatter(setosa_x,setosa_y,marker='+',color='green')
plt.scatter(versicolor_x,versicolor_y,marker='_',color='red')
plt.show()

from sklearn.utils import shuffle
from sklearn.cross_validation import train_test_split
import numpy as np
## Drop rest of the features and extract the target values
df = df.drop(['SepalWidthCm','PetalWidthCm'],axis=1)
Y = []
target = df['Species']
for val in target:
    if(val == 'Iris-setosa'):
        Y.append(-1)
    else:
        Y.append(1)
df = df.drop(['Species'],axis=1)
X = df.values.tolist()
## Shuffle and split the data into training and test set
X, Y = shuffle(X,Y)
x_train = []
y_train = []
x_test = []
y_test = []

x_train, x_test, y_train, y_test = train_test_split(X, Y, train_size=0.9)

x_train = np.array(x_train)
y_train = np.array(y_train)
x_test = np.array(x_test)
y_test = np.array(y_test)

y_train = y_train.reshape(90,1)
y_test = y_test.reshape(10,1)

## Support Vector Machine 
import numpy as np

train_f1 = x_train[:,0]
train_f2 = x_train[:,1]

train_f1 = train_f1.reshape(90,1)
train_f2 = train_f2.reshape(90,1)

w1 = np.zeros((90,1))
w2 = np.zeros((90,1))

epochs = 1
alpha = 0.0001

while(epochs < 10000):
    y = w1 * train_f1 + w2 * train_f2
    prod = y * y_train
    print(epochs)
    count = 0
    for val in prod:
        if(val >= 1):
            cost = 0
            w1 = w1 - alpha * (2 * 1/epochs * w1)
            w2 = w2 - alpha * (2 * 1/epochs * w2)
            
        else:
            cost = 1 - val 
            w1 = w1 + alpha * (train_f1[count] * y_train[count] - 2 * 1/epochs * w1)
            w2 = w2 + alpha * (train_f2[count] * y_train[count] - 2 * 1/epochs * w2)
        count += 1
    epochs += 1

from sklearn.metrics import accuracy_score

## Clip the weights 
index = list(range(10,90))
w1 = np.delete(w1,index)
w2 = np.delete(w2,index)

w1 = w1.reshape(10,1)
w2 = w2.reshape(10,1)
## Extract the test data features 
test_f1 = x_test[:,0]
test_f2 = x_test[:,1]

test_f1 = test_f1.reshape(10,1)
test_f2 = test_f2.reshape(10,1)
## Predict
y_pred = w1 * test_f1 + w2 * test_f2
predictions = []
for val in y_pred:
    if(val > 1):
        predictions.append(1)
    else:
        predictions.append(-1)

print(accuracy_score(y_test,predictions))

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

clf = SVC(kernel='linear')
clf.fit(x_train,y_train)
y_pred = clf.predict(x_test)
print(accuracy_score(y_test,y_pred))

				
			

نتیجه گیری

در این مقاله، الگوریتم یادگیری ماشینی، Support Vector Machine را به تفصیل بررسی کردیم. من در مورد مفهوم کار کردن، روند پیاده سازی در پایتون، ترفندهایی برای کارآمد کردن مدل با تنظیم پارامترهای آن، جوانب مثبت و منفی بحث کردم.

منابع

https://scikit-learn.org/stable/modules/svm.html

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد.