รองรับ Vector Machine (SVM)

Nov 25 2022
บทนำ Support Vector Machine เป็นหนึ่งในอัลกอริธึมการเรียนรู้ของเครื่องที่ได้รับความนิยมมากที่สุด ไม่ได้ใช้สำหรับการจำแนกประเภทเท่านั้น แต่ยังใช้สำหรับปัญหาการถดถอยด้วย
SVM (อ้างอิง geospasialis.com)

บทนำ

Support Vector Machine เป็นหนึ่งในอัลกอริธึมการเรียนรู้ของเครื่องที่ได้รับความนิยมมากที่สุด ไม่ได้ใช้สำหรับการจำแนกประเภทเท่านั้น แต่ยังใช้สำหรับปัญหาการถดถอยด้วย แต่ที่สำคัญ การใช้งานนั้นถูกพบในปัญหาการจำแนกประเภทในด้านการเรียนรู้ของเครื่อง หลายคนชอบเครื่องเวกเตอร์สนับสนุนเพราะมันให้ความแม่นยำที่น่าทึ่งในขณะที่ใช้พลังการประมวลผลน้อยกว่า Support Vector Machine แยกข้อมูลผ่านไฮเปอร์เพลน และวางจุดข้อมูลใหม่ไว้ในหมวดหมู่ที่เหมาะสมที่สุด นี่คือจุดมุ่งหมายพื้นฐานของ Support Vector Machine ไฮเปอร์เพลนนี้เรียกอีกอย่างว่าขอบเขตการตัดสินใจของ Support Vector Machine มีไฮเปอร์เพลนที่แตกต่างกันมากมายที่อาจใช้เพื่อแบ่งจุดข้อมูลสองคลาส การหาระนาบที่มีระยะขอบมากที่สุด นั่นคือ

ตัวอย่าง

หากเราต้องการแบบจำลองที่สามารถแยกความแตกต่างระหว่างแมวกับสุนัขได้อย่างถูกต้อง สมมติว่าเราสังเกตเห็นแมวที่มีลักษณะผิดปกติซึ่งมีลักษณะคล้ายกับสุนัขด้วย เราสามารถสร้างแบบจำลองดังกล่าวได้โดยใช้อัลกอริทึม SVM ก่อนที่จะทำการทดสอบกับสัตว์แปลกๆ นี้ เราจะฝึกโมเดลของเราด้วยภาพถ่ายแมวและสุนัขหลายภาพก่อน เพื่อให้มันคุ้นเคยกับคุณลักษณะต่างๆ ของแมวและสุนัข เมื่อผลออกมา เวคเตอร์สนับสนุนจะมองเห็นกรณีสุดโต่งของแมวและสุนัขขณะที่มันวาดเส้นขอบการตัดสินระหว่างชุดข้อมูลทั้งสองนี้ (แมวและหมา) เวกเตอร์สนับสนุนจะถูกใช้เพื่อจัดหมวดหมู่เป็นแมว

รูปตัวอย่าง SVM (อ้างอิง: www.javatpoint.com )

ประเภทของ SVM

L inear SVM : คำว่า "ข้อมูลเชิงเส้นที่แยกจากกันได้" หมายถึงข้อมูลที่สามารถแบ่งออกเป็นสองกลุ่มโดยใช้เส้นตรงเพียงเส้นเดียว Linear SVM ใช้เพื่อจัดประเภทข้อมูลดังกล่าว และตัวแยกประเภทที่ใช้เรียกว่าตัวแยกประเภท Linear SVM

รูป Linear SVM (อ้างอิง www.javatpoint.com)

N on-linear SVM : Non-Linear SVM ใช้สำหรับข้อมูลที่แยกจากกันแบบไม่เชิงเส้น ซึ่งหมายความว่าหากชุดข้อมูลไม่สามารถจำแนกโดยใช้เส้นตรงได้ ข้อมูลดังกล่าวจะเรียกว่าข้อมูลที่ไม่ใช่เชิงเส้น และตัวแยกประเภทที่ใช้จะเรียกว่า Non - ลักษณนาม SVM เชิงเส้น

รูป SVM ที่ไม่ใช่เชิงเส้น (อ้างอิง www.javatpoint.com)

การทำงาน

