2015-06-03 19 views
7

Sto utilizzando la funzione roc_auc_score di scikit-learn per valutare le prestazioni del mio modello. Ad ogni modo, ottengo differenti valori se io uso prevedo() o predict_proba()Scikit-learn: roc_auc_score

p_pred = forest.predict_proba(x_test) 
y_test_predicted= forest.predict(x_test) 
fpr, tpr, _ = roc_curve(y_test, p_pred[:, 1]) 
roc_auc = auc(fpr, tpr) 

roc_auc_score(y_test,y_test_predicted) # = 0.68 
roc_auc_score(y_test, p_pred[:, 1]) # = 0.93 

potrebbero consigliare su questo per favore?

Grazie in anticipo

risposta

6

primo sguardo alla differenza tra prevedere e predict_proba. Il primo prevede la classe per il set di funzionalità in cui quest'ultimo predice le probabilità di varie classi.

Si sta vedendo l'effetto dell'arrotondamento implicito nel formato binario di y_test_predicted. y_test_predicted è composto da 1 e 0 dove p_pred è composto da valori in virgola mobile compresi tra 0 e 1. La routine roc_auc_score varia il valore di soglia e genera il tasso positivo reale e il tasso di falsi positivi, quindi il punteggio sembra molto diverso.

Consideriamo il caso in cui:

y_test   = [ 1, 0, 0, 1, 0, 1, 1] 
p_pred   = [.6,.4,.6,.9,.2,.7,.4] 
y_test_predicted = [ 1, 0, 1, 1, 0, 1, 0] 

noti che la curva ROC è generata considerando tutte le soglie di taglio. Consideriamo ora una soglia di 0,65 ...

Il caso p_pred dà:

TPR=0.5, FPR=0, 

e il caso y_test_predicted dà:

TPR=.75 FPR=.25. 

Probabilmente si può vedere che se questi due punti sono diversi, allora anche l'area sotto le due curve sarà molto diversa.

Ma per capirlo davvero, suggerisco di guardare le curve ROC per aiutare a capire questa differenza.

Spero che questo aiuti!

+0

e il caso dovrebbe y_test_predicted: 'TPR = .75 FPR = .33.' – yonglin

+0

Il dividendo dovrebbe includere i PQ, non solo il TNS: FPR = FP/(FP + TN). – AN6U5

+0

Scusa forse ti ho appena frainteso. Se si intende che confrontiamo y_test e y_test_predicted, quindi TN = 2 e FP = 1. – yonglin