2012-07-22 26 views
14

我在本地培训了一个sklearn分类器,我必须创建一个简单的Web应用程序来演示它的用法。我是一个完全的网络应用程序开发noob,我不想浪费几个小时创建一个web应用程序使用不支持我使用的模块的框架。使用scikit-learn的Web应用程序

  1. 对于这项任务你会有什么建议?
  2. 我应该使用什么web应用程序开发框架(如果有的话)?
  3. 我是否需要深入探究诸如Heoku,django等等,或者是否有更简单快捷的解决方案来进行简单的科学演示?

我的想法是把我训练的分类,腌制,并取消其泡菜在服务器上,然后运行从服务器classify,但我不知道从哪里开始。

回答

8

如果这仅用于演示,请脱机训练分类器,然后使用简单的python web框架(如flaskbottle)在服务器启动时取消模型并在HTTP请求中调用预测函数处理程序。

django是一个功能完整的框架,因此比烧瓶或瓶子学习的时间更长,但它有一个很好的文档和一个更大的社区。

heroku是一项在云中托管您的应用程序的服务。这是可能的host flask applications on heroku,这里是一个simple template project + instructions这样做。

对于“生产”设置,我建议您不要使用pickle,而是为机器学习模型编写自己的持久层,以便完全控制您的存储参数,并对可能会中断的库升级更健壮取消旧模式。

+0

thx为答案我会给烧瓶+ heroku一枪 – zenpoy 2012-07-22 17:58:51

+0

在摆弄烧瓶和heroku后,我有一个问题与sklearn工作,因为它需要scipy哪些要求者blas我没有线索如何在heroku上安装它...任何想法? – zenpoy 2012-07-23 22:04:15

+0

的确我没有想到这一点。显然其他人设法使它以这种方式工作:http://stackoverflow.com/questions/9819968/running-scipy-on-heroku – ogrisel 2012-07-24 08:58:10

2

虽然这不是一个分类器,但我使用瓶框架和scikit-learn实现了一个简单的机器学习Web服务。给定.csv格式的数据集,它会返回关于主成分分析和线性判别分析技术的2D可视化。

的更多信息和示例数据文件,可以发现:http://mindwriting.org/blog/?p=153

这里是实现: 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(修改主机名和端口号):

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

您可以按照下面的教程部署scikit学习在Azure的ML模型,并得到自动生成的Web服务:

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

yHat + Heroku组合也可以做的伎俩

+1

请注意,[只有链接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓励,所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考 – kleopatra 2015-09-17 06:06:59

1

我的工作,它包装predictpredictproba方法和电子码头工人形象xpose他们作为Web API:https://github.com/hexacta/docker-sklearn-predict-http-api

您需要保存你的模型:

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

创建Dockerfile:

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

并运行容器:

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

然后你可以提出要求:

$ 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]