2014-11-03 15 views
6

Sto provando a valutare un modello in base alle sue prestazioni su scommesse sportive storiche.La funzione di punteggio personalizzato di Scikit-learn richiede valori dal set di dati diverso da X e y

Ho un set di dati che è costituita dalle seguenti colonne:

feature1 | ... | featureX | oddsPlayerA | oddsPlayerB | winner 

Il modello sarà facendo una regressione in cui l'uscita è la probabilità che Playera vince la partita

È la mia comprensione che ho può usare una funzione di punteggio personalizzata per restituire i "soldi" che il modello avrebbe fatto se scommettesse ogni volta che una condizione è vera e usa quel valore per misurare l'idoneità del modello. Una condizione simile:

if prediction_player_A_win_odds < oddsPlayerA 
    money += bet_playerA(oddsPlayerA, winner) 
if inverse_odd(prediction_player_A_win_odds) < oddsPlayerB 
    money += bet_playerB(oddsPlayerB, winner) 

Nella funzione di punteggio personalizzato ho bisogno di ricevere i soliti argomenti come "ground_truth, previsioni" (dove ground_truth è il vincitore [] e le previsioni è prediction_player_A_win_odds []) ma anche i campi "oddsPlayerA" e "oddsPlayerB" dal dataset (ed ecco il problema!).

Se la funzione di calcolo del punteggio personalizzato è stata richiamata con i dati nello stesso ordine del set di dati originale, sarebbe banale recuperare questi dati aggiuntivi necessari dal set di dati. Ma in realtà quando si utilizzano metodi di convalida incrociati, i dati ottenuti vengono tutti mescolati (se confrontati all'originale).

Ho provato l'approccio più ovvio che doveva passare la variabile y con [oddsA, oddsB, winner] (dimensioni [n, 3]) ma lo scikit non lo permetteva.

Così, come posso ottenere i dati dal set di dati nella funzione di punteggio personalizzato che non è né X né y ma è ancora "legati insieme" nello stesso ordine?

+0

Come stai facendo la convalida incrociata? Scikit fornisce [vari iteratori] (http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-iterators) che restituiscono indici nel set di dati originale che è possibile utilizzare per dividere i set treno/test. Se hai indici, puoi usarli per estrarre i dati allineati di cui hai bisogno. – BrenBarn

+0

Per quanto ne so solo con cross_validation.cross_val_score è possibile passare una funzione di calcolo del punteggio personalizzata. Quindi lo stavo usando. Posso cercare un metodo di convalida incrociata che restituisca indici, ma come faccio a utilizzare una funzione di punteggio personalizzata senza utilizzare cross_val_score? – joaoroque

+1

Dopo aver riflettuto un po ', immagino di poterlo fare manualmente con il punteggio predetto e la convalida incrociata con gli indici (oppure no? Come mi preparerei?). Ma preferirei poter utilizzare strumenti come grid_search.GridSearchCV (che consente anche una funzione di punteggio personalizzata). Se potessi evitare l'approccio "manuale" lo apprezzerei. – joaoroque

risposta

3

Al momento non c'è modo di farlo, mi dispiace. Puoi scrivere il tuo loop sulle pieghe incrociate, che non dovrebbero essere troppo difficili. Non si può fare questo usando GridSearchCV o cross_val_score

+0

Ci sono piani per farlo? Sembra una funzionalità legittima e utile. Tutto quello che dovresti fare è fare in modo che GridSearchCV passi anche gli indici al segnapunti, giusto? – BrenBarn

+1

Sì. L'interfaccia degli scorers è piuttosto nuova e ci sono ancora alcune cose che non abbiamo davvero elaborato. Hai ragione, questa sarebbe una caratteristica utile. –