본문 바로가기

공부

SVM model에서 proba 값의 threshold != 0.5?

반응형

이진 분류(binary classification) 문제에서,

 

문제 인식

SVM(support vector machine) model를 사용하던 중, 각 class의 예측된 인스턴스를 찾기 위해 model.predict(data) 함수를 호출 하였고, 0과 1로 분류될 확률 점수(probability scores)를 주기 위해서 model.predict_proba(data)함수를 호출 했다. 

그러나, SVM 의 확률 점수(probability scores)가 0.5 미만인 경우에 1로 예측한 값이 보인다.

 

아래 그림에서, 2번째 row가 0일 확률 값이 0.5보다 낮지만, 0으로 labeling 된 것을 확인할 수 있다.

 

문제 파악

sklearn에서 이진 분류 문제와 관련해서 다음과 같이 보고 되어있다.

 

https://scikit-learn.org/stable/modules/svm.html#scores-and-probabilities

확률 추정치(probability estimates)는 점수와 일치하지 않을 수 있다.
점수의 "argmax"는 확률의 argmax가 아닐 수 있다. 이진 분류에서 predict_proba의 출력이 0.5 미만인 경우에도 양성 클래스에 속하는 것으로 predict에 의해 레이블이 지정될 수 있다. 마찬가지로, predict_proba의 출력이 0.5보다 크더라도 음수로 표시될 수 있다.

 

normal SVM model은 주어진 각 데이터 점(point)에 대한 결정 값을 계산한다. 기본적으로 separating hyperplane에서 해당 점(point)까지의 거리이다.

hyperplane의 한쪽 (dec_value >= 0)에 있는 모든 항목은 class A로 예측되고, 다른 쪽(dec_value < 0)에 있는 모든 항목은 클래스 B로 예측된다.

 

그러나. 클래스 확률(class probabilities)를 계산하면, 예를 들어, 결정값(decision value)이 0.1인 점(point)이 있을 수 있으며, 이는 class A가 된다. 그러나 class A에서의 확률 계산은 45%이고, class B의 확률 계산은 55%일 수 있으므로 알고리즘은 그것을 B라고 예측한다.

class 알고리즘을 계산하기 위한 가능한 알고리즘은 논문 section 8에 있다. 

https://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf

학습에서 얻은 확률 정보(probability information)를 얻은 후, 결정 값(decision value)이 >= 0 인 경우에만 prob >= 0.5가 아니다. 
Basically says "A decision value of >= 0 does not mean probA > probB or vice versa.

 

 

 

solution

1. 확률을 사용하지 않아도 되는 상황이라면, decision_function 사용.

2. 이진 분류 문제(binary classification problems)에서 항상 일관성(consistency)을 유지하려면, predict_proba()의 출력을 기반으로 예측하는 분류기가 필요

 def predict(self, X):
     y_proba = self.predict_proba(X)
     return np.argmax(y_proba, axis=1)

 

 

 

 

출처 및 참고:

https://stackoverflow.com/questions/29708301/libsvm-different-result-with-without-probabilities

https://stackoverflow.com/questions/68475534/svm-model-predicts-instances-with-probability-scores-greater-than-0-1default-th

반응형

'공부' 카테고리의 다른 글

워드투벡터(Word2Vec)  (1) 2023.10.04
채널톡 챌린저스 1기 해커톤  (0) 2023.03.04
predict_proba 와 decision_function 차이점  (0) 2022.12.28
[NLP] 한글 임베딩  (0) 2022.12.28
머신러닝 강의 1편  (1) 2022.12.21