서포트 벡터 머신(Support Vector Machine)



 SVM은 분류 혹은 회귀 문제에 많이 사용된다. SVM은 초평면을 이용하여 데이터를 분류하는데 초평면이 가장 가까운 데이터 점과 멀어질수록 분류 오차가 적어지므로 가장 가까운 데이터 점과의 거리를 최대화 시키는 초평면을 찾는것이 SVM의 핵심이다. 이때 초평면과 평행하고, 가장 가까운 데이터 점을 포함하는 초평면을 서포트 벡터라 한다.

 먼저 법선벡터가 w이고, 원점과의 거리가 b인 초평면을 wx+b=0 이라 하자. 이 초평면과 거리가 1인 초평면 wx+b=+1(plus plane) 과 wx+b=-1(minus plane)를 만들 수 있다. 세 초평면의 같은 법선벡터에 포함되는 일직선 상의 점 두개를 생각해보자. 하나는 plus plane상의 점 x+이고 나머지 하나는 minus plane상의 점 x-이다. x+,x-는 같은 직선 상에 존재하므로 x+=x- + kw로 표현 할 수 있다.

위와 같은 과정으로 두 점 사이의 관계를 알 수 있다. 이때 x+와x-사이의 거리를 SVM의 margin이라 가정하고 margin을 구해보면

위와 같이 구할 수 있다. 즉 SVM은 이 margin을 최대화 시키는 것이 관건이다. margin을 최대화 시키기 위해서는 분모를 최소화 시켜야 하므로 w의 norm의 최소화 문제라고 볼 수도 있다. w의 norm에는 제곱근이 포함되어 있으므로 계산의 편의성을 위해 의 최소화 문제로 해석하도록 한다.

 최소화 문제를 풀기 위해 라그랑지안 승수법을 사용하도록 한다. 


을 구하면 되지만 를 만족하는 모든 점은 가 0이 된다. 반대로 가 0보다 커지는 지점은 서포트 벡터의 한 점이 되고, KKT조건에 의해 임을 알 수 있다.

 따라서 SVM은 Lp를 계산해 0보다 크면 +1로 분류하고, 0보다 작으면 -1로 분류함으로써 해를 구할 수 있다.



# Create SVM classifier
classifier = OneVsOneClassifier(LinearSVC(random_state=0))

# Train the classifier
classifier.fit(X, y)

# Cross validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2, random_state=5)
classifier = OneVsOneClassifier(LinearSVC(random_state=0))
classifier.fit(X_train, y_train)
y_test_pred = classifier.predict(X_test)

# Compute the F1 score of the SVM classifier
f1 = cross_validation.cross_val_score(classifier, X, y, scoring='f1_weighted', cv=3)

# Run classifier on encoded datapoint and print output
predicted_class = classifier.predict(input_data_encoded)
print(label_encoder[-1].inverse_transform(predicted_class)[0])


'파이썬으로 배우는 인공지능' 카테고리의 다른 글

K-평균 알고리즘  (1) 2018.12.19
의사결정 트리(Decision Trees)  (0) 2018.12.17
나이브 베이즈 분류기  (1) 2018.11.29
로지스틱 회귀 분류기  (0) 2018.11.24
데이터 전처리  (0) 2018.11.22

WRITTEN BY
텐초
딥러닝 관련 논문들과 코드를 완벽분석 합니다

,