8.8 Support Vector Machine
8.8 SVM
❗ 본 포스트는 <선형대수와 통계학으로="" 배우는="" 머신러닝=""> 교재를 읽고 본인이 중요하다고 생각하는 부분을 정리한 뒤 직접 실습해본 것입니다선형대수와>
8.8.1 SVM 특성
-
정의: support vector를 기준으로 Class를 판별하는 classifier로 여러 classifier 중 하나
-
목적: - 각 클래스를 구분하는 직선을 생성하는 것 - Margin(SV간의 width)의 최대화
-
아래 그림과 같이 ‘중심선’과 점선으로된 ‘경계선’을 이용하여 데이터를 구분한다
-
중심선은 그 중심선과 수직인 벡터 W를 구해야함
-
Support Vector: 점선으로된 ‘경계선’을 의미
-
위와 같은 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