SVM을 잘 사용하려면 파라미터 값을 잘 찾아야 한다. 파라미터를 정하는 한 가지 방법은 교차 검증이다. 또 다른 방법은 SVM 패키지가 제공하는 파라미터 튜닝을 사용하는 것이다.
e1071에서는 tune( ) 함수를 사용해 모델을 튜닝할 수 있다. help(tune)을 입력해 자세한 사용법을 알아보기 바란다. 다음은 가우시안 커널에서 gamma와 cost 파라미터를 찾는 example(tune)의 일부를 보여준다.
가우시안 커널의 gamma는 식 10-9에 보인 γ 를 의미한다.
SVM에서 cost(흔히 C로 지칭)는 과적합을 막는 정도를 지정하는 파라미터다. 두 개의 분류를 정확히 가운데로 나누는 선이 있으면 좋겠지만 때에 따라 한두 개 데이터만 특이 값을 갖고 있는 경우가 있을 수 있다. 그림 10-12를 보자.
그림 10-12에서 직선은 혼자만 특이한 위치에 있는 검은 점까지 고려한 선이며 점선은 해당 점을 제외한 뒤의 선이다. 직선은 데이터를 정확히 반영하지만 데이터의 노이즈에 집착한 과적합 가능성이 보인다. 반면 점선은 한 개의 점은 잘못 분류했지만 전체적인 데이터의 모양을 더 잘 나타낸다.
Cost는 점선의 경우처럼 데이터를 잘못 분류하는 선을 긋게 될 경우 얼마만큼의 비용(cost)을 지불할 것인지를 지정한다. 그리고 SVM은 1) 데이터를 한 가운데로 얼마나 잘 나누는지와 2) 잘못 구분한 점으로 인한 비용의 합을 최소화하는 선을 찾는다. 결과적으로 SVM은 Cost를 사용해 과적합 정도를 조절하게 된다.
> install.packages("e1071") > library(e1071) > tune(svm, Species ~., data=iris, gamma=2^(-1:1), cost=2^(2:4)) Parameter tuning of `svm': - sampling method: 10-fold cross validation - best parameters: gamma cost 0.5 4 - best performance: 0.05333333
tune( )의 반환 값은 객체며, 객체의 속성은 attributes( )로 살펴볼 수 있다. 다음은 최적 파라미터 값을 빼내는 코드의 예다.
> attributes(result) $names [1] "best.parameters" "best.performance" "method" "nparcomb" [5] "train.ind" "sampling" "performances" "best.model" $class [1] "tune" > result$best.parameters # 최적 파라미터 gamma cost 1 0.5 4 > result$best.parameters["gamma"] # 최적 파라미터 중 gamma gamma 1 0.5 > result$best.parameters["cost"] # 최적 파라미터 중 cost cost 1 4