1 minute read

8.8 SVM

❗ 본 포스트는 <선형대수와 통계학으로="" 배우는="" 머신러닝=""> 교재를 읽고 본인이 중요하다고 생각하는 부분을 정리한 뒤 직접 실습해본 것입니다

8.8.1 SVM 특성

  • 정의: support vector를 기준으로 Class를 판별하는 classifier로 여러 classifier 중 하나

  • 목적: - 각 클래스를 구분하는 직선을 생성하는 것 - Margin(SV간의 width)의 최대화

  • 아래 그림과 같이 ‘중심선’과 점선으로된 ‘경계선’을 이용하여 데이터를 구분한다

  • 중심선은 그 중심선과 수직인 벡터 W를 구해야함

  • Support Vector: 점선으로된 ‘경계선’을 의미

SVC_ccexpress.png

  • 위와 같은 x1, x2 2개의 feature밖에 없는 2차원일 경우에서, p차원으로 일반화했을 때 classifeir는 hyperplane(초평면)이다.

  • target data가 yi라고 한다면, 위의 경우 yi = {-1,1} 이다.

  • 분류식 : yi(XtXi + b) -1 >= 0 (0 이라면 경계선을 의미, 0이 나오게 하는 Xi는 경계선에 걸쳐있는 데이터이다)

  • Margin: 각 영역(class)에 걸쳐있는(경계선 위에 있는) 벡터끼리의 차에 W(중심선과 수직인 벡터)를 내적한 값 이를 정리하면, Margin = 2 / ||W||

  • 즉, ‘W를 최소화하는 문제’ = ‘클래스를 가장 잘 구분하는 SV를 생성하는 문제’

  • Convex Optimization problem으로 formulate가능(자세한 내용은 232pg참고)

8.8.2 서포트 벡터 머신 실습

1) 데이터 불러오기

from sklearn import datasets
raw_wine = datasets.load_wine()

2) feature / target data 지정

X = raw_wine.data
y = raw_wine.target

3) train / test 데이터 분할

from sklearn.model_selection import train_test_split
X_tn, X_te, y_tn, y_te = train_test_split(X,y,random_state=0)

4) Data preprocessing

from sklearn.preprocessing import StandardScaler
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)

5) Training data

  • if Classification -> SVC() / if Regression -> SVR()

  • kernel 인자는 svm의 커널을 정한다.

  • kernel 종류로는 ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 가 있다

from sklearn import svm
clf_svm_lr = svm.SVC(kernel='linear', random_state = 0)
clf_svm_lr.fit(X_tn_std,y_tn)
SVC(kernel='linear', random_state=0)

6) 데이터 예측(와인 분류 하기!)

pred_svm = clf_svm_lr.predict(X_te_std)
print(pred_svm)
[0 2 1 0 1 1 0 2 1 1 2 2 0 1 2 1 0 0 1 0 1 0 0 1 1 1 1 1 1 2 0 0 1 0 0 0 2
 1 1 2 0 0 1 1 1]

7) 정확도 평가

7.1 Accuracy score

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_te, pred_svm)

# 100% !!
print(accuracy)
1.0

7.2 Confusion Matrix

from sklearn.metrics import confusion_matrix
conf_matrix = confusion_matrix(y_te, pred_svm)
print(conf_matrix)
[[16  0  0]
 [ 0 21  0]
 [ 0  0  8]]

7.3 Classification Report

from sklearn.metrics import classification_report
class_report = classification_report(y_te, pred_svm)
print(class_report)
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        16
           1       1.00      1.00      1.00        21
           2       1.00      1.00      1.00         8

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45