SVM 하이퍼파라미터 이해

SVM 하이퍼파라미터 이해

개요

이 가이드는 SVM(Support Vector Machines)에 대한 세 가지 가이드 중 두 번째 부분입니다. 이 가이드에서는 위조 지폐 사용 사례에 대해 계속 작업하고, Scikit-learn에 의해 이미 설정된 SVM 매개변수, C 및 Gamma 하이퍼 매개변수가 무엇인지, 교차 검증 및 그리드 검색을 사용하여 이를 조정하는 방법을 이해할 것입니다.

전체 SVM 가이드 시리즈에서는 SVM 하이퍼파라미터 외에도 간단한 SVM이라는 개념에 대해 알아봅니다. 커널 트릭, 다른 유형의 SVM을 탐색합니다.

모든 가이드를 읽거나 첫 번째 가이드를 살펴보거나 가장 관심 있는 가이드를 확인하려면 각 가이드에서 다루는 주제 표가 아래에 나와 있습니다.

  1. Python의 Scikit-Learn으로 SVM 및 커널 SVM 구현
  • 사용 사례: 지폐를 잊어버림
  • SVM의 배경
  • 단순(선형) SVM 모델
    • 데이터세트 정보
    • 데이터세트 가져오기
    • 데이터 세트 탐색
  • Scikit-Learn으로 SVM 구현
    • 데이터를 훈련/테스트 세트로 나누기
    • 모델 훈련
    • 예측하기
    • 모델 평가
    • 결과 해석

2. SVM 하이퍼파라미터의 이해

  • C 하이퍼파라미터
  • 감마 하이퍼파라미터

3. Python의 Scikit-Learn으로 다른 SVM 기능 구현 (곧 출시됩니다!)

  • SVM의 일반적인 아이디어(요약)
  • 커널(트릭) SVM
  • Scikit-Learn으로 비선형 커널 SVM 구현
  • 라이브러리 가져 오기
    • 데이터세트 가져오기
    • 데이터를 기능(X)과 대상(y)으로 나누기
    • 데이터를 훈련/테스트 세트로 나누기
    • 알고리즘 훈련
  • 다항식 커널
    • 예측하기
    • 알고리즘 평가
  • 가우스 커널
    • 예측 및 평가
  • 시그모이드 커널
    • 예측 및 평가
  • 비선형 커널 성능 비교

교차 검증을 구현하고 하이퍼파라미터 튜닝을 수행하는 방법을 알아보겠습니다.

SVM 하이퍼파라미터

Scikit-learn에 의해 이미 설정된 모든 모델 매개변수와 해당 기본값을 보려면 다음을 사용할 수 있습니다. get_params() 방법:

svc.get_params()

이 방법은 다음을 표시합니다.

{'C': 1.0, 'break_ties': False, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0, 'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'scale', 'kernel': 'linear', 'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True, 'tol': 0.001, 'verbose': False}

총 15개의 하이퍼파라미터가 이미 설정되어 있다는 점에 유의하십시오. 이는 SVM 알고리즘에 많은 변형이 있기 때문에 발생합니다. 우리는 선형 함수를 얻기 위해 선형 커널을 사용했지만 다른 종류의 함수를 설명하는 커널도 있으며 이러한 커널은 다른 방식으로 매개변수화됩니다.

이러한 변형은 모델을 보다 유연하게 만들고 서로 다른 형태의 데이터 간의 분리를 찾는 데 적합합니다. 클래스를 구분하기 위해 선을 그릴 수 있다면 선형 커널 좋은 옵션이 될 것입니다. 곡선이 필요한 경우 다항식 데이터가 원형인 경우 커널이 최선의 선택일 수 있습니다. 방사형 기저 기능 or RBF 커널은 데이터에 더 적합합니다. 임계값 위 또는 아래 값이 있는 경우 시그 모이 드 커널은 클래스를 더 잘 분리할 수 있습니다. 데이터에서 탐색한 내용에 따르면 RBF 또는 다항식 커널이 선형 커널보다 더 적합한 것으로 보입니다.

