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
Es ist so.
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.
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
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))
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')
Geben Sie eine entsprechende Zahl (zwischen 0 und 10) in das Eingabeformular auf dem Bildschirm ein und versuchen Sie es.
Der Name der ermittelten Irisart wird auf dem Bildschirm angezeigt.
Auf Eingabefehler prüfen.
Recommended Posts