2015-06-06 12 views
6

esiste un modo semplice per convalidare in modo incrociato un classificatore e calcolare la precisione e richiamare immediatamente? Attualmente a utilizzare la funzionePrecisione incrociata, richiamo e f1 insieme a sklearn

cross_validation.cross_val_score(classifier, designMatrix, classes, cv=5, scoring="precision") 

tuttavia determina un'unica metrica, quindi devo chiamarla 2 volte per calcolare precisione e richiamo. Con un modello ML di grandi dimensioni, il calcolo richiede inutilmente 2 volte di più. Esiste un'opzione integrata migliore o devo implementare la convalida incrociata per conto mio? Grazie.

+0

Questo è anche discusso su [github] (https://github.com/scikit-learn/scikit-learn/issues/1837). Apparentemente c'è un [unione] (https://github.com/scikit-learn/scikit-learn/pull/7388) in arrivo focalizzato su questo problema. – Nash

risposta

1

non sono sicuro dello stato attuale delle cose (questa caratteristica è stato discusso), ma si può sempre farla franca con la seguente - terribile - incidere

from sklearn.metrics import recall_score, precision_score 
from sklearn.metrics.scorer import make_scorer 
recall_accumulator = [] 
def score_func(y_true, y_pred, **kwargs): 
    recall_accumulator.append(recall_score(y_true, y_pred, **kwargs)) 
    return precision_score(y_true, y_pred, **kwargs) 
scorer = make_scorer(score_func) 

Quindi utilizzare scoring=scorer nella vostra convalida incrociata. Dovresti trovare i valori di richiamo nell'array recall_accumulator. Attenzione però, questo array è globale, quindi assicurati di non scrivere su di esso in un modo in cui non puoi interpretare i risultati.

1

risposta di Eickenberg funziona quando l'argomento n_job di cross_val_score() è impostato su 1. Per supportare il calcolo parallelo (n_jobs> 1), uno deve usare un elenco condiviso invece di un elenco globale. Questo può essere fatto con l'aiuto di Manager classe da modulo multiprocessing.

from sklearn.metrics import precision_recall_fscore_support 
from sklearn.metrics.scorer import make_scorer 
from multiprocessing import Manager 

recall_accumulator = Manager().list() 
def score_func(y_true, y_pred, **kwargs): 
    recall_accumulator.append(precision_recall_fscore_support(y_true, y_pred)) 
    return 0 
scorer = make_scorer(score_func) 

Poi il risultato di ciascuna piega verrà memorizzato nella recall_accumulator.

Problemi correlati