2016-04-30 11 views
17

Sto lavorando a un'applicazione che è un "predittiva-model-as-a-service", strutturato come segue:Come si può persistere con Patsy DesignInfo?

  • treno un modello in linea
  • caricare periodicamente i parametri del modello ad un "server previsione "
  • server previsione prende in input una singola osservazione, ed emette una previsione

sto cercando di usare Patsy, ma in esecuzione nel seguente problema: quando un solo pronostico entra, come faccio a convertire alla forma giusta tale che esso sembra una fila di dati di allenamento?

La documentazione patsy fornisce un esempio quando la DesignInfo da dati di addestramento è disponibile in memoria: http://patsy.readthedocs.io/en/latest/library-developers.html#predictions

# offline model training 
import patsy 

data = {'animal': ['cat','cat','dog','raccoon'],'cuteness': [3,6,10,4]} 
eq_string = "cuteness ~ animal" 


dmats = patsy.dmatrices(eq_string,data) 
design_info = dmats[1].design_info 
train_model(dmats) 


# online predictions 
input_data = {'animal': ['raccoon']} 

# if the DesignInfo were available, I could do this: 
new_dmat = build_design_matrices([design_info], 
             input_data) 
make_prediction(new_dmat, trained_model) 

E allora l'uscita:

[DesignMatrix with shape (1, 3) 
    Intercept animal[T.dog] animal[T.raccoon] 
      1    0     1 
    Terms: 
    'Intercept' (column 0) 
    'animal' (columns 1:3)] 

noti che questa riga è la stessa forma come i dati di allenamento; ha una colonna per animal[T.dog]. Nella mia applicazione, non ho un modo per accedere a DesignInfo per costruire DesignMatrix per i nuovi dati. Concretamente, in che modo il server di previsione saprà quante altre categorie di animali sono presenti nei dati di addestramento e in quale ordine?

ho pensato che avrei potuto solo salamoia, ma si scopre che non è ancora supportato: https://github.com/pydata/patsy/issues/26

potrei anche semplicemente persistere delle colonne della matrice come una stringa e ricostruire la matrice da quella on-line, ma questo sembra un un po 'fragile

C'è un buon modo per farlo?

+0

È possibile conservare 'design_info' nel server? (Sembra che ciò accada automaticamente.) Quindi il client invierà semplicemente al server il nuovo 'input_data', e il server eseguirà le righe' new_dmat' e 'make_prediction'. O hai bisogno di essere in grado di spegnere e riavviare il server senza riqualificarlo? In questo caso, sembra che avresti bisogno di salvare sia il 'dmats' originale che i parametri trovati da' train_model() '. E 'quello che stai cercando? –

risposta

-1

Assumendo il vostro obiettivo è quello di essere in grado di riavviare il server senza riqualificazione, sembra che la scelta migliore (fino a Patsy implementa decapaggio) sarebbe quello di salamoia data, eq_string e tutto ciò che i parametri che sono calcolati train_model. Quindi, al riavvio del server, è possibile annullare il numero data e eq_string e chiamare di nuovo dmats = patsy.dmatrices(eq_string,data). Questo dovrebbe funzionare abbastanza velocemente, dal momento che non sta veramente allenando un modello, ma solo preelaborando i dati. Quindi deselezionerai anche i parametri calcolati da train_model (non mostrato nella domanda), e il server dovrebbe essere pronto a fare previsioni per nuovi input.

Si noti che se si divide questo in componenti client e server, il server deve fare tutto quanto discusso in precedenza e il client deve semplicemente inviarlo il input_data definito nella domanda. (Il client non ha mai bisogno di vedere dmats o design_info.)

Problemi correlati