2014-06-26 18 views
8

Sto cercando di ottenere un modello vowpal wabbit salvato con hash invertite. Ho un modello valido prodotto con la seguente:L'opzione Vowpal di Wabbit inverted_hash produce output vuoto, ma perché?

vw --oaa 2 -b 24 -d mydata.vw --readable_model mymodel.readable

che produce un file di modello come questo:

Version 7.7.0 
Min label:-1.000000 
Max label:1.000000 
bits:24 
0 pairs: 
0 triples: 
rank:0 
lda:0 
0 ngram: 
0 skip: 
options: --oaa 2 
:0 
66:0.016244 
67:-0.016241 
80:0.026017 
81:-0.026020 
84:0.015005 
85:-0.015007 
104:-0.053924 
105:0.053905 
112:-0.015402 
113:0.015412 
122:-0.025704 
123:0.025704 
... 

(e così via per molte migliaia più caratteristiche). Tuttavia, per essere più utile, ho bisogno di vedere i nomi delle funzionalità. Sembrava una cosa abbastanza ovvia, ma ho fatto

vw --oaa 2 -b 24 -d mydata.vw --invert_hash mymodel.inverted

e ha prodotto un file di modello come questo (senza pesi vengono prodotte):

Version 7.7.0 
Min label:-1.000000 
Max label:1.000000 
bits:24 
0 pairs: 
0 triples: 
rank:0 
lda:0 
0 ngram: 
0 skip: 
options: --oaa 2 
:0 

Ci si sente come se avessi fatto qualcosa, ovviamente, sbagliato, ma penso che sto utilizzando le opzioni nella documented way:

--invert_hash è simile a --readable_model, ma il modello è O scita in un formato leggibile più umano con i nomi delle funzioni seguita da pesi, invece di indici hash e pesi.

Qualcuno vede perché il mio secondo comando non riesce a produrre alcun output?

risposta

9

questo è causato da un bug in VW che è stato fissato di recente (a causa di questo problema), vedi https://github.com/JohnLangford/vowpal_wabbit/issues/337.

Tra l'altro, non ha senso utilizzare --oaa 2. Se si desidera classificazione binaria (regressione logistica aka), utilizzare --loss_function=logistic (e assicurarsi che le etichette sono 1 e -1). OAA senso solo per N> 2 numero di classi (e si raccomanda di usare --loss_function=logistic con --oaa).

Si noti inoltre che l'apprendimento con --invert_hash è molto più lento (e richiede più memoria, ovviamente). Il metodo raccomandato come creare il modello invertito-hash, in particolare con passaggi multipli, è quello di imparare un normale modello binario e quindi convertirlo in hash invertito utilizzando un solo passaggio sui dati di allenamento con -t:

vw -d mytrain.data -c --passes 4 -oaa 3 -f model.binary 
vw -d mytrain.data -t -i model.binary --invert_hash model.humanreadable 
+0

Interessante. Sperimentalmente, trovo risultati che potrebbero essere interpretati in disaccordo con il punto su '--oaa'. Con solo '-b 31', riporta una perdita media di 0,6. Con '-b 31 --loss_function = logistic', riporta una perdita di .48 (e giocherellare con' -l' e '--l1' e' --passes' in realtà non cambia molto). Con '-b 31 --oaa 2 -c -k - passa 3 -l 0.25', vw riporta solo una perdita di .19. Se '--oaa 2' non ha senso, allora perché funziona molto meglio? Non sto cercando di essere sgradevole; Voglio solo capire. –

+0

Non si devono confrontare mele (perdita 0/1) e arance (perdita logistica o quadrata). Per OAA, VW riporta sempre una perdita di 0/1. Senza OAA (o altre riduzioni multiclasse), VW riporta la perdita richiesta (quadrata, logistica, cerniera ...). –

+1

È possibile forzare VW a segnalare una perdita di 0/1 per la classificazione binaria con '--binary'. –