2012-07-22 15 views
14

He entrenado localmente un clasificador sklearn y tengo que crear una aplicación web simple que demuestre su uso. Soy un novato completo en el desarrollo de aplicaciones web y no quiero perder horas en la creación de una aplicación web utilizando un marco que no admite los módulos que estoy usando.Aplicación web que usa scikit-learn

  1. ¿Qué sugieres sería un buen enfoque para esta tarea?
  2. ¿Qué marco de desarrollo de aplicaciones web debo usar (si existe)?
  3. ¿Tengo que bucear en cosas como Heoku, django etc. o hay soluciones más simples y rápidas para una demostración científica simple?

Mi idea era tomar el clasificador entrené, encurtidos y un-salmuera en el servidor, a continuación, ejecutar classify desde el servidor, pero no estoy seguro de por dónde empezar.

Respuesta

8

Si se trata de una demostración, entrena tu clasificador sin conexión, selecciona el modelo y luego utiliza un marco web python simple como flask o bottle para desapilar el modelo en el momento del inicio del servidor y llama a la función de predicción en una solicitud HTTP entrenador de animales.

django es una característica marco completo por lo tanto, es más largo que aprender que frasco o botella, pero tiene una gran documentación y una comunidad más grande.

heroku es un servicio para alojar su aplicación en la nube. Es posible host flask applications on heroku, aquí hay un simple template project + instructions para hacerlo.

Para configuraciones de "producción", le aconsejo que no use salmuera sino que escriba su propia capa de persistencia para el modelo de aprendizaje automático para tener control total sobre los parámetros de su tienda y sea más robusto a las actualizaciones de biblioteca que podrían romperse el desmantelamiento de los viejos modelos.

+0

thx para la respuesta Voy a dar un matraz + heroku un disparo – zenpoy

+0

Después de jugar con el matraz y el heroku tengo un problema al trabajar con sklearn, porque requiere scipy que requiere blas que no tengo ni idea de cómo instálalo en heroku ... ¿algún pensamiento? – zenpoy

+0

De hecho, no pensé en eso. Al parecer, otras personas lograron hacerlo funcionar de esta manera: http://stackoverflow.com/questions/9819968/running-scipy-on-heroku – ogrisel

2

Si bien este no es un clasificador, he implementado un servicio web de aprendizaje de máquina simple utilizando el marco de botella y scikit-learn. Dado un conjunto de datos en formato .csv, devuelve visualizaciones 2D con respecto al análisis de componentes principales y técnicas de análisis discriminante lineal.

más archivos de datos de información y ejemplos se pueden encontrar en: http://mindwriting.org/blog/?p=153

Aquí está la aplicación: Upload.html:

<form 
action="/plot" method="post" 
enctype="multipart/form-data" 
> 
Select a file: <input type="file" name="upload" /> 
<input type="submit" value="PCA & LDA" /> 
</form> 

pca_lda_viz.py (modificar el nombre de host y número de puerto):

import matplotlib 
matplotlib.use('Agg') 

import matplotlib.pyplot as plt 
import numpy as np 
from cStringIO import StringIO 

from bottle import route, run, request, static_file 
import csv 
from matplotlib.font_manager import FontProperties 
import colorsys 

from sklearn import datasets 
from sklearn.decomposition import PCA 
from sklearn.lda import LDA 

html = ''' 
<html> 
    <body> 
     <img src="data:image/png;base64,{}" /> 
    </body> 
</html> 
''' 

@route('/') 
def root(): 
    return static_file('upload.html', root='.') 

@route('/plot', method='POST') 
    def plot(): 

     # Get the data 
     upload = request.files.get('upload') 
     mydata = list(csv.reader(upload.file, delimiter=',')) 

     x = [row[0:-1] for row in mydata[1:len(mydata)]] 

     classes = [row[len(row)-1] for row in mydata[1:len(mydata)]] 
     labels = list(set(classes)) 
     labels.sort() 

     classIndices = np.array([labels.index(myclass) for myclass in classes]) 

     X = np.array(x).astype('float') 
     y = classIndices 
     target_names = labels 

     #Apply dimensionality reduction 
     pca = PCA(n_components=2) 
     X_r = pca.fit(X).transform(X) 

     lda = LDA(n_components=2) 
     X_r2 = lda.fit(X, y).transform(X) 

     #Create 2D visualizations 
     fig = plt.figure() 
     ax=fig.add_subplot(1, 2, 1) 
     bx=fig.add_subplot(1, 2, 2) 

     fontP = FontProperties() 
     fontP.set_size('small') 

     colors = np.random.rand(len(labels),3) 

     for c,i, target_name in zip(colors,range(len(labels)), target_names): 
      ax.scatter(X_r[y == i, 0], X_r[y == i, 1], c=c, 
         label=target_name,cmap=plt.cm.coolwarm) 
      ax.legend(loc='upper center', bbox_to_anchor=(1.05, -0.05), 
        fancybox=True,shadow=True, ncol=len(labels),prop=fontP) 
      ax.set_title('PCA') 
      ax.tick_params(axis='both', which='major', labelsize=6) 

     for c,i, target_name in zip(colors,range(len(labels)), target_names): 
      bx.scatter(X_r2[y == i, 0], X_r2[y == i, 1], c=c, 
         label=target_name,cmap=plt.cm.coolwarm) 
      bx.set_title('LDA'); 
      bx.tick_params(axis='both', which='major', labelsize=6) 

     # Encode image to png in base64 
     io = StringIO() 
     fig.savefig(io, format='png') 
     data = io.getvalue().encode('base64') 

     return html.format(data) 

run(host='mindwriting.org', port=8079, debug=True) 
2

Puede seguir el tutorial de abajo para desplegar su scikit-learn modelo en azul ML y obtener el servicio web generada automáticamente:

Build and Deploy a Predictive Web App Using Python and Azure ML

o la combinación de yHat + Heroku también puede hacer el truco

+1

Tenga en cuenta que [las respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info) no se recomiendan, por lo que las respuestas deberían ser el punto final de una búsqueda de una solución (vs. otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia – kleopatra

1

estoy trabajando una imagen del estibador que envuelve predict y predictproba métodos y e en Xpose como una API Web: https://github.com/hexacta/docker-sklearn-predict-http-api

Es necesario guardar su modelo:

from sklearn.externals import joblib 
joblib.dump(clf, 'iris-svc.pkl') 

crear un Dockerfile:

FROM hexacta/sklearn-predict-http-api:latest 
COPY iris-svc.pkl /usr/src/app/model.pkl 

y ejecutar el contenedor:

$ docker build -t iris-svc . 
$ docker run -d -p 4000:8080 iris-svc 

entonces puede realizar solicitudes:

$ curl -H "Content-Type: application/json" -X POST -d '{"sepal length (cm)":4.4}' http://localhost:4000/predictproba 
    [{"0":0.8284069169,"1":0.1077571623,"2":0.0638359208}] 
$ curl -H "Content-Type: application/json" -X POST -d '[{"sepal length (cm)":4.4}, {"sepal length (cm)":15}]' http://localhost:4000/predict 
    [0, 2] 
Cuestiones relacionadas