2015-10-13 44 views
11

Sto cercando di passare i parametri del modello come un dettato a uno stimatore di Scikit-learn e sto avendo fortuna. Sembra solo annidare il mio dict in uno dei parametri. Per esempio:Passa un dict a scikit learn stimator

params = { 
'copy_X': True, 
'fit_intercept': False, 
'normalize': True 
} 

lr = LinearRegression(params) 

Mi dà:

LinearRegression(copy_X=True, 
     fit_intercept={'copy_X': True, 'fit_intercept': False,'normalize': True}, 
    normalize=False) 

Inoltre, ho creato una funzione per iterare il dict e può creare una stringa del tipo:

'copy_X=True, fit_intercept=True, normalize=False' 

Questo è stato altrettanto infruttuoso . Qualcuno ha qualche consiglio qui? L'unica restrizione che ho è che i dati verranno da me come dict (beh, in realtà un oggetto json viene caricato con json.uploads).

Grazie.

risposta

16

La migliore soluzione completa per inizializzare lo stimatore con i giusti parametri sarebbe quello di scompattare il dizionario:

lr = LinearRegression(**params) 

Se per qualche motivo è necessario impostare alcuni parametri in seguito, è possibile utilizzare:

lr.set_params(params) 

Questo ha un vantaggio rispetto all'utilizzo di setattr in quanto consente a Scikit di imparare a eseguire alcuni controlli di convalida sui parametri.

+0

questa dovrebbe essere la risposta accettata - è il modo standard per passare una serie di kwarg a una funzione. – eqzx

2

Ho capito. Usato set come questo.

for k,v in params.items(): 
    setattr(lr,k,v) 
0

fit_intercept è il primo argomento del LinearRegression oggetto

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

Così che spiega il motivo per cui il dizionario viene passato a questo argomento, gli altri args (anche opzionale) copy_X e normalize stanno ricevendo nessun parametro, quindi stanno usando i valori predefiniti.

Si potrebbe anche fare:

params = { 
'copy_X': True, 
'fit_intercept': False, 
'normalize': True 
} 

lr = LinearRegression(copy_X = params['copy_X'], \ 
         fit_intercept = params['fit_intercept'], \ 
         normalize = params['normalize']) 
Problemi correlati