Веб-приложение, использующее scikit-learn

Я локально обучил классификатор sklearn, и мне нужно создать простое веб-приложение, демонстрирующее его использование. Я полный noob в разработке веб-приложений, и я не хочу тратить часы на создание веб-приложения, используя фреймворк, который не поддерживает модули, которые я использую.

  • Что вы предлагаете, было бы хорошим подходом для этой задачи?
  • Какую структуру разработки веб-приложений следует использовать (если есть)?
  • Нужно ли мне погружаться в такие вещи, как Heoku, django и т.д., или есть более простые и быстрые решения для простой научной демонстрации?

Моя мысль заключалась в том, чтобы взять классификатор, который я обучил, рассолить его и распутать его на сервере, а затем запустить classify с сервера, но я не уверен, с чего начать.

Ответы

Ответ 1

Если это только для демонстрации, подготовьте свой классификатор в автономном режиме, выберите модель, а затем используйте простую веб-инфраструктуру python, такую ​​как flask или bottle, чтобы разблокировать модель во время запуска сервера и вызвать функцию прогнозирования в обработчике запросов HTTP.

django - это полный набор функций, поэтому его нужно изучать больше, чем колба или бутылка, но у него отличная документация и более широкое сообщество.

heroku - это сервис для размещения вашего приложения в облаке. Это возможно для приложений флагов хоста на геройку, вот простой шаблон + проект для этого.

Для "производственных" установок я бы посоветовал вам не использовать рассол, а написать свой собственный уровень персистентности для модели машинного обучения, чтобы иметь полный контроль над параметрами вашего магазина и быть более устойчивым к обновлениям библиотек, которые могут нарушить рассыпание старых моделей.

Ответ 2

Пока это не классификатор, я реализовал простой веб-сервис для машинного обучения, используя рамки для бутылок и scikit-learn. Учитывая набор данных в формате .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)

Ответ 3

Вы можете следовать приведенному ниже руководству, чтобы развернуть свою модель scikit-learn в Azure ML и автоматически создать веб-службу:

Создание и развертывание интеллектуального веб-приложения с использованием Python и Azure ML

или комбинация yHat + Heroku может также сделать трюк

Ответ 4

Я работаю над изображением Docker, которое обертывает методы predict и predictproba и выставляет их как веб-api: https://github.com/hexacta/docker-sklearn-predict-http-api

Вам нужно сохранить свою модель:

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

создать файл Docker:

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]