23

我在本地训练了一个sklearn分类器,我必须创建一个简单的 Web 应用程序来演示它的使用。我完全是 web 应用程序开发的菜鸟,我不想浪费时间使用不支持我正在使用的模块的框架创建 web 应用程序。

  1. 你认为什么是完成这项任务的好方法?
  2. 我应该使用什么 Web 应用程序开发框架(如果有)?
  3. 我是否必须深入研究诸如等之类的东西Herokudjango或者对于简单的科学演示是否有更简单快捷的解决方案?

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

4

6 回答 6

18

如果这只是为了演示,请离线训练您的分类器,腌制模型,然后使用简单的 Python Web 框架(如烧瓶)在服务器启动时取消腌制模型,并在 HTTP 请求处理程序中调用预测函数。

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

heroku 是一项在云中托管您的应用程序的服务。可以在 heroku 上托管烧瓶应用程序,这是一个简单的模板项目 + 说明

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

于 2012-07-22T13:59:46.557 回答
3

虽然这不是分类器,但我已经使用瓶子框架和 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)
于 2014-06-04T15:24:24.533 回答
2

您可以按照以下教程在 Azure ML 中部署 scikit-learn 模型并自动生成 Web 服务:

使用 Python 和 Azure ML 构建和部署预测性 Web 应用程序

或者yHat + Heroku的组合也可以解决问题

于 2015-09-17T05:51:23.280 回答
2

我正在开发一个包装predictpredictproba方法并将它们公开为 Web api 的 Docker 图像: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]
于 2017-07-03T20:49:19.093 回答
2

您可以将 Plotly Dash 用于演示,甚至用于范围有限的应用程序。

https://dash-gallery.plotly.host/Portal/获取一些带有代码源的示例。你有 sklearn 的机器学习示例。

https://dash.plotly.com/deployment用于部署,主要使用 Heroku。

于 2020-08-04T10:24:56.657 回答
2

如果你走烧瓶路线,我强烈建议你在Youtube 上观看 Corey Shafer 系列。这是一个扎实的系列,可以让你快速开始,评论部分还有其他观众提供的许多有用的注释。

此外,由于我假设您将在其他地方构建模型并希望在您的站点上对它们进行评分,因此您可能希望在开发后使用 pickle 来存储模型对象,然后在您的 flask 中使用 pickle 加载模型对象config.py

于 2020-08-08T13:55:57.873 回答