AI/Machine Learning
[Machine Learning] 서포트 벡터 머신 (Support Vector Machine, SVM)
byunghyun23
2023. 5. 31. 00:17
서포트 벡터 머신(SVM)은 서포트 벡터라고 하는 기준으로 클래스를 판별합니다.
데이터를 분류할 때, 중심선과 경계선을 이용할 수 있습니다.
여기서 경계선을 서포트 벡터라고 데이터와 최소의 마진을 나타냅니다. 또한 서포트 벡터 머신은 분류할 클래스에서 최대 마진을 남기는 결정 경계선이라고 할 수 있습니다. 최대 마진이라는 것은 더 분명하게 클래스를 분류할 수 있다는 말입니다.
위 그림에서 분류할 클래스는 빨강, 파랑 2가지이며 실선은 중심선, 점선은 경계선 입니다.
중심선과 경계선의 거리는 1로 가정했습니다.
마진 r 은 다음과 같이 계산할 수 있으며,
서포트 벡터 간 거리는 아래와 같습니다.
최대 마진을 구하기 위해서 라그랑주 승수법을 이용하여 풀어냅니다.
최대 마진 계산 방법 중 하드 마진을 사용하는 방법입니다.
목적 함수와 제약식은 라그랑주 프리멀 형수 형태로 다음과 같이 쓸 수 있습니다.
그리고 이 식의 최적값을 구하기 위해 W, N에 대하여 미분을 진행합니다.
아래와 같이 라그랑주 프리멀 함수에 대입하여 라그랑주 듀얼 함수를 계산합니다.
정리하면 최대 마진은 다음과 같습니다.
서포트 벡터 머신은 고차원 피처를 가지는 데이터에 대하여 효율적이며, 과적합을 줄이는 데 좋습니다.
실습은 sklearn SVM를 이용하여 와인 데이터를 분류해 보겠습니다.
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
# 데이터 불러오기
raw_wine = datasets.load_wine()
# 피쳐, 타겟 데이터 지정
X = raw_wine.data
y = raw_wine.target
# 트레이닝/테스트 데이터 분할
X_tn, X_te, y_tn, y_te=train_test_split(X,y,random_state=0)
# 데이터 표준화
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)
# 서포트벡터머신 학습
clf_svm_lr = svm.SVC(kernel='linear', random_state=0)
clf_svm_lr.fit(X_tn_std, y_tn)
# 예측
pred_svm = clf_svm_lr.predict(X_te_std)
print(pred_svm)
# 정확도
accuracy = accuracy_score(y_te, pred_svm)
print(accuracy)
# confusion matrix 확인
conf_matrix = confusion_matrix(y_te, pred_svm)
print(conf_matrix)
# 분류 레포트 확인
class_report = classification_report(y_te, pred_svm)
print(class_report)