본문 바로가기
딥러닝

one class svm (1-svm)에 대해서

by 제리의 세계 2023. 5. 19.

안녕하세요! 제리입니다.

 

이번 참고 자료는 이곳! https://www.youtube.com/watch?v=OmK_GQ40yko&t=2267s 

 

정상 데이터를 최대한 원점에서 멀어지도록 하는 것이 포인트 (hyperplane을 찾는 것이 목표)

1-svm 수식

최적화 문제에서

w는 regularization을 진행하며 이를 min을 통해 최소화 시켜준다. ==> 모델의 변동성 감소

 

두번째의 경우 정상 값이 로우보다 가까울 때 패널티를 주는 것으로 정상 데이터는 원점보다 바깥 쪽에 존재하도록 하는 거임 -> 그렇지 않을 경우 패널티 term ==> 조건에 맞지 않을 시 패널티 부여

 

로우는 원점에서 최대한 멀리 떨어진 hyperplane과의 거리 ==> 결정 경계 예측

 

primal lagrangian problem

4번째 식은 개별적 객체는 원점보다 멀리 있도록 하고 아닐 시 패널티를 줌

5번째 식은 크사이가 항상 0보다 커야하므로 그것에 대한 제약식임

 

kkt condition
편미분한 것을 dual lagrangian problem으로 풀어 정리된 값
알파의 조건
알파의 값에 따라 위치가 달라짐
위 3 케이스를 그림으로 표현

case 1은 흰색, 2는 검은색, 3은 회색

 

조건에서 알파의 합은 1이여야하므로 알파가 가질 수 있는 최대 값인 1/vl 에서 최소한의 vl 만큼의 support vector가 있어야 된다.

 

이론은 조금 어렵지만 코드로 보면 svm과 비슷하다고 생각하기에 코드를 보면

https://zephyrus1111.tistory.com/469

 

import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
import numpy as np
 
from sklearn.svm import OneClassSVM as OCS
from sklearn.datasets import make_classification
 
## 실험용 데이터
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2,
                           n_redundant=0, n_repeated=0, n_classes=2,
                           n_clusters_per_class=1,
                           weights=[0.995, 0.005],
                           class_sep=0.5, random_state=100)



ocs = OCS(kernel='rbf', ## 커널 {‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}
          nu=0.1, ## Regularization Parameter
          gamma = 'auto' ## rbf의 감마
         ).fit(X)
outlier_labels = ocs.predict(X) ## -1 이상치, 1 정상 예측하기



fig = plt.figure(figsize=(8, 8))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.scatter(X[:, 0], X[:, 1], c=outlier_labels)
plt.show()



## 스코어 기반 이상치 재 예측
score = ocs.score_samples(X)
score_threshold = np.percentile(score, 5) ## 하위 5프로
## 하위 5프로 이하인 경우는 모두 이상치로 예측한다.
new_labels = np.array([-1 if i < score_threshold else 1 for i in score])

fig = plt.figure(figsize=(8, 8))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.scatter(X[:, 0], X[:, 1], c=new_labels)
plt.show()

하이퍼파라미터로 kernel과 nu, gamma 정도로 사용한다.

이상치 기준도 설정해서 기준보다 낮으면 이상치로 예측하여 제거를 시킨다.

 

이런식으로 임의로 값을 조정해서 사용할 수 있다는 점에서 어떻게 보면 내가 조정할 수 있다는 점이 장점인 거 같다.