SVM จัดหมวดหมู่จุดข้อมูลแม้ว่าจะไม่สามารถแยกเป็นเส้นตรงได้โดยการแมปข้อมูลกับสเปซที่มีมิติสูง เมื่อระบุตัวคั่นระหว่างหมวดหมู่แล้ว ข้อมูลจะถูกแปลงเพื่อเปิดใช้งานการแสดงไฮเปอร์เพลนของตัวคั่น กลุ่มที่ควรเป็นของเรกคอร์ดใหม่สามารถคาดการณ์ได้โดยใช้ลักษณะของข้อมูลใหม่

ฟังก์ชันต้นทุนและการไล่ระดับสี

เป้าหมายของวิธี SVM คือการเพิ่มระยะห่างระหว่างจุดข้อมูลและไฮเปอร์เพลน การสูญเสียแบบบานพับคือฟังก์ชันการสูญเสียที่ช่วยในการเพิ่มส่วนต่างให้สูงสุด

รูป ฟังก์ชันการสูญเสียบานพับ (ฟังก์ชันด้านซ้ายสามารถแสดงเป็นฟังก์ชันด้านขวา)

หากมูลค่าที่คาดการณ์และมูลค่าจริงมีเครื่องหมายเดียวกัน จะไม่มีค่าใช้จ่าย ถ้าไม่เราจะกำหนดมูลค่าการสูญเสียต่อไป ฟังก์ชันต้นทุนยังได้รับพารามิเตอร์การทำให้เป็นมาตรฐานจากเราอีกด้วย เป้าหมายของพารามิเตอร์การทำให้เป็นมาตรฐานคือการสร้างสมดุลระหว่างการเพิ่มมาร์จิ้นและการสูญเสีย ฟังก์ชันต้นทุนปรากฏดังต่อไปนี้หลังจากเพิ่มพารามิเตอร์การทำให้เป็นมาตรฐานแล้ว

รูปที่. ฟังก์ชันการสูญเสียสำหรับ SVM

ตอนนี้เรามีฟังก์ชันการสูญเสียแล้ว เราสามารถหาการไล่ระดับสีได้โดยการหาอนุพันธ์บางส่วนเทียบกับน้ำหนัก เราสามารถปรับเปลี่ยนน้ำหนักของเราได้โดยใช้การไล่ระดับสี

มะเดื่อ การไล่ระดับสี

เราจำเป็นต้องอัปเดตการไล่ระดับสีจากพารามิเตอร์การทำให้เป็นมาตรฐานเมื่อไม่มีการจำแนกประเภทผิดเท่านั้น กล่าวคือเมื่อแบบจำลองของเราคาดการณ์คลาสของจุดข้อมูลของเราได้ถูกต้อง

รูป Gradient Update — ไม่มีการจำแนกประเภทผิด

ในการดำเนินการอัปเดตการไล่ระดับสีเมื่อมีการจัดประเภทผิด หรือเมื่อโมเดลของเราคาดการณ์คลาสของจุดข้อมูลไม่ถูกต้อง เราจะรวมการสูญเสียพร้อมกับพารามิเตอร์การทำให้เป็นมาตรฐาน

มะเดื่อ Gradient Update — การจัดประเภทผิด

ตัวอย่างส่วนย่อยของโปรแกรม

นำเข้าไลบรารี

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

class SVM:
    def __init__(self, learning_rate=0.0001, lambda_param=0.001, n_iters=10000):
        self.weights = None
        self.bias =  None
        self.lr = learning_rate
        self.lambda_param = lambda_param
        self.n_iters = n_iters
    def fit(self,X,y):
        n_samples, n_features = X.shape
        
        y1 = np.where(y <= 0, -1, 1)
        
        self.weights = np.zeros(n_features)
        self.bias = 0
        for i in range(self.n_iters):
            for idx, x_i in enumerate(X):
                condition = y1[idx] * (np.dot(x_i, self.weights) - self.bias) >= 1
                if condition:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights)
                else:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights - np.dot(x_i, y1[idx]))
                    self.bias -= self.lr * y1[idx]
        
    def predict(self, X):
        approx = np.dot(X, self.weights) - self.bias
        return np.sign(approx)

def accuracy(y_true,y_pred):
    acc = np.sum(y_true == y_pred)/len(y_true)
    return acc
X, y =  datasets.make_blobs(n_samples=10, n_features=2, centers=2, cluster_std=1.05, random_state=40)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)
y = np.where(y == 0, -1, 1)
clf = SVM()
clf.fit(X_train,y_train)
predict = clf.predict(X_test)
svm_acc = accuracy(y_test,predict)
print('Accuracy:',svm_acc)
print(f'''
     Final Weight:{clf.weights}
     Final Bias:{clf.bias}
     ''')

