[PYTHON] Einfaches maschinelles Lernen mit Scikit-Learn und Flask ✕ Web App

Einfaches maschinelles Lernen und Web-Apps

Ich habe eine einfache Demo-App erstellt, die das Ergebnis auf dem Bildschirm mit dem durch maschinelles Lernen erstellten Beurteilungsmodell für die Eingabe von der Website anzeigt. Wenn Sie die Größe (vertikal, horizontal) des Iris-Splitters und der Blütenblätter eingeben, wird die Sorte beurteilt und angezeigt.

Der Code ist hier. https://github.com/shibuiwilliam/mlweb

Gesamtbild

Es ist so.

5.JPG

Es ist als Front-End konfiguriert, das Schmutz und Blütenblätter eingibt, und als Back-End, das das Ergebnis zurückgibt. Es ist super einfach. Die Sprache ist Python 3.6, wobei flask und wtform für das Web und scicit-learn für maschinelles Lernen verwendet werden.

Wie benutzt man

Die Entwicklungsumgebung ist CentOS 7.3 und Python 3.6. Die Bibliothek enthält flask, wtform, scicit-learn und Jupyter Notebook. Dieser Bereich wird hauptsächlich in Anaconda3 eingeführt, aber Kolben und wtform sind pip installiert. Bitte klonen Sie den Code.


git clone https://github.com/shibuiwilliam/mlweb.git

Die Website wird auf Port 5000 veröffentlicht. Es muss festgelegt werden, dass das Betriebssystem und das Netzwerk auf 5000 zugreifen können. (Betriebssystem ist Selinux und Firewalld)

Hier erfahren Sie, wie Sie die Website ausführen.


nohup python web.py &

Das Ausführungsprotokoll wird an nohup.out ausgespuckt. Wenn Sie das Protokoll nacheinander anzeigen möchten, gehen Sie wie folgt vor:


tail -f nohup.out

Maschinelles Lernen

Das Iris-Beurteilungsmodell verwendet die zufällige Gesamtstruktur von scicit-learn und GridSearchCV.

Holen Sie sich den von scikit-learn bereitgestellten Iris-Datensatz und erstellen Sie mit GridSearchCV Modellparameter zusammen mit zufälligen Wald-Hyperparametern.


# iris_train.ipynb


from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.externals import joblib
import numpy as np

# use Iris dataset
data = load_iris()
x = data.data
y = data.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=54321)

# run gridsearchcv on random forest classifier
forest = RandomForestClassifier()
param_grid = {
    'n_estimators'      : [5, 10, 20, 30, 50, 100, 300],
    'random_state'      : [0],
    'n_jobs'            : [1],
    'min_samples_split' : [3, 5, 10, 15, 20, 25, 30, 40, 50, 100],
    'max_depth'         : [3, 5, 10, 15, 20, 25, 30, 40, 50, 100]
}
forestGrid = GridSearchCV(forest, param_grid)
fgFit = forestGrid.fit(x_train, y_train)

Ein Modell wird erstellt, indem die erstellten Modellparameter in einer zufälligen Gesamtstruktur angepasst werden. Speichern Sie das Modell als Gurke. Rufen Sie bei Verwendung auf einer Website das gespeicherte Modell auf.


# set the best params to fit random forest classifier
forest.set_params(**fgFit.best_params_)
forest.fit(x, y)

# save the model as pickle
joblib.dump(forest, './rfcParam.pkl', compress=True)

# load the model
forest = joblib.load('./rfcParam.pkl')

# predict
t = np.array([5.1,  3.5,  1.4,  0.2])
t = t.reshape(1,-1)
print(forest.predict(t))

Webseite

Die Bahn besteht aus Kolben und wtform. Definieren Sie zunächst die im Web verwendeten Funktionen (web.py).


# web.py

import numpy as np

#Speichern Sie die Eingabe als Log in csv.
def insert_csv(data):
    import csv
    import uuid
    tuid = str(uuid.uuid1())
    with open("./logs/"+tuid+".csv", "a") as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerow(["sepalLength","sepalWidth","petalLength","petalWidth"])
        writer.writerow(data)
    return tuid

# scikit-Die Beurteilung erfolgt anhand des von learn erstellten Modells.
def predictIris(params):
    from sklearn.externals import joblib
    # load the model
    forest = joblib.load('./rfcParam.pkl')
    # predict
    params = params.reshape(1,-1)
    pred = forest.predict(params)
    return pred

