이진 분류(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
'공부' 카테고리의 다른 글
워드투벡터(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 |