[AI] Support Vector Machine, SVM : Scikit - Learn

Ik·2022년 7월 17일
0

Data

목록 보기
19/34

SVM

SVM?

  • 하나의 분류 그룹을 다른 그룹과 분리하는 최적의 경계를 찾아내는 알고리즘
    • 마진이 가장 넓은 선을 찾는 알고리즘
  • Support Vector간의 가장 넓은 margin(간격)을 가지는 초평면(결정경계)가 최대화 하는 것이 목적
    • 초평면은 데이터가 존재하는 공간보다 1차원 낮은 부분 공간
    • 공간을 나누는 목적으로 사용
  • Margin
    • 두 Support Vector간의 너비
    • Hard Margin
      • Outlier 무시X
      • Margin이 매우 좁아질 수 있다
      • Overfitting의 원인
    • Soft Margin
      • Outlier 무시
      • Margin의 거리 넓어진다
      • Underfittin의 원인
  • Hyper Parameter
    • C
      • Outlier를 무시하는 비율 설정
      • Hard와 Soft 선택을 결정하는 파라미터
      • default : 1
      • 크면 클수록 Hard ==> Overfitting
      • 작으면 작을수록 Soft ==> Underfitting
  • 종류
    • Linear SVM
    from sklearn.svm import SVC
     svc = SVC(kernel='linear', C=c, random_state=0)   # 보통 c는 list형태, 반복문 이용해 학습
     # 학습
     svc.fit(전처리된 Feature, Label)
     pred_train = svc.predict(전처리된 Feature)
     pred_test = svc.predict(전처리된 Feature)
     train_acc_list.append(accuracy_score(y_train, pred_train))
     test_acc_list.append(accuracy_score(y_test, pred_test))
    • NonLinear SVM
      • 선형으로 분리가 되지 않는 경우
      • 기존의 Feature를 이용한 파생변수로 Feature 추가(다항식 특성 추가)
        • 하지만 차원을 늘리는 경우(다항식 특성을 추가하는 경우) 낮은 차수의 다항식은 데이터의 패턴을 잘 표현하지 못해 과소적합이 너무 높은 차수의 다항식은 과대적합과 모델을 느리게 하는 문제 존재
        • 이를 개선 위해 Kernel Trick 이용
          • 다항식 특성을 추가하지 않으면서 수학적 기교를 적용해 다항식 특성을 추가한 것과 같은 결과를 얻을 수 있는 작업
          • 종류
            • 방사 기저 함수(radial base function-RBF)
              • 커널 서포트 벡터 머신의 기본 커널 함수
              • 특정 데이터 포인트를 기준점으로 다른 데이터 포인트들이 얼마나 떨어졌는지를 계산
      • Hyper Parameter
        • C : 오차(Outlier) 허용 기준
        • gamma
          • 큰 값일 수록(이상치, 경계값까지 학습해) 과적합이 날 가능성 크다
          • 모델이 과대적합일 경우 => 값을 감소시킴
          • 모델이 과소적합일 경우 => 값을 증가시킴
        • => C, gamma가 클수록 과적합 가능성 크다
      svc = SVC(kernel='rbf',     # default가 rbf이기에 생략가능
                C=1,
                gamma=gamma, 
                random_state=0)
      svc.fit(전처리된 Feature, Label)          

ROC CURVE, (AUC, AP) SCORE

from sklearn.metrics import roc_auc_score, average_precision_score
roc_auc_score(Label, prob), average_precision_score(Label, prob)

SVM - GridSearch

param = {
    'kernel':['rbf', 'linear'],
    'C':[0.001, 0.01, 0.1, 1, 10, 100],
    'gamma':[0.001, 0.01, 0.1, 1, 10]
}
svc = SVC(random_state=0, probability=True)
gs_svc = GridSearchCV(svc, 
                      param_grid=param, 
                      scoring='accuracy',
                      cv=3,
                      n_jobs=-1)
gs_svc.fit(전처리된 Feature, Label)               

0개의 댓글