python python-3.x pickle patsy

python - ¿Cómo persistir patsy designInfo?



python-3.x pickle (1)

Estoy trabajando en una aplicación que es un "modelo predictivo como servicio", estructurada de la siguiente manera:

  • entrenar un modelo fuera de línea
  • cargar periódicamente los parámetros del modelo a un "servidor de predicción"
  • El servidor de predicción toma como entrada una única observación y genera una predicción.

Estoy tratando de usar patsy, pero me encuentro con el siguiente problema: cuando aparece una única predicción, ¿cómo la convierto en la forma correcta para que se vea como una fila de los datos de entrenamiento?

La documentación de patsy proporciona un ejemplo cuando la DesignInfo de los datos de capacitación está disponible en la 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)

Y luego la salida:

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

Tenga en cuenta que esta fila tiene la misma forma que los datos de entrenamiento; Tiene una columna para animal[T.dog] . En mi aplicación, no tengo una manera de acceder a DesignInfo para construir DesignMatrix para los nuevos datos. Concretamente, ¿cómo sabría el servidor de predicción cuántas otras categorías de animales figuran en los datos de entrenamiento y en qué orden?

Pensé que solo podía decapar, pero resulta que esto todavía no está soportado: https://github.com/pydata/patsy/issues/26

También podría simplemente mantener las columnas de la matriz como una cadena y reconstruir la matriz a partir de eso en línea, pero esto parece un poco frágil.

¿Existe una forma correcta de hacer esto?


Suponiendo que su objetivo es poder reiniciar el servidor sin reentrenamiento, parece que su mejor opción (hasta que patsy implements pickling) sería eq_string data , eq_string y los parámetros que calcula train_model . Luego, al reiniciar el servidor, puede descomprimir los data y eq_string y llamar a dmats = patsy.dmatrices(eq_string,data) nuevamente. Esto debería ejecutarse bastante rápido, ya que no es realmente entrenar un modelo, solo preprocesar sus datos. Luego, también desmarcaría los parámetros calculados por train_model (que no se muestra en la pregunta), y el servidor debería estar listo para hacer predicciones para nuevas entradas.

Tenga en cuenta que si está dividiendo esto en componentes de cliente y servidor, el servidor debería hacer todo lo descrito anteriormente, y el cliente solo debería enviarle los input_data definidos en su pregunta. (El cliente no necesita ver dmats o design_info ).