이제 우리는 4가지 유형의 서로 다른 커널 함수가 있다는 아이디어를 얻었으므로 매개변수로 돌아갈 수 있습니다. SVM 알고리즘이 클래스 간의 분리를 찾으려고 할 때 우리는 이미 분류를 그리는 것을 이해했습니다. 한계 지지 벡터와 분리선(또는 곡선) 사이.

이 여백은 어떤 의미에서 구분선과 점 사이의 버퍼와 같습니다. 여백 크기는 다를 수 있습니다. 작은, 마진을 벗어나는 포인트에 대한 공간이 적어 클래스 간의 구분이 더 명확해져서 더 많은 샘플이 올바르게 분류, 반대로 마진이 , 클래스 간의 구분이 덜 명확하고 더 많은 샘플이 잘못 분류된. 즉, 마진이 작을수록 더 정확하게 분류된 샘플을 의미하고 더 많은 까다로운 분류기는 여백이 클수록 더 많이 잘못 분류된 샘플을 나타내지만 융통성있는 분류기.

이러한 여백이 선택되면 이를 결정하는 매개변수는 C 매개 변수입니다.

C 하이퍼파라미터

XNUMXD덴탈의 C 매개변수는 여백 크기에 반비례하므로 의 값 CWalk Through California 프로그램, 작은 여백, 그리고 반대로 작은 의 값 CWalk Through California 프로그램, 여백. 그만큼 C 매개변수는 모든 커널과 함께 사용할 수 있으며 알고리즘에 각 교육 샘플의 오분류를 방지하는 방법을 알려줍니다. 정규화. 우리의 선형 커널 SVM은 C 1.0의 넓은 값을 주고 더 작은 여백.

SVM 하이퍼파라미터 이해 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

우리는 작은 'C'의 가치와 실제로 어떤 일이 일어나는지 이해하십시오. 더 큰 여백. 이를 위해 새로운 분류자를 생성할 것입니다. svc_c, 값만 변경 C0.0001. 또한 반복하자 fitpredict 단계 :

svc_c = SVC(kernel='linear', C=0.0001)
svc_c.fit(X_train, y_train)
y_pred_c = svc_c.predict(X_test)

이제 테스트 데이터의 결과를 볼 수 있습니다.

