2014-10-21 1 views
15

바이너리 분류 문제에 대해 scikit learn (LinearSVC)의 선형 SVM을 사용합니다. LinearSVC는 예측 된 레이블과 의사 결정 점수를 줄 수 있지만 확률 추정치 (레이블 신뢰도)를 원했습니다. 선형 커널을 사용하는 sklearn.svm.SVC와 비교하여 속도 때문에 LinearSVC를 계속 사용하고자합니다. 의사 결정 점수를 확률로 변환하는 데 Logistic 함수를 사용하는 것이 합리적입니까?LinearSVC의 결정 함수를 확률로 변환하기 (Scikit learn python)

import sklearn.svm as suppmach 
# Fit model: 
svmmodel=suppmach.LinearSVC(penalty='l1',C=1) 
predicted_test= svmmodel.predict(x_test) 
predicted_test_scores= svmmodel.decision_function(x_test) 

는 I는 확률 추정치를 획득하는 것이 합리적 있는지 확인하고자 단순히 [1/(1 + EXP (-x))] X가 결정 점수이다.

다른 방법으로는이 작업을 효율적으로 수행하는 데 사용할 수있는 분류 기준이 있습니까?

감사합니다.

답변

5

sklearn.svm. * 패밀리의 apis를 살펴 보았습니다. 모든 아래 모델, 예를 들어,

  • sklearn.svm.SVC
  • sklearn.svm.NuSVC
  • sklearn.svm.SVR
  • sklearn.svm.NuSVR는

는 공통이 interface은 a를 제공합니다.

probability: boolean, optional (default=False) 

델. 이 매개 변수가 True로 설정되면 libsvm은 Platt Scaling의 아이디어를 기반으로 SVM의 출력 위에 확률 변환 모델을 훈련시킵니다. 변환의 형식은 당신이 지적한 바와 같이 물류 기능과 유사하지만 두 개의 특정 상수 AB은 사후 처리 단계에서 학습됩니다. 자세한 내용은 stackoverflow 게시물을 참조하십시오. 이 후 처리가 LinearSVC 사용할 수없는 이유

enter image description here

는 사실은 알지 못한다. 그렇지 않은 경우 확률 추정치를 얻으려면 predict_proba(X)으로 전화하십시오.

순진한 물류 변환을 적용하는 경우 물론 Platt Scaling과 같은 조정 된 접근법만큼 잘 수행되지 않습니다. 평판 크기 조정의 밑줄 알고리즘을 이해할 수 있다면 아마도 직접 작성하거나 scikit-learn svm 패밀리에 기여할 수 있습니다. :) predict_proba을 지원하는 위의 네 가지 SVM 변형을 자유롭게 사용하십시오.

+0

는 응답을 @greeness 감사드립니다. 당신이 위에서 말한 모든 것은 완전한 의미를 갖습니다. 나는 그것을 대답으로 받아 들였습니다. 그러나 다른 분류 기준을 사용하지 않는 이유는 속도가 일반적으로 sklearn.svm.LinearSVC보다 훨씬 적기 때문입니다. 나는 더 많은 것을 계속 찾고있을 것이고, 무언가를 찾으면 여기에서 업데이트 할 것이다. – chet

+2

'LinearSVC'를 구현하는 Liblinear에 내장되어 있지 않고 또한'LogisticRegression'이 이미 사용 가능하기 때문에 사용할 수 없다. SVM + 플래트 스케일링은 직선적 인 LR에 비해 몇 가지 이점을 가질 수 있습니다. 'SVC'의 Platt 스케일링은 LibSVM에서 나옵니다. –

+0

@larsmans 주석에 감사드립니다. – greeness

13

속도를 원한다면 sklearn.linear_model.LogisticRegression으로 SVM을 대체하십시오. 이는 LinearSVC과 똑같은 교육 알고리즘을 사용하지만 힌지 손실 대신 로그 손실이 발생합니다.

[1/(1 + exp (-x))]를 사용하면 공식적인 의미 (0과 1 사이의 수)로 확률이 산출되지만 정당한 확률 모델을 따르지는 않습니다.

+0

의미가 있습니다. – chet

+4

명확한 주셔서 감사합니다 이것은 진짜 대답이어야합니다. 나는 sklearn.svm.SVC를 sklearn.linear_model.LogisticRegression으로 대체했으며 유사한 ROC 곡선을 얻었을뿐만 아니라 시간 차이는 내 데이터 집합 (초와 시간)에 너무 커서 시간 가치가 없다. 솔버를 'liblinear'로 지정하면 LinearSVC와 똑같이 만들 수 있습니다. – thefourtheye

+0

방정식 [1/(1 + exp (-x))]에서 x 값은 무엇입니까? – Sakib

39

이 문제를 해결하는 데 사용할 수있는 CalibratedClassifierCV을 제공 scikit 배우기 :

svm = LinearSVC() 
clf = CalibratedClassifierCV(svm) 
clf.fit(X_train, y_train) 
y_proba = clf.predict_proba(X_test) 

사용 설명서가에 좋은 section이있다 : 그것은 LinearSVC 또는 decision_function 방법을 구현하는 다른 분류에 확률 출력을 추가 할 수 있습니다 . 기본적으로 CalibratedClassifierCV + LinearSVC는 Platt scaling을 얻지 만 다른 옵션 (isotonic regression method)을 제공하며 SVM 분류 자에 국한되지 않습니다.

+0

이것은 받아 들여진 대답이어야합니다! – Temak

+0

이것이 그리드 검색에서 어떻게 사용될 수 있는지 알고 싶습니까? 예를 들어 매개 변수를 설정하려고합니다. 'base_estimator__C'하지만'GridSearchCV'는 그것을 삼키지 않습니다. – displayname

+0

'base_estimator__C '가 올바른 것 같습니다. 완전한 예제를 제공하고 새로운 SO 질문을 여는 것이 좋습니다. –

-1

속도와 확률이 모두 필요한 경우 xgboost을 확인하십시오. Xgboost는 사람들이 많은 Kaggle 기계 학습 대회에서 우승하는 것을 도왔습니다. 이 같은 sklearn와 xgboost 사용할 수 있습니다

참고 :

from xgboost.sklearn import XGBClassifier