2014-10-21 10 views
15

Uso SVM lineare da scikit learn (LinearSVC) per problemi di classificazione binaria. Comprendo che LinearSVC può darmi le etichette previste e i punteggi decisionali, ma ho voluto delle stime di probabilità (fiducia nell'etichetta). Voglio continuare ad usare LinearSVC a causa della velocità (rispetto a sklearn.svm.SVC con kernel lineare) È ragionevole usare una funzione logistica per convertire i punteggi decisionali in probabilità?Conversione della funzione decisionale di LinearSVC in probabilità (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) 

voglio verificare se ha senso per ottenere stime di probabilità semplicemente come [1/(1 + exp (-x))] dove x è il punteggio decisione.

In alternativa, ci sono altre opzioni su classificatori che posso usare per farlo in modo efficiente?

Grazie.

risposta

5

Ho dato un'occhiata all'apis in sklearn.svm. * Famiglia. Tutti i modelli al di sotto, ad esempio,

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

hanno un comune interface che fornisce un

probability: boolean, optional (default=False) 

parametro al mo del. Se questo parametro è impostato su True, libsvm formerà un modello di trasformazione di probabilità in cima alle uscite SVM in base all'idea di Platt Scaling. La forma di trasformazione è simile a una funzione logistica, come hai sottolineato, tuttavia due costanti specifiche A e B vengono apprese in una fase di post-elaborazione. Vedi anche questo post stackoverflow per maggiori dettagli.

enter image description here

Io in realtà non so perché questa post-elaborazione non è disponibile per LinearSVC. Altrimenti, chiamereste semplicemente predict_proba(X) per ottenere la stima di probabilità.

Ovviamente, se si applica solo una trasformazione logistica ingenua, non funzionerà altrettanto bene come un approccio calibrato come Platt Scaling. Se riesci a capire l'algoritmo di sottolineatura del ridimensionamento del platt, probabilmente puoi scrivere il tuo o contribuire alla famiglia di svm di scikit-learn. :) Sentitevi liberi di usare le quattro varianti SVM sopra che supportano predict_proba.

+0

Grazie @greeness per la risposta. Tutto ciò che hai detto sopra ha perfettamente senso e l'ho accettato come risposta. Tuttavia la ragione per cui non sto usando nessun altro classificatore è perché la loro velocità è solitamente molto inferiore a quella di sklearn.svm.LinearSVC. Continuerò a cercare ancora un po 'e aggiornerò qui se trovo qualcosa .. – chet

+2

Non è disponibile perché non è incorporato in Liblinear, che implementa 'LinearSVC', e anche perché' LogisticRegression' è già disponibile (anche se lineare Il ridimensionamento SVM + Platt potrebbe avere alcuni vantaggi rispetto a LR puro, non l'ho mai provato). Il ridimensionamento di Platt in "SVC" deriva da LibSVM. –

+0

Grazie per i commenti @larsmans. – greeness

13

Se si desidera velocità, solo sostituire SVM con sklearn.linear_model.LogisticRegression. Questo utilizza esattamente lo stesso algoritmo di allenamento di LinearSVC, ma con perdita di log invece di perdita di cerniera.

L'utilizzo di [1/(1 + exp (-x))] genererà probabilità, in senso formale (numeri compresi tra zero e uno), ma non aderiranno a nessun modello di probabilità giustificabile.

+0

Questo ha senso. Grazie per aver chiarito – chet

+4

Questa dovrebbe essere la vera risposta. Ho sostituito il mio sklearn.svm.SVC con sklearn.linear_model.LogisticRegression e non solo ho ottenuto curve ROC simili, ma la differenza di tempo è così grande per il mio set di dati (secondi contro ore) che non vale nemmeno la pena. Vale anche la pena notare che è possibile specificare che il proprio risolutore sia "liblinear", il che lo renderebbe esattamente lo stesso di LinearSVC. – thefourtheye

+0

quale sarebbe il valore x nell'equazione [1/(1 + exp (-x))]? – Sakib

39

scikit-learn fornisce CalibratedClassifierCV che può essere utilizzato per risolvere questo problema: permette di aggiungere uscita probabilità di LinearSVC o qualsiasi altro classificatore che implementa il metodo decision_function:

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

Manuale d'uso ha una bella section su quel . Per impostazione predefinita, CalibratedClassifierCV + LinearSVC ti offre il ridimensionamento di Platt, ma fornisce anche altre opzioni (metodo di regressione isotonica) e non è limitato ai classificatori SVM.

+0

Questa dovrebbe essere una risposta accettata! – Temak

+0

Qualche idea su come questo può essere usato nella ricerca della griglia? Cercando di impostare i parametri, ad es. 'base_estimator__C' ma' GridSearchCV' non lo ingoia. – displayname

+0

'base_estimator__C' sembra corretto. Suggerisco di fornire un esempio completo e di aprire una nuova domanda SO. –

-1

Se hai bisogno di velocità e probabilità, controlla xgboost. Xgboost ha aiutato le persone a vincere molte competizioni di apprendimento automatico Kaggle.

noti che è possibile utilizzare xgboost con sklearn, come ad esempio:

from xgboost.sklearn import XGBClassifier 
Problemi correlati