sklearn.svm.SVC의 predict_proba
4062 단어 파이썬svm.svcscikit-learn
소개
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)만이 가끔 반대가 됩니다.
여러가지 조사하면
이 일에 대해 질문하고 설명하는 사람이있었습니다.
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)만이 가끔 반대가 됩니다.
여러가지 조사하면
이 일에 대해 질문하고 설명하는 사람이있었습니다.
하지만, 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)만이 가끔 반대가 됩니다.
여러가지 조사하면
이 일에 대해 질문하고 설명하는 사람이있었습니다.
단적으로 말하면 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만의 사건이라든가 이렇게 하는 편이 좋다고 생각한다든가 그런 의견을 받을 수 있으면 매우 기쁩니다.
Reference
이 문제에 관하여(sklearn.svm.SVC의 predict_proba), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rawHam/items/3bcb6a68a533f2b82a85
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[ 1.00020435 0.99997659 -1.0001893 1.00020435 -1.0003867 -0.99986263
predict_proba는 RandomForest라든지 다른 수법에도 있기 때문에, 그쪽도 같은 느낌이라고 곤란하구나. 이것은 SVM만의 사건이라든가 이렇게 하는 편이 좋다고 생각한다든가 그런 의견을 받을 수 있으면 매우 기쁩니다.
Reference
이 문제에 관하여(sklearn.svm.SVC의 predict_proba), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rawHam/items/3bcb6a68a533f2b82a85텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)