#Das Urteil ist 0,1,Da es in 2 ausgegeben wird, wird es in den Iris-Sortennamen konvertiert.
def getIrisName(irisId):
    if irisId == 0: return "Iris Setosa"
    elif irisId == 1: return "Iris Versicolour"
    elif irisId == 2: return "Iris Virginica"
    else: return "Error"

Unten finden Sie den Python-Code mit Web-HTML und flask.

Das erste ist das Eingabeformular (templates / irisPred.html).


<!doctype html>
<html>
   <body>

      <h2 style = "text-align: center;">Enter Iris Params</h2>

      {% for message in form.SepalLength.errors %}
         <div>{{ message }}</div>
      {% endfor %}

      {% for message in form.SepalWidth.errors %}
         <div>{{ message }}</div>
      {% endfor %}

      {% for message in form.PetalLength.errors %}
         <div>{{ message }}</div>
      {% endfor %}

      {% for message in form.PetalWidth.errors %}
         <div>{{ message }}</div>
      {% endfor %}

      <form action = "" method = post>
         <fieldset>
            <legend>Enter parameters here.</legend>

            <div style = font-size:20px; font-weight:bold; margin-left:150px;>
               {{ form.SepalLength.label }}<br>
               {{ form.SepalLength }}
               <br>
               {{ form.SepalWidth.label }}<br>
               {{ form.SepalWidth }}
               <br>
               {{ form.PetalLength.label }}<br>
               {{ form.PetalLength }}
               <br>
               {{ form.PetalWidth.label }}<br>
               {{ form.PetalWidth }}
               <br>
               {{ form.submit }}
            </div>

         </fieldset>
      </form>

   </body>
</html>

Dies ist der Bildschirm (templates / success.html), auf dem die Beurteilungsergebnisse angezeigt werden.


<!doctype html>
<title>Hello from Iris</title>
{% if irisName %}
  <h1>It is {{ irisName }}</h1>
{% else %}
  <h1>Hello from Iris</h1>
{% endif %}

Python-Formulardefinition (web.py).


# web.py

from flask import Flask, render_template, request, flash
from wtforms import Form, FloatField, SubmitField, validators, ValidationError

# App config.
DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)
app.config['SECRET_KEY'] = 'fda0e618-685c-11e7-bb40-fa163eb65161'

class IrisForm(Form):
    SepalLength = FloatField("Sepal Length in cm",
                     [validators.InputRequired("all parameters are required!"),
                     validators.NumberRange(min=0, max=10)])
    SepalWidth = FloatField("Sepal Width in cm",
                     [validators.InputRequired("all parameters are required!"),
                     validators.NumberRange(min=0, max=10)])
    PetalLength = FloatField("Petal Length in cm",
                     [validators.InputRequired("all parameters are required!"),
                     validators.NumberRange(min=0, max=10)])
    PetalWidth = FloatField("Petal Width in cm",
                     [validators.InputRequired("all parameters are required!"),
                     validators.NumberRange(min=0, max=10)])
    submit = SubmitField("Try")

@app.route('/irisPred', methods = ['GET', 'POST'])
def irisPred():
    form = IrisForm(request.form)
    if request.method == 'POST':
        if form.validate() == False:
            flash("You need all parameters")
            return render_template('irisPred.html', form = form)
        else:            
            SepalLength = float(request.form["SepalLength"])            
            SepalWidth = float(request.form["SepalWidth"])            
            PetalLength = float(request.form["PetalLength"])            
            PetalWidth = float(request.form["PetalWidth"])
            params = np.array([SepalLength, SepalWidth, PetalLength, PetalWidth])
            print(params)
            insert_csv(params)
            pred = predictIris(params)
            irisName = getIrisName(pred)

            return render_template('success.html', irisName=irisName)
    elif request.method == 'GET':
        return render_template('irisPred.html', form = form)

if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0')

Ausführungsbild

Geben Sie eine entsprechende Zahl (zwischen 0 und 10) in das Eingabeformular auf dem Bildschirm ein und versuchen Sie es.

1.JPG

Der Name der ermittelten Irisart wird auf dem Bildschirm angezeigt.

2.JPG

Auf Eingabefehler prüfen.

4.JPG

Recommended Posts

