- SVM(서포트 벡터 머신)은 매우 강력하고 선형이나 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 다목적 머신러닝 모델.
- 특히 복잡한 분류 문제에 잘 맞고, 작거나 중간 크기의 데이터셋에 적합.
- 왼쪽 그래프의 실선 두개는 적절하게 분류하고 있으나, 결정경계가 샘플에 너무 가까워 새로운 샘플에 대해서는 작동하지 못할 우려.
- 오른쪽 그래프의 직선은 두 개의 클래스를 나누면서, 제일 가까운 훈련 샘플로 부터 멀리 떨어져 있음.
- SVM 분류기를 클래스 사이에 가장 폭이 넓은 도로를 찾는 것. -> 라지 마진 분류(large margin classification)
- 또한 도로 경계(오른쪽 점선)에 위치한 샘플에 의해 전적으로 결정. -> 이 샘플을 서포트 벡터(support vector) 즉, 분홍 원에 있는 값.
- SVM은 특성들의 단위를 통일하기 때문에 특성의 스케일에 민감하여 스케일 조정을 하면 결정경계가 좋아짐.
- 모든 샘플이 도로 바깥쪽에 올바르게 분류 -> 하드 마진 분류(hard margin classification)
- 그러나 데이터가 선형적으로 구분되어야 하며, 이상치가 없어야 하는 문제점이 존재.
- 이러한 문제를 피하는 유연한 모델이 소프트 마진 분류(soft margin classification)
- 도로의 폭을 가능한 넓게 유지, 마진오류(이상치) 사이의 적절한 균형이 필요.
- SVM모델의 하이퍼파라미터 C를 낮게 설정한 왼쪽, 높게 설정한 오른쪽. -> 과대적합 모델 일 경우 C를 감소시켜 모델을 규제.
- LinearSVC는 규제에 편향을 포함시키므로, Standard Scaler를 사용하여 데이터 스케일을 맞춰 주어야 함. 또한 loss를 'hinge'로 지정해야하며, 훈련 샘플보다 변수가 많지 않다면 성능을 위하여 dual을 False로 지정.
- LinearSVC를 SVC와 SGDClassifier로 대체하여 사용 가능.
- 선형적으로 분류할 수 없을 때, 비선형으로 다뤄야 할 경우에는 다항 변수 같은 변수를 추가. -> 선형적으로 구분됨.
- 2차원 변수를 추가해 2차원 데이터 셋을 만들면 선형적으로 분류 가능.
- Scikit-learn에서는 PolynomialFeatures를 사용해서 변수를 추가.
- 낮은 차수의 다항식은 복잡한 데이터셋을 표현하지 못하고, 높은 차수의 다항식은 많은 변수를 추가하므로 모델속도가 느려짐.
- SVM에서는 커널 트릭(kernel trick)으로 실제로 변수를 추가하지 않으면서 다항식 특성을 많이 추가한 것과 같은 결과를 얻을 수 있음.
- Scikit-learn에서 kernel='poly'로 설정하고, degree, coef0, C를 설정하여 구현.
- degree는 차수. 과대적합이라면 줄여야하고, 과소적합이면 늘려야함.
- coef0은 모델이 높은 차수와 낮은 차수에 영향을 받을지 조절. -> 이 하이퍼파라미터들은 그리드 서치 등을 이용해 최적을 탐색.
- 각 샘플이 특정 랜드마크(landmark)와 얼마나 닮았는지 측정하는 유사도 함수(similarity function)로 계산한 특성을 추가하는 방법.
- 모든 샘플 위치에 랜드마크를 설정 후 유사도 특성을 추가. (n개의 변수를 가진 m개의 샘플) -> (m개의 변수를 가진 m개의 샘플)
- 장점 : 차원이 커지면서 선형적으로 구분될 가능성이 높음.
- 단점 : 훈련 세트가 매우 클 경우 동일한 크기의 아주 많은 변수가 생성됨.
- 커널 트릭으로 유사도 특성을 많이 추가하는 것과 같은 비슷한 결과를 얻을 수 있음.
- gamma와 C를 조정하여 모델의 복잡도를 조절. -> 규제 역할을 하기 때문에 과대적합일때 감소시키고, 과소적합일때 증가시킴.
- gamma를 증가시키면 각 샘플의 영향 범위가 작아지고, gamma가 작아지면 샘플이 넓은 범위에 영향을 주므로 결정 경계가 부드러워짐.
- 여러 가지 커널 중 어떤 것을 사용할지는 먼저 선형커널(LinearSVC)를 먼저 시도해보는 것이 좋음. -> 훈련 세트가 아주 크거나 변수가 많을 경우
- 훈련 세트가 너무 크지 않으면 가우시안 RBF 커널 시도. -> 대부분 이 커널이 잘 들어맞음.
- 문자열 서브시퀀스 커널(String subsequence kernel), 레벤슈타인 거리(Levenshtein distance)등의 문자열 커널 등은 텍스트 문서나 DNA 서열 분류와 같은 특정한 경우에 사용.
분류기 | 시간 복잡도(m 샘플수, n 변수 수) | 외부 메모리 학습 | 스케일 조정 | 커널 트릭 | 다중 클래스 분류 |
---|---|---|---|---|---|
LinearSVC | 𝑂(𝑚 × 𝑛) | 미지원 | 필요 | 미지원 | OvR 기본 |
SGDClassifier | 𝑂(𝑚 × 𝑛) | 지원 | 필요 | 미지원 | 지원 |
SVC | 𝑂(𝑚^2 × 𝑛) ∼ 𝑂(𝑚^3 × 𝑛) | 미지원 | 필요 | 지원 | OvR 기본 |
- LinearSVC는 훈련 샘플과 변수 수가 거의 선형적으로 증가
- SVC는 복잡하지만 작거나 중간 규모의 훈련 세트에 잘 맞음.
- SVC의 변수 개수는 특히 희소 특성(sparse features)이 잘 확장됨. -> 알고리즘의 성능이 샘플이 가진 0 아닌 변수 평균 수에 비례.
- SVM은 선형 비선형 분류 뿐만 아니라, 선형 비선형 회귀에도 사용 가능.
- 회귀에 적용하는 경우 목표를 반대로. -> 제한된 마진 오류(도로 밖의 샘플)안에서 도로 안에 가능한 한 많은 샘플이 들어가도록 학습.
- 도로의 폭은 하이퍼파라미터 ε으로 조절.
- Scikit-learn에서는 선형 회귀작업은 LinearSVR으로 적용. cf) LinearSVC -> 분류
- 비선형 회귀작업은 커널 SVM 모델(SVR) 사용. cf) SVC -> 분류
- 선형 SVM 분류기 모델은 결정함수를 계산해 결과값이 0보다 크면 예측된 클래스 ŷ은 양성 클래스(1)이 되고 결과값이 0보다 작으면 음성 클래스(0)이 됨.
- 여기서 w는 변수의 가중치 벡터, b는 편향.
- 결정경계를 구하기 위해 결정함수와 0인값의 평면을 교차시킴. -> 직선(실선으로 나타냄)으로 교차함(결정경계)
- 결정함수의 값이 1 또는 -1인 값을 교차시켜 두 직선(점선으로 나타냄)을 생성하여 마진 형성.
- 선형 SVM 분류기를 훈련 시키는 것은 마진 오류를 하나도 발생하지 않거나, 제한적인 마진 오류를 가지면서 가능한 한 마진을 크게하는 w와 b를 찾는 것.
- 결정 함수의 기울기는 가중치 벡터의 노름 ‖𝐰‖와 같음. 가중치 벡터 w(기울기)가 작을수록 마진은 커짐.
- 마진을 크게 하기 위해 ‖𝐰‖를 최소화.
- 하드 마진 : 모든 양성 샘플에 대한 결정 함수의 값이 1보다 크고 -1보다 작음.
- 소프트 마진 : 모든 샘플에 대한 결정 함수의 값이 지정된 값 이상 또는 이하.
- 소프트 마진에서 하이퍼파라미터 C는 슬랙 변수의 값을 작게 만드는 목표와 1/2𝑤𝑇𝑤값을 작게 만드는 목표의 트레이드오프를 조절.
- ‖𝐰‖를 최소화 하는 대신 𝑤𝑇𝑤를 최소화 하는 이유는 ‖𝐰‖는 w=0에서 미분할 수 없기에 최적화 알고리즘이 작동하지 않음.
- 하드 마진과 소프트 마진 모두 선형 제약조건이 있는 볼록함수의 이차 최적화 문제. -> 콰드라틱 프로그래밍(QP) 문제
- 어려우니까 pass.
- 쌍대 문제(dual problem)란, 주어진 문제의 답과 동일한 답을 갖는 문제.
- SVM 문제는 원 문제 또는 쌍대 문제 둘다 해결 가능.
- 훈련 샘플 수가 변수 개수보다 작을 때 원 문제보다 쌍대 문제로 푸는 것이 더 빠르며, 커널 트릭을 가능하게 함.
- 몰라.(후에 추가 예정)
- 온라인 학습은 새로운 샘플이 생겼을 때 점진적으로 학습하는 것.
- 선형 온라인 SVM 구현 : 특정 비용함수를 최소화하기 위한 경사하강법 사용. -> SGDClassifier에서 loss 파라미터를 hinge로 설정.
- 그러나 QP 기반의 방법보다 훨씬 느리게 수렴.
- 비선형 온라인 SVM 구현 : 온라인 커널 SVM 구현 가능 -> 논문에 기술 및 Matlab이나 C++로 주로 구현.
- 신경망 알고리즘을 고려하는 것이 좋음.