น้ำหนักสุดท้าย:[0.34494241 0.1443094 ]
อคติสุดท้าย:-0.012899999999999977

การสร้างภาพ

def visualize_svm():
    def get_hyperplane_value(x, w, b, offset):
        return (-w[0] * x + b + offset) / w[1]
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    plt.scatter(X[:,0], X[:,1], marker='x',c=y)

    x0_1 = np.amin(X[:,0])
    x0_2 = np.amax(X[:,0])

    x1_1 = get_hyperplane_value(x0_1, clf.weights, clf.bias, 0)
    x1_2 = get_hyperplane_value(x0_2, clf.weights, clf.bias, 0)

    x1_1_m = get_hyperplane_value(x0_1, clf.weights, clf.bias, -1)
    x1_2_m = get_hyperplane_value(x0_2, clf.weights, clf.bias, -1)

    x1_1_p = get_hyperplane_value(x0_1, clf.weights, clf.bias, 1)
    x1_2_p = get_hyperplane_value(x0_2, clf.weights, clf.bias, 1)

    ax.plot([x0_1, x0_2],[x1_1, x1_2], 'b--')
    ax.plot([x0_1, x0_2],[x1_1_m, x1_2_m], 'k')
    ax.plot([x0_1, x0_2],[x1_1_p, x1_2_p], 'k')

    x1_min = np.amin(X[:,1])
    x1_max = np.amax(X[:,1])
    ax.set_ylim([x1_min-3,x1_max+3])

    plt.show()

visualize_svm()

      
                
Fig. Output of SVM

การตรวจจับใบหน้า — SVMc จัดประเภทส่วนต่างๆ ของภาพเป็นใบหน้าและไม่ใช่ใบหน้า และสร้างขอบเขตสี่เหลี่ยมรอบใบหน้า

การจัดประเภทข้อความและไฮเปอร์เท็กซ์ — SVM รองรับทั้งโมเดลอุปนัยและทรานดักทีฟสำหรับการจำแนกข้อความและไฮเปอร์เท็กซ์ ในการจัดประเภทบทความออกเป็นกลุ่มต่างๆ จำเป็นต้องมีข้อมูลการฝึกอบรม จัดประเภทตามคะแนนที่ได้รับแล้วตัดกับค่าเกณฑ์
การจัดหมวดหมู่รูปภาพ — SVM ปรับปรุงความแม่นยำในการค้นหาสำหรับการจัดหมวดหมู่รูปภาพ เมื่อเทียบกับกลยุทธ์การค้นหาตามข้อความค้นหาทั่วไป วิธีนี้ให้ความแม่นยำมากกว่า
การจำแนกโปรตีนและการจำแนกมะเร็งเป็นสองตัวอย่างของชีวสารสนเทศ SVM ใช้ในการจำแนกยีน ผู้ป่วยตามยีน และปัญหาทางชีววิทยาอื่นๆ
ใช้อัลกอริทึม SVM สำหรับการตรวจจับโปรตีนที่เหมือนกันระยะไกลและการตรวจจับการพับของโปรตีน

บทสรุป

Support Vector Machine เป็นอัลกอริธึมที่มีประสิทธิภาพสำหรับการจำแนกประเภทในการเรียนรู้ของเครื่อง แม้ว่าจะสามารถใช้กับปัญหาการถดถอยได้เช่นกัน แต่เราขอแนะนำให้ใช้เป็นหลักเพื่อวัตถุประสงค์ในการจำแนกประเภท สามารถใช้กับข้อมูลเชิงเส้นหรือไม่เชิงเส้นและใช้งานได้ดี อย่างไรก็ตาม มันเป็นอัลกอริทึมการเรียนรู้ภายใต้การดูแล ดังนั้นจึงต้องการข้อมูลที่มีป้ายกำกับ ทำงานได้ดีที่สุดกับชุดข้อมูลขนาดเล็กมากกว่าชุดข้อมูลที่ซับซ้อน

อ้างอิง

สนับสนุนเครื่องเวกเตอร์

การมอบหมายที่บ้านสำหรับการอนุมานทางสถิติ (SI) โดยนักศึกษาของปัญญาประดิษฐ์และวิทยาศาสตร์ข้อมูล (AI&DS) สถาบันเทคโนโลยีวิชวาการ์มา เมืองปูเน่

จัดเตรียมโดย:-

  1. อาจิณฺญามหาาจารย์
  2. อทิตยา โพธินคร
  3. ริยา ธากาลการ์
  4. ดิกชา ปราสาด
  5. ชีวานี มหาจัน