SVM을 잘 사용하려면 파라미터 값을 잘 찾아야 한다. 파라미터를 정하는 한 가지 방법은 교차 검증이다. 또 다른 방법은 SVM 패키지가 제공하는 파라미터 튜닝을 사용하는 것이다.

    e1071에서는 tune( ) 함수를 사용해 모델을 튜닝할 수 있다. help(tune)을 입력해 자세한 사용법을 알아보기 바란다. 다음은 가우시안 커널에서 gamma와 cost 파라미터를 찾는 example(tune)의 일부를 보여준다.

    <Note> SVM 파라미터 gamma와 cost

    가우시안 커널의 gamma는 식 10-9에 보인 γ 를 의미한다.

    SVM에서 cost(흔히 C로 지칭)는 과적합을 막는 정도를 지정하는 파라미터다. 두 개의 분류를 정확히 가운데로 나누는 선이 있으면 좋겠지만 때에 따라 한두 개 데이터만 특이 값을 갖고 있는 경우가 있을 수 있다. 그림 10-12를 보자.

    그림 10-12 SVM의 C(Cost) 파라미터와 과적합의 해결
    그림 10-12 SVM의 C(Cost) 파라미터와 과적합의 해결

    그림 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
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.