我已经在本地训练了一个sklearn分类器,我必须创建一个简单的web应用程序来演示它的使用。我是一个完全不懂网络应用程序开发的人,我不想浪费时间使用不支持我正在使用的模块的框架来创建网络应用程序。
- 你认为什么是完成这项任务的好方法
- 我应该使用什么web应用程序开发框架(如果有的话)
- 我是否必须深入研究
Heroku
、django
等问题,或者对于一个简单的科学演示,是否有更简单、更快的解决方案
我的想法是采用我训练的分类器,在服务器上对其进行pickle和unpickle,然后从服务器上运行classify
,但我不确定从哪里开始。
如果这只是一个演示,请离线训练分类器,对模型进行pickle,然后在服务器启动时使用一个简单的python web框架(如flask或bottle)来取消pickle模型,并在HTTP请求处理程序中调用predict函数。
django是一个功能完整的框架,因此学习时间比烧瓶或瓶子长,但它有一个很棒的文档和一个更大的社区。
heroku是一种在云中托管应用程序的服务。可以在heroku上托管烧瓶应用程序,这里有一个简单的模板项目+说明
对于"生产"设置,我建议您不要使用pickle,而是为机器学习模型编写自己的持久层,以便完全控制存储的参数,并对库升级更加稳健,这可能会打破旧模型的剥离。
虽然这不是一个分类器,但我已经使用bottle框架和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_la_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)
您可以按照下面的教程在Azure ML中部署您的scikit学习模型,并自动生成web服务:
使用Python和Azure ML 构建和部署预测性Web应用程序
或者yHat+Heroku的组合也可以实现
我正在开发一个Docker映像,该映像封装predict
和predictproba
方法,并将它们公开为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]
您可以将Plotly Dash用于演示,甚至用于范围有限的应用程序。
https://dash-gallery.plotly.host/Portal/对于一些带有代码源的示例。您有sklearn的机器学习示例。
https://dash.plotly.com/deployment用于部署,主要使用Heroku。
如果你选择烧瓶路线,我强烈建议你在Youtube上观看科里·谢弗系列。这是一个坚实的系列,会让你很快开始,评论区还有很多其他观众的有用笔记。
此外,由于我认为您将在其他地方构建模型,并希望在您的网站上对其进行评分,因此您可能希望在开发后使用pickle来存储模型对象,然后在您的烧瓶config.py
中使用pickler加载模型对象。