6

Mi piacerebbe ottenere un punteggio di confidenza di ciascuna delle previsioni che effettua, mostrando in che modo il classificatore è sicuro che è corretto.Come ottenere il punteggio di confidenza di un classificatore per una previsione in sklearn?

voglio qualcosa di simile:

Come sicuro è il classificatore sulla sua previsione?

Classe 1: 81% che questo è di classe 1
Classe 2: 10%
Classe 3: 6%
Classe 4: 3%

Campioni del mio codice:

features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(main, target, test_size = 0.4) 

# Determine amount of time to train 
t0 = time() 
model = SVC() 
#model = SVC(kernel='poly') 
#model = GaussianNB() 

model.fit(features_train, labels_train) 

print 'training time: ', round(time()-t0, 3), 's' 

# Determine amount of time to predict 
t1 = time() 
pred = model.predict(features_test) 

print 'predicting time: ', round(time()-t1, 3), 's' 

accuracy = accuracy_score(labels_test, pred) 

print 'Confusion Matrix: ' 
print confusion_matrix(labels_test, pred) 

# Accuracy in the 0.9333, 9.6667, 1.0 range 
print accuracy 



model.predict(sub_main) 

# Determine amount of time to predict 
t1 = time() 
pred = model.predict(sub_main) 

print 'predicting time: ', round(time()-t1, 3), 's' 

print '' 
print 'Prediction: ' 
print pred 

Sospetto che userò la funzione score(), ma mi sembra di continuare a implementarla correttamente. Non so se questa sia la funzione giusta o meno, ma come si otterrebbe la percentuale di confidenza della previsione di un classificatore?

+1

domanda davvero utile. c'è un modo per associare anche i nomi di classe alle probabilità? per esempio se ottengo il seguente elenco di probabilità per un input [0,33 0,25 0,75]. so che verrà scelto il terzo, ma a quale classe fa riferimento il terzo? – AbtPst

+0

le probabilità corrispondono a 'classifier.classes_'. Ma non hanno senso se il set di dati è piccolo :-(. Inoltre, non sono nemmeno garantiti come corrispondenza con 'classifier.predict()': '(. [Collegamento alla pagina dei documenti] (http: // scikit- learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC.predict) – AneesAhmed777

risposta

8

Per il SVC documentation, sembra che è necessario cambiare il modo di costruire l'SVC:

model = SVC(probability=True) 

e quindi utilizzare il metodo predict_proba:

class_probabilities = model.predict_proba(sub_main) 
+0

Ah ok, grazie! E come tradurrebbe class_probabilities in forma percentuale? Ad esempio, ho ottenuto [[1.614297 e-03 3.99785477e-04 5.44054423e-02 9.9254921e-01]] come output, ma non so come interpretare questi valori, per non parlare di convertirli da soli.Che cosa significano esattamente questi valori? – user3377126

+0

Non importa, Grazie! – user3377126

3

Per quegli estimatori attuazione predict_proba() metodo, come Justin Peel ha suggerito, puoi semplicemente usare predict_proba() per produrre probabilità sulla tua previsione.

Per gli stimatori che non implementano il metodo predict_proba(), è possibile costruire autonomamente l'intervallo di confidenza utilizzando il concetto di bootstrap (calcolare ripetutamente le stime dei punti in molti sottocampioni).

Fatemi sapere se avete bisogno di esempi dettagliati per dimostrare uno di questi due casi.

+0

Ah ok, grazie! E come tradurrebbe class_probabilities in forma percentuale? Ad esempio, ho ottenuto [[1.614297e-03 3.99785477e-04 5.44054423e-02 9.9254921e-01]] come output, ma non so come interpretare questi valori, per non parlare di convertirli da solo. Che cosa significano esattamente questi valori? – user3377126

+3

@use r3377126 Sono già in forma percentuale. :) La somma di ogni riga deve essere uguale esattamente a 1. L'ultimo elemento è in realtà 0.992, il che significa che algo prevede che appartiene a questa classe con prob al 99,2%. Nota 'e-03' è solo notazione scientifica. –

+0

Ah, ora vedo, grazie! :) Avrei accettato la tua risposta, ma poiché Justin Peel ha commentato per prima cosa con l'esempio che ha funzionato per me, ho deciso di darglielo, mi dispiace ma grazie per il consiglio! – user3377126