gamma 값이 작으면 종 모양 그래프 생성, 샘플이 넓은 범위에 걸쳐 영향을 줘서 결정 경계가 더 부드러워 짐
결국 하이퍼파라미터 r 이 규제의 역할을 수행
모델이 과대적합일 경우에는 감소, 과소적합일 경우는 증가
SVM 회귀
회귀로 SVM을 하는 방법은 분류와 반대로 적용
일정한 마진 오류 안에서 두 클래스 간의 폭이 가능한 최대가 되도록 하는 대신, SVM 회귀는 제한된 마진 오류 안에서 도로 안에 가능한 많은 샘플이 들어가도록 학습 (앱실론으로 폭 조절)
앱실론의 차이를 보여주는 그래프
마진 안에서는 훈련 샘플이 추가되어도 모델의 예측에 영향이 없음, 앱실론에 민감하지 않음
LinearSVR 예시
from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5, random_state=42)
svm_reg.fit(X, y)
비선형 회귀는 kernel SVM, 선형은 Linear SVM
왼쪽은 규제가 없고(C가 큼), 오른쪽은 규제가 큼(C가 작음)
SVM 이론
결정 함수와 예측
선형 SVM 분류기 모델은 단순히 결정 함수를 계산해서 새로운 샘플 x의 클래스를 예측
결과값이 0보다 크면 예측된 클래스는 양성클래스, 반대면 음성클래스
선형 SVM 분류기 예측 식
SVM 결정 함수 이미지
특성이 두 개인 데이터셋이기 때문에 2차원 평면
결정 경계는 결정 함수의 값이 0인 점들로 이루어짐, 평면의 교차점이고 직선
점선은 결정 함수의 값이 1 or -1인 점들을 의미, 선분은 결정 경계에 나란하고 일정한 거리만큼 떨어져서 마진을 형성
선형 SVM 분류기를 훈련한다는 것은 마진 오류를 하나도 발생하지 않거나(하드 마진) 제한적인 마진 오류를 가지면서(소프트 마진) 가능한 마진을 크게하는 가중치 벡터(w) 와 편향(b)를 찾는 것
목적 함수
결정 함수의 기울기는 가중치 벡터의 노름인
과 같음
기울기를 2로 나누는 것은 결국 마진에 2를 곱하는 것과 같은 효과
가중치 벡터 w가 작을수록 마진은 커짐
마진을 크게 하기 위해서
를 최소화
결정 함수가 모든 양성 훈련 샘플에서는 1보다 커야하고 음성 훈련 샘플에서는 -1보다 작아야 함
위에 조건을 통해 음성 샘플일 때 t = -1, 양성 샘플일 때 t=1로 정의하면 모든 샘플에서
로 표현이 가능
하드 마진 선형 SVM 분류기의 목적함수를 제약이 있는 최적화 문제로 표현 가능
하드 마진 선형 SVM 분류기의 목적 함수
소프트 마진 분류기의 목적 함수를 구성하려면 각 샘플에 대해 슬랙 변수을 도입해야함
슬랙 변수는 i번째 샘플이 얼마나 마진을 위반할지 정하는 함수
마진 오류를 최소화 하기 위해 가능한 슬랙 변수의 값을 작게 만드는 것과 마진을 크게 하기 위해
를 가능한 작게 만드는 것
파라미터 C는 두 목표 사이의 트레이드오프
소프트 마진 선형 SVM 분류기의 목적 함수
커널 SVM
2차원 데이터셋에 2차 다항식 변환을 적용하고 선형 SVM 분류기를 변환된 이 훈련 세트에 적용한다면 우리가 적용하고자 하는 2차 다항식 매핑 함수는 아래와 같음
변환된 벡터는 2차원이 아닌 3차원
두 개의 2차원 벡터 a와b에 2차 다항식 매핑을 적용한 다음 변환된 벡터로 점곱을 하면
결과 적으로 변환된 벡터의 점곱이 원래 벡터의 점곱의 제곱과 같음
결과값은 훈련샘플을 어렵게 변환하여 적용하는 것과 같지만 계산량 측면에서 효율적 <- 커널 트릭
연습 문제
1. 서포터 벡터 머신의 근본 아이디어는 무엇인가요?
근본적인 아이디어는 클래스 사이에 가능한 한 가장 넓은 '도로' 를 내는 것이다.
두 클래스를 구분하는 결정 경계와 샘플 사이의 마진을 가능한 크게 내겠다는 것이다.
2. 서포트 벡터가 무엇인가요?
SVM이 훈련된 후에 경계를 포함해 도로에 놓인 어떤 샘플 (속해있다)결정 경계는 서포트 벡터에 의해 결정이 된다. 서포트 벡터가 아닌, 어떤 샘플도 영향을 주지 못한다. 예측할 때에는 전체 훈련 세트가 아니라 서포트 벡터만 관여됨.
3. SVM을 사용할 때 입력값의 스케일이 왜 중요한가요?
가장 큰 마진을 내는 결정 경계를 만드는 것이 목표인데, 훈련세트의 스케일이 맞지 않으면 크기가 작은 특성을 무시하는 경향이 있다.
4. SVM 분류기가 샘플을 분류할 때 신뢰도 점수와 확률을 출력할 수 있나요?
테스트 샘플과 결정 경계 사이의 거리를 출력할 수 있으므로 이를 신뢰도 점수로 사용할 수 있다.
하지만 점수를 바로 확률의 추정값으로는 변환하지 못한다. sklearn에서 SVM모델을 만들 때 probability = True 로 설정하면 훈련이 끝난 후 SVM의 점수에 로지스틱 회귀를 훈련시켜 확률을 계산한다.
이 설정은 predict_proba() 와 predict_log_proba() 메서드를 추가 시킨다.
5. 수백만 개의 샘플과 수백 개의 특성을 가진 훈련 세트에 SVM 모델을 훈련시키려면 원 문제와 쌍대 문제 중 어떤 것을 사용해야 하나요?
커널 SVM은 쌍대 형식만 사용 가능하기에 이 문제는 '선형 SVM'에만 해당한다. 원 문제의 계산 복잡도는 훈련 샘플 수(m)에 비례하지만, 쌍대 형식의 계산 복잡도는 m2 ~ m3 사이의 값에 비례한다. 그러므로 수백 만개의 샘플과 특성이 있다면 쌍대는 너무 느려서 원 문제를 사용해야 한다.
6. RBF 커널을 사용해 SVM 분류기를 훈련시켰더니 훈련 세트에 과소적합된 것 같습니다. γ(gamma)를 증가시켜야 할까, 감소시켜야 할까? C의 경우는 어떠한가?
훈련 세트에 과소 적합 되었다는 것은 규제가 너무 큰 것일 수도 있다. 따라서 규제를 줄이기 위해 γ와 C를 둘 다 증가시키는 것이 모델에 규제를 주어 과소적합을 해결할 수 있다.
7. 이미 만들어진 QP 알고리즘 라이브러리를 사용해 소프트 마진 선형 SVM 분류기를 학습 시키려면 QP 매개변수 (H,f,A,b)를 어떻게 저장해야 하나요?
하드 마진 문제에 관한 QP 파라미터를 H' , f' , A' , b' 라고 하자. 소프트 마진 문제의 QP 파라미터 m개의 추가적인 파라미터(np=n+1+m)와 m개의 추가적인 제약(nc=2m)을 가진다.
정리하면 H는 H'의 오른쪽에 0으로 채워진 m개의 열이 있고 아래로 0으로 채워진 m개의 열이 있는 행렬
f는 f'에 하이퍼파라미터 C와 동일한 값의 원소 m개가 추가된 벡터입니다.
b는 b'에 값이 0인 원소 m개가 추가된 벡터입니다.
A는 A'의 오른쪽에 m x n 단위 행렬이 추가되고 그 아래에이 추가되며 나머지는 0으로 채워진 행렬입니다.
8. 선형적으로 분리되는 데이터셋에 LinearSVC를 훈련시켜보세요. 그런 다음 같은 데이터셋에 SVC와SGDClassifier를 적용해보세요. 거의 비슷한 모델이 만들어지는지 확인해보세요.
Iris 데이터셋을 사용하겠습니다. Iris Setosa와 Iris Versicolor 클래스는 선형적으로 구분이 가능
from sklearn import datasets
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # 꽃잎 길이, 꽃잎 너비
y = iris["target"]
setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
9. MNIST 데이터셋에 SVM 분류기를 훈련시켜보세요. SVM 분류기는 이진 분류기라서 OvA 전략을 사용해 10개의 숫자를 분류해야 합니다. 처리 속도를 높이기 위해 작은 검증 세트로 하이퍼파라미터를 조정하는 것이 좋습니다. 어느 정도까지 정확도를 높일 수 있나요?
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1, cache=True)
X = mnist["data"]
y = mnist["target"].astype(np.uint8)
X_train = X[:60000]
y_train = y[:60000]
X_test = X[60000:]
y_test = y[60000:]