Einfaches maschinelles Lernen mit Scikit-Learn und Flask ✕ Web App
Einfache Web-App mit Python + Flask + Heroku
Praktisches maschinelles Lernen mit Scikit-Learn und TensorFlow-TensorFlow gab auf-
SVM versucht maschinelles Lernen mit Scikit-Learn
Erstellen Sie mit VirtualBox und Ubuntu eine Scikit-Lernumgebung für maschinelles Lernen
Erstellen Sie eine einfache Web-App mit Flasche
[Lesehinweis] Praktisches maschinelles Lernen mit Scikit-Learn, Keras und TensorFlow Kapitel 1
Einfaches Web-Scraping mit Python und Ruby
Maschinelles Lernen x Web App-Diagnose: Erkennen Sie CAPTCHA mit der Cloud Vision-API
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
Gewinnen Sie die Python + Flask-Web-App mit Jenkins
Starten Sie einen Webserver mit Python und Flask
Maschinelles Lernen x Webanwendungsdiagnose: Erkennen von CAPTCHA mit mehrschichtigem Perzeptron (Chainer Edition)
Einfaches maschinelles Lernen mit AutoAI (Teil 4) Jupyter Notebook
Maschinelles Lernen mit Raspberry Pi 4 und Coral USB Accelerator
[Maschinelles Lernen] SVM sowohl aus Scikit-Lernen als auch aus Mathematik verstehen
Analysieren und visualisieren Sie JSON (Webanwendung ⑤ mit Python + Flask)
Maschinelles Lernen mit Pokemon gelernt
Entwicklung von Webanwendungen mit Flask
Maschinelles Lernen mit Python! Vorbereitung
Einfaches Web-Scraping mit Scrapy
Maschinelles Lernen Minesweeper mit PyTorch
Maschinelles Lernen und mathematische Optimierung
Webanwendung mit Python + Flask ② ③
Beginnend mit maschinellem Python-Lernen
Versuchen Sie es mit Kaggle leicht maschinell
Webanwendung mit Python + Flask ④
[Maschinelles Lernen] Starten Sie Spark mit iPython Notebook und probieren Sie MLlib aus
Notizen und Nachschlagewerke beim Erstellen von Webdiensten mit Flask
[Maschinelles Lernen] Entscheidungsbäume aus Scikit-Lernen und Mathematik verstehen
(Fehler) Stellen Sie eine mit Flask mit Heroku erstellte Web-App bereit
Maschinelles Lernen mit Nogisaka 46 und Keyakizaka 46 Teil 1 Einführung
[Maschinelles Lernen] Verständnis der logistischen Regression sowohl durch Scikit-Lernen als auch durch Mathematik
So zeichnen Sie interaktiv eine Pipeline für maschinelles Lernen mit scikit-learn und speichern sie in HTML
Bildsegmentierung mit Scikit-Image und Scikit-Learn
[Maschinelles Lernen] Versuchen Sie, Spark MLlib mit Python auszuführen, und geben Sie Empfehlungen ab
Ich habe maschinelles Lernen mit liblinear versucht
Maschinelles Lernen mit Python (1) Gesamtklassifizierung
Führen Sie die App mit Flask + Heroku aus
Klassifikation und Regression beim maschinellen Lernen
Einfache GUI App mit Tkinter Text
Basisauthentifizierung, Digest-Authentifizierung mit Flask
Organisation von Plattformen für maschinelles Lernen und tiefes Lernen
[Maschinelles Lernen] Verstehen der linearen multiplen Regression sowohl aus Scikit-Lernen als auch aus Mathematik
"Gauß-Prozess und maschinelles Lernen" Gauß-Prozessregression nur mit Python-Numpy implementiert
Quanteninspiriertes maschinelles Lernen mit Tensornetzwerken
Beginnen Sie mit dem maschinellen Lernen mit SageMaker
"Scraping & maschinelles Lernen mit Python" Lernnotiz
Vulkan berechnet mit Python mit VkInline und denkt über maschinelles Lernen auf der GPU und mehr nach
Eine Geschichte über die Automatisierung von Online-Mahjong (Jakutama) mit OpenCV und maschinellem Lernen
[Memo / Erstellen] "Praktisches maschinelles Lernen mit Scikit-Learn & TensorFlow" Englische Übersetzung ins Japanische
Azure-Tabellenspeicher mit PTVS Flask-App
[Maschinelles Lernen] OOB (Out-Of-Bag) und sein Verhältnis
scikit-learn Verwendung der Zusammenfassung (maschinelles Lernen)
Aktienkursprognose mit maschinellem Lernen (Scikit-Learn)
Vorhersage des Strombedarfs durch maschinelles Lernen Teil 2
Stellen Sie die Kolben-App mit mod_wsgi bereit (mithilfe von pipenv).