print(classification_report(y_test, y_pred_c)) cm_c = confusion_matrix(y_test, y_pred_c)
sns.heatmap(cm_c, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001')

이 결과는 다음과 같습니다.

 precision recall f1-score support 0 0.82 0.96 0.88 148 1 0.94 0.76 0.84 127 accuracy 0.87 275 macro avg 0.88 0.86 0.86 275
weighted avg 0.88 0.87 0.86 275

SVM 하이퍼파라미터 이해 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

더 작은 것을 사용함으로써 C 더 큰 마진을 얻으면 분류기가 더 유연해지고 더 많은 분류 오류가 발생합니다. 분류 보고서에서 우리는 f1-score이전에 두 클래스 모두 0.99였던 는 클래스 0.88의 경우 0로, 클래스 0.84의 경우 1로 낮아졌습니다. 혼동 행렬에서 모델은 2개에서 6개로, 거짓 음성은 2개에서 31개로 줄었습니다.

우리는 또한 다음을 반복할 수 있습니다. predict 학습 데이터를 사용할 때 여전히 과적합이 있는지 확인하기 위해 결과를 확인하고 단계를 수행하십시오.

y_pred_ct = svc_c.predict(X_train) cm_ct = confusion_matrix(y_train, y_pred_ct)
sns.heatmap(cm_ct, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001 and train data') print(classification_report(y_train, y_pred_ct))

결과 :

 precision recall f1-score support 0 0.88 0.96 0.92 614 1 0.94 0.84 0.88 483 accuracy 0.90 1097 macro avg 0.91 0.90 0.90 1097
weighted avg 0.91 0.90 0.90 1097

SVM 하이퍼파라미터 이해 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

더 작은 결과를 보면 C 과적합이 개선된 것을 볼 수 있지만 대부분의 메트릭이 훈련 데이터에 대해 여전히 더 높으면 과적합이 해결되지 않은 것 같습니다. 그래서, 그냥 변경 C 매개변수는 모델을 더 유연하게 만들고 일반화를 개선하기에 충분하지 않았습니다.

주의 사항: 함수가 데이터에서 너무 멀어지거나, 너무 고정되거나, 높은 편향 또는 그 반대입니다. 데이터에 가깝거나 너무 유연하거나 높은 분산 일반적으로 편향 분산 트레이드 오프. 균형을 찾는 것은 사소한 일이 아니지만, 균형이 달성되면 데이터에 대한 모델의 과소적합 또는 과적합이 없습니다. 분산을 줄이고 과적합을 방지하는 방법으로 데이터를 설명하는 함수를 얻을 때 데이터를 균등하게 축소하여 더 규칙적이고 단순화할 수 있습니다. 그게 바로 매개변수 C SVM에서 사용될 때 그런 이유로 라고도 합니다. L2 정규화 or 릿지 회귀.

지금까지 SVM의 여백과 이들이 알고리즘의 전체 결과에 미치는 영향에 대해 이해했지만 클래스를 구분하는 선(또는 곡선)은 어떻습니까? 이 라인은 결정 경계. 따라서 마진이 실수에 대한 결정 경계 유연성에 영향을 미친다는 것을 이미 알고 있으므로 이제 결정 경계에도 영향을 미치는 다른 매개변수를 살펴볼 수 있습니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

주의 사항: 결정 경계는 또한 초평면. 초평면은 공간의 차원 수에서 1을 뺀 수(dims-2)를 나타내는 기하학적 개념입니다. x 및 y 좌표가 있는 평면과 같이 공간이 1차원인 경우 4차원 선(또는 곡선)이 초평면입니다. 기계 학습 맥락에서 모델에 사용되는 열의 수는 평면 차원이므로 3개의 열과 SVM 분류기로 작업할 때 클래스 간에 구분되는 XNUMX차원 초평면을 찾습니다.

감마 하이퍼파라미터

무한한 결정 경계를 선택할 수 있으며 이러한 경계 중 일부는 클래스를 구분하고 다른 경계는 그렇지 않습니다. 효과적인 결정 경계를 선택할 때 각 클래스의 가장 가까운 처음 10개 지점을 고려해야 합니까? 아니면 멀리 있는 지점을 포함하여 더 많은 지점을 고려해야 합니까? SVM에서 범위 선택은 다른 하이퍼파라미터로 정의됩니다. gamma.

처럼 C, gamma 거리에 다소 반비례합니다. 그만큼 더 높은 그 가치, 가장 가까운 결정 경계에 대해 고려되는 포인트이고 가장 낮은 전에, gammaWalk Through California 프로그램, 더 멀리 결정 경계를 선택하기 위해 포인트도 고려됩니다.

SVM 하이퍼파라미터 이해 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

감마의 또 다른 영향은 값이 높을수록 결정 경계의 범위가 주변 지점에 더 가까워져 더 들쭉날쭉하고 과적합되기 쉽습니다. 값이 낮을수록 결정 경계가 더 매끄럽고 규칙적입니다. 또한 표면이 과적합되는 경향이 적습니다. 이것은 모든 초평면에 해당되지만 더 높은 차원에서 데이터를 분리할 때 더 쉽게 관찰할 수 있습니다. 일부 문서에서는 gamma 라고도 할 수 있습니다 sigma.

SVM 하이퍼파라미터 이해 PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

우리 모델의 경우 기본값은 gamma 였다 scale. 에서 볼 수 있듯이 Scikit-learn SVC 설명서, 이는 해당 값이 다음과 같음을 의미합니다.

$$
감마 = (1/ 텍스트{n_features} * X.var())
$$

or

$$
감마 = (1/ 텍스트{특성_수} * 텍스트{특성_분산})
$$

우리의 경우 분산을 계산해야 합니다. X_train, 4를 곱하고 결과를 1로 나눕니다. 다음 코드를 사용하여 이를 수행할 수 있습니다.

number_of_features = X_train.shape[1] features_variance = X_train.values.var()
gamma = 1/(number_of_features * features_variance)
print('gamma:', gamma)

이 결과는 다음과 같습니다.

gamma: 0.013924748072859962

의 가치를 보는 또 다른 방법이 있습니다. gamma, 분류자의 개체에 액세스하여 gamma 매개 변수 ._gamma:

svc._gamma 

우리는 그것을 볼 수 있습니다 gamma 우리 분류기에서 사용된 값이 낮았기 때문에 더 멀리 있는 지점도 고려했습니다.

주의 사항: 우리가 본 바와 같이, Cgamma 모델의 일부 정의에 중요합니다. 또 다른 하이퍼파라미터, random_state는 Scikit Learn에서 데이터 셔플링 또는 모델에 대한 임의 시드를 보장하는 데 자주 사용되므로 항상 동일한 결과를 얻을 수 있지만 SVM의 경우 약간 다릅니다. 특히, random_state 다른 하이퍼파라미터가 있는 경우에만 의미가 있습니다. probability, true로 설정됩니다. 이는 확률 추정치를 얻기 위해 데이터를 섞기 때문입니다. 클래스에 대한 확률 추정을 원하지 않고 확률이 false로 설정된 경우 SVM의 random_state 매개변수는 모델 결과에 영향을 미치지 않습니다.

C 및 감마와 같은 하이퍼파라미터의 값을 선택하는 방법에 대한 규칙은 없습니다. 서로 다른 하이퍼파라미터 값으로 실험할 수 있는 시간과 리소스, 데이터에 어떤 변환을 수행할 수 있는지, 예상되는 결과에 따라 달라집니다. . 하이퍼파라미터 값을 검색하는 일반적인 방법은 제안된 각 값을 그리드 검색 이러한 하이퍼파라미터 값을 적용하고 교차 검증. Scikit-learn에서는 이미 다음과 같이 구현되어 있습니다. GridSearchCV (교차 검증의 CV) 방법.

교차 유효성 검사로 그리드 검색을 실행하려면 다음을 가져와야 합니다. GridSearchCV, 유형과 같이 실험할 하이퍼파라미터의 값으로 사전을 정의합니다. kernel, 범위 C등에 대한 gamma, 인스턴스 생성 SVC, 정의 score 또는 메트릭이 평가에 사용됩니다(여기서는 정밀도와 재현율 모두에 대해 최적화하도록 선택하므로 f1-score), 검색을 실행하기 위해 데이터에서 만들어질 분할 수 cv – 기본값은 5이지만 최소 10을 사용하는 것이 좋습니다. 여기서는 결과를 비교할 때 더 명확하게 하기 위해 5개의 데이터 접기를 사용합니다.

XNUMXD덴탈의 GridSearchCV 있다 fit 기차 데이터를 수신하고 교차 유효성 검사를 위해 기차 및 테스트 세트로 추가로 분할하는 메서드입니다. 우리는 설정할 수 있습니다 return_train_score 결과를 비교하고 과적합이 없음을 보장하려면 true로 설정합니다.

다음은 교차 유효성 검사를 사용한 그리드 검색 코드입니다.

from sklearn.model_selection import GridSearchCV parameters_dictionary = {'kernel':['linear', 'rbf'], 'C':[0.0001, 1, 10], 'gamma':[1, 10, 100]}
svc = SVC() grid_search = GridSearchCV(svc, parameters_dictionary, scoring = 'f1', return_train_score=True, cv = 5, verbose = 1) grid_search.fit(X_train, y_train)

이 코드는 다음을 출력합니다.

Fitting 5 folds for each of 18 candidates, totalling 90 fits
# and a clickable GridSeachCV object schema

하이퍼파라미터 검색을 수행한 후 다음을 사용할 수 있습니다. best_estimator_, best_params_best_score_ 최상의 모델, 매개변수 값 및 가장 높은 f1-점수를 얻기 위한 속성:

best_model = grid_search.best_estimator_
best_parameters = grid_search.best_params_
best_f1 = grid_search.best_score_ print('The best model was:', best_model)
print('The best parameter values were:', best_parameters)
print('The best f1-score was:', best_f1)

결과 :

The best model was: SVC(C=1, gamma=1)
The best parameter values were: {'C': 1, 'gamma': 1, 'kernel': 'rbf'}
The best f1-score was: 0.9979166666666666

데이터를 보고 초기 추측을 확인하면 최상의 모델에는 선형 커널이 아니라 비선형 커널인 RBF가 있습니다.

조언: 더 자세히 조사할 때 그리드 검색에 더 많은 비선형 커널을 포함하는 것이 흥미롭습니다.

모두 Cgamma 1의 값을 가지며 f1-score 0.99로 매우 높습니다. 값이 높기 때문에 우리가 반환한 평균 테스트와 훈련 점수를 엿보고 과대적합이 있었는지 살펴보자. cv_results_ 목적:

gs_mean_test_scores = grid_search.cv_results_['mean_test_score']
gs_mean_train_scores = grid_search.cv_results_['mean_train_score'] print("The mean test f1-scores were:", gs_mean_test_scores)
print("The mean train f1-scores were:", gs_mean_train_scores)

평균 점수는 다음과 같습니다.

The mean test f1-scores were: [0.78017291 0. 0.78017291 0. 0.78017291 0. 0.98865407 0.99791667 0.98865407 0.76553515 0.98865407 0.040291 0.98656 0.99791667 0.98656 0.79182565 0.98656 0.09443985] The mean train f1-scores were: [0.78443424 0. 0.78443424 0. 0.78443424 0. 0.98762683 1. 0.98762683 1. 0.98762683 1. 0.98942923 1. 0.98942923 1. 0.98942923 1. ]

평균 점수를 보면 가장 높은 0.99791667이 두 번 나타나고 두 경우 모두 열차 데이터의 점수가 1이라는 것을 알 수 있습니다. 이는 과적합이 지속됨을 나타냅니다. 여기에서 데이터 준비로 돌아가서 데이터를 정규화하고, 다른 유형의 데이터 변환을 수행하고, 기능 엔지니어링을 통해 새로운 기능을 만드는 것이 합리적인지 이해하는 것이 흥미로울 것입니다.

우리는 방금 모델 하이퍼파라미터를 찾는 기술을 보았고 선형 분리 가능성, 지원 벡터, 결정 경계, 마진 최대화 및 커널 트릭에 대해 이미 언급했습니다. SVM은 복잡한 알고리즘으로 일반적으로 많은 수학적 개념이 관련되어 있고 조정이 가능한 작은 부분이 전체적으로 결합되도록 조정해야 합니다.

지금까지 본 것을 결합하고 SVM의 모든 부분이 어떻게 작동하는지 요약한 다음 다른 커널 구현을 결과와 함께 살펴보겠습니다.

결론

이 기사에서 우리는 Scikit-Learn의 SVM 구현 뒤에 있는 기본 매개변수에 대해 이해했습니다. 우리는 C 및 Gamma 매개변수가 무엇인지, 각 매개변수를 변경하면 SVM 모델에 어떤 영향을 미칠 수 있는지 이해했습니다.

또한 최상의 C 및 감마 값을 찾고 교차 검증을 사용하여 결과를 더 일반화하고 어떤 형태의 데이터 유출이 없음을 보장하는 그리드 검색에 대해 배웠습니다.

그리드 검색 및 교차 유효성 검사를 통해 하이퍼파라미터 튜닝을 수행하는 것은 데이터 과학의 일반적인 관행이므로 기술을 구현하고 코드를 실행하고 하이퍼파라미터 값과 SVM 예측의 변경 사이의 링크를 확인하는 것이 좋습니다.

타임 스탬프 :

더보기 스택카부스