sklearn.svm.SVC의 predict_proba

소개



SVM에서 두 클래스 (0/1)의 분류기를 학습하고 각 데이터의 클래스 1에 소속 확률을 내고 싶을 수 있었으므로 sklearn.svm.SVC을 보면 predict_proba 발견했기 때문에, 사용해 보면 안 되는 이야기.

뭐야?



predict(X) 로 예측한 결과와 predict_proba 로 산출한 확률의 정합을 취할 수 없는 (시간이 가끔 있었던) 것입니다.

준비



일단 predict와 predict_proba의 사양을 확인.

predict(X)



[데이터 수] 행 × [차원 수] 열의 특징량 행렬 X 를 인수로 하여, 데이터 수분의 예측 라벨을 돌려준다고 합니다. 읽을 필요 없었다.


predict_proba(X)



「데이터수」행 × 「차원수」열의 특징량 행렬 X 를 인수로 해, 각 데이터가 각각의 클래스에 소속할 확률을 돌려준다, 라고 써 있습니다. 그리고 마지막으로 「열은 클래스명으로 소트 되고 있어 그 클래스명은 classes_로 볼 수 있어요」라고도 써 있습니다.



위를 살펴보면 예를 들어 X = [[-1 -1 0][-1- -2 -1][2 5 1]] , y = ['0' '0' '1'] 같은 데이터의 경우 predict(X)는 (전부 정답이라면) ['0' '0' '1'] .

주제



하지만, predict(X)
['1' '1' '0' '1' '0' '0'  ・・・

그래서 predict_proba (X)
[[0.60069337 0.39930663]
 [0.60064285 0.39935715]
 [0.18527877 0.81472123]
 [0.60069337 0.39930663]
 [0.18525054 0.81474946]
 [0.18532548 0.81467452]
・・・

와 같이 반대로 되어 있을 때가, 몇 번에 1회 있었던 것입니다. 만약에 .classes_에서 클래스의 순서를 확인했습니다만, 이쪽은 몇번 실행해도
['0' '1']

처럼 항상 클래스 이름순이었습니다. predict_proba(X)만이 가끔 반대가 됩니다.

여러가지 조사하면



이 일에 대해 질문하고 설명하는 사람이있었습니다.
  • h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 17017882 / s Shiki t ぇ r-p ぢ ct-p 로바기 ゔ ぇ s-w long g ansu rs
  • h tps : // / ぇ CK 라고 ch. 코 m / 마치 네 - r 마늘 g / svm # C

  • 단적으로 말하면 predict와 predict_proba는 모순되는 일이 있기 때문에 decision_function(X) 사용하는 것이 좋다, 적인 것이 써 있었습니다.

    *어째서 모순되는 것인가 그런 세세한 이야기는 번거롭기 때문에 쓰지 않습니다. 알고 싶다면 "Platt Scaling"로 구그하거나 원론을 읽으십시오.

    그럼 어떻게 하면 좋을까



     여러가지 생각해도 정답은 나오지 않았습니다만, 후보만 들겠습니다.

    1. decision_function(X)를 확률 같은 값으로 변환



    decision_function(X)를 사용하면 위의 예입니다.
    [ 1.00020435  0.99997659 -1.0001893   1.00020435 -1.0003867  -0.99986263
    

    같은 값이 나옵니다. (의미는 생략합니다만) 이 값이 양수라면 클래스 1, 부라고 클래스 0으로 분류되므로, 이 값을 시그모이드 함수에 대입하면 확률 같은 것은 낼 수 있군요. 다만, 시그모이드 함수의 계수를 어떻게 설정하면 좋겠다고 하는 이야기와, 그 계수를 최적화하는 것이 Platt Scaling같은 것이므로 이미 그렇습니다.

    2. predict_proba가 반대로 되어도 괜찮도록 코드 작성



    「predict(X)로 클래스 1로 예측된 ​​데이터의 predict_proba가 큰 쪽의 열이 클래스 1의 열이야」라고 하는 것을 학습시에 기억시켜 둔다든가. 다만, 그것이 이론적으로 해도 좋은 것인지는 모르겠습니다.

    3. SVM 포기



    포기하는 것도 중요합니다.

    결론



    predict_proba는 RandomForest라든지 다른 수법에도 있기 때문에, 그쪽도 같은 느낌이라고 곤란하구나. 이것은 SVM만의 사건이라든가 이렇게 하는 편이 좋다고 생각한다든가 그런 의견을 받을 수 있으면 매우 기쁩니다.

    좋은 웹페이지 즐겨찾기