2022. 7. 11. 19:34ㆍAPP/개발
서포트 벡터 머신(SVM: Support Vector Machine)은 분류 과제에 사용할 수 있는 강력한 머신러닝 지도학습 모델이다
- 서포트 벡터 머신이란
- 최적의 결정 경계(Decision Boundary)
- 마진(Margin)
- 이상치(Outlier)을 얼마나 허용할 것인가
- 커널(Kernel)
- 다항실(Polynomial)
- 방사 기저함수(RBF:Radial Bias Function)
- 요약
서포트 벡터 머신이란
- 결정경계(Decision Boundary), 즉 분류를 위한 기준 선을 정의하는 모델
- 만약 데이터에 2개 속성(feature)만 있다면 결정 경계는 이렇게 간단한 선 형태가 됨
- 그러나 속성이 3개로 늘어나면 기준선은 평면으로 3차원으로 그려야함
- 차원(속성의 개수) 늘어날 수록 복잡해지며 기준선은 단순 평면이 아닌 고차원이 됨
->이를 "초평면(hyperplane)"이라고 부름
최적의 결정 경계(Decision Boundary)
- 어떤 경계가 좋은 경계?
-> 결정 경계는 데이터 군으로부터 최대한 멀리 떨어지는 게 좋음
- 실제 서포트 벡터 머신(Support Vector Machine)이라는 말에서 support vectors 는 결정 경계와 가까이 있는 데이터 포인트들을 의미함 -> 이 데이터들이 경계를 정의하는 결정적인 역할을 하는 셈임
-> 위 그래프에서 가장 좋은 경계선은 데이터 군과 가장 거리가 먼 F
마진(Margin)
- (Margin)마진은 결정 경계와 서포트 벡터 사이의 거리를 의미
- 최적의 결정 경계는 마진을 최대화한다
- n개의 속성을 가진 데이터에는 최소 n+1개의 서포트 벡터가 존재
-> 위 그래프에서 가운데 실선이 '결정 경계'
-> 빨간점 1개, 파란점 2개 사이 영역을 두고 점선을 그음 -> 점선과 결정경계 사이 거리가 마진
- 장점 : 결국 결정 경계 정하는게 서포트 벡터임 -> 많은 데이터 포인트 들 중에서 서포트 벡터만 잘 고르면 나머지 쓸데없는 수많은 데이터 포인트들 무시할 수 있음 -> 그래서 매우 빠름
※ scikit-learn 사용법
- svm에서 결정 경계를 구하는 건 상당히 복잡한 최적화 문제임
from sklearn.svm import SVC
classifier = SVC(kernel = 'linear')
training_points = [[1, 2], [1, 5], [2, 2], [7, 5], [9, 4], [8, 2]]
labels = [1, 1, 1, 0, 0, 0]
classifier.fit(training_points, labels)
위 그림에서 직접 눈으로 [3, 2] 좌표를 찍어봐도 알 수 있듯 빨간 점, 1로 분류될 거다.
그리고 위에서 설명한 서포트 벡터, 결정 경계를 정의하는 서포트 벡터를 확인하려면 classifier.support_vectors_를 print 해보면 된다.
이렇게 나올 거다.
[[7, 5],
[8, 2],
[2, 2]]
파란 점 2개와 빨간 점 1개를 사용했다.
이상치(Outlier)얼마나 허용할 것인가
- SVM은 데이터 포인트들을 올바르게 분리하면서 마진의 크기를 최대화해야함 -> 결국 이상치(Outlier)를 잘 다루는 게 중요
- 위 그래프 보면 혼자 튀어나온 빨간색, 파란색 점들 (아웃라이어) 있음
- 위 첫번째 그래프 경우
-> 하드 마진(hard margin) : 아웃라이어 허용하지 않고 기준을 까다롭게 세움,
-> 마진 매우 작음 -> 개별적인 학습 데이터들을 다 놓치지 않으려고 아웃라이어 허용하지 않는 기준으로 결정 경계정함 -> 오버피팅(overfitting)문제가 발생할 수 있음
- 반대로 아래 두번째 그래프 경우
-> 소프트 마진(Soft margin) : 아웃라이어들이 마진 안에 어느정도 포함되도록 너그럽게 기준을 잡음
-> 서포트 벡터와 결정 경계 상이의 거리가 멀어짐 ,마진이 커짐 -> 너무 대충 학습하는 꼴 : 언더피팅(underfitting)문제 발생
파라미터 C
- scikit-learn에서는 SVM모델이 오류를 어느정도 허용할 것인지 파라미터 C를 통해 지정할 수 있음(기본값은 1)
classifier = SVC(C = 0.01)
- C값이 클수록 하드마진(오류 허용 안 함), 작을수록 소프트마진(오류를 허용함)
커널(Kernel)
만약 SVM이 선형으로 분리 할 수 없는 데이터 세트가 있다면 어떻게 해야 할까?
-> 빨간색, 파란색 구분하는 직선 그릴수없음
-> 그러나 다행히 scikit-learn에서는 SVM모델을 만들때 kernel을 지정하여 해결할 수 있음
보통 이렇게 선형('linear')으로 지정하지만 'poly' 같은 걸 넣어줄 수도 있음
-> 다만, 다른 커널 사용할때 주의 필요 -> 단순히 outlier들때문에 선형으로 분리할 수 없다고 판단해서는 안됨
-> 일부 아웃라이어에 맞추기 위해 비선형으로 결정경계를 만들 필요가 없음 -> 모든 점을 올바르게 분리하는 선을 그린다는 건 결국 모델이 데이터에 과도하게 적합해진다는 오버피팅 된다는 것
from sklearn.svm import SVC
classifier = SVC(kernel = 'linear')
**커널 종류
1. 다항식(Polynomial)
- 아무리 봐도 선형으로 해결 안됨 -> 이때 다항식(Polynomial) 커널 사용하면 2차원에서 x, y좌표로 이루어진 점들을 아래와 같은식에 따라 3차원으로 표현하게됨
-> 다항식 커널로 계산한 데이터 포인트들을 3차원으로 그려보면 아래 모양 나타남
-> 다항식(polynomial) 커널을 사용하면 데이터를 더 높은 차원으로 변형하여 나타냄으로써 초평면(hyperplane)의 결정 경계얻을 수 있음
2. 방사 기저 함수(RBF:Radial Bias Function)
- RBF 커널 혹은 가우시안 커널이라고 부르기도함
- kernel 기본값이 'rbf'(위에서 언급했던 'linear', 'poly', 그리고 'sigmoid'와 같은 걸로 지정해줄 수도 있다.)
- poly'(다항식) 커널은 2차원의 점을 3차원으로 변환한 반면, RBF 커널은 2차원의 점을 무한한 차원의 점으로 변환
from sklearn.svm import SVC
classifier = SVC(kernel='rbf')
파라미터 gamma
- gamma는 (위에서 소개한 C와 마찬가지로) 파라미터
classifier = SVC(kernel = "rbf", C = 2, gamma = 0.5)
- gamma는 결정 경계를 얼마나 유연하게 그을 것인지 정해줌
- 학습 데이터에 얼마나 민감하게 반응할 것인지 모델을 조정하는 거니까 C와 비슷한 개념
- gamma값을 높이면 -> 학습 데이터에 많이 의존해서 결정 경계를 구불구불 긋게 됨 => 오버피팅을 초래
- 반대로 gamma를 낮추면 -> 학습 데이터에 별로 의존하지 않고 결정 경계를 직선에 가깝게 긋게 됨 => 이러면 언더피팅이 발생 할 수 있음
- 적정한 gamma
- 만약 gamma를 너무 높이면 오버피팅 아래처럼 발생
- gamma를 너무 낮게 잡으면 아래처럼 언더피팅 발생
요약
- SVM은 분류에 사용되는 지도학습 머신러닝 모델
- SVM은 서포트벡터(support Vectors)를 사용하여 결정 경계(Decision boundary)를 정의, 분류되지 않은 점을 해당 결정경계와 비교해서 분류
- 서포트 벡터(support vectors)는 결정 경계에 가장 가까운 각 클래스의 점
- 서포트 벡터와 결정 경계 사이의 거리를 마진(margin)
- SVM은 허용 가능한 오류 범위 내에서 가능한 최대 마진을 만들듬
- 파라미터 C는 허용되는 오류 양을 조절한다. C 값이 클수록 오류를 덜 허용하며 이를 하드 마진(hard margin)이라 부른다. 반대로 C 값이 작을수록 오류를 더 많이 허용해서 소프트 마진(soft margin)을 만듦
- SVM에서는 선형으로 분리할 수 없는 점들을 분류하기 위해 커널(kernel)을 사용한다.
- 커널(kernel)은 원래 가지고 있는 데이터를 더 높은 차원의 데이터로 변환한다. 2차원의 점으로 나타낼 수 있는 데이터를 다항식(polynomial) 커널은 3차원으로, RBF 커널은 점을 무한한 차원으로 변환한다.
- RBF 커널에는 파라미터 감마(gamma)가 있다. 감마가 너무 크면 학습 데이터에 너무 의존해서 오버피팅이 발생할 수 있다.
'APP > 개발' 카테고리의 다른 글
09. 부가데이터_Serializable과 Parcelable (0) | 2022.07.03 |
---|---|
08. boostcourse_ android app_ java_intent/flag (0) | 2022.07.02 |
07. boostcourse_ android app_ java_recyclerview (0) | 2022.06.23 |
06. boostcourse_ android app_ java_listview (0) | 2022.06.22 |
04. boostcourse_ android app_ java_인플레이션 (0) | 2022.06.17 |