目录
摘要
线性回归
线性回归理论推导
FLASK特性
项目结构
代码依赖库
GUI界面实现代码
序列化/反序列化
GUI显示界面运行
总结
摘要
本此演示了一种非常简单的方法来部署机器学习模型。利用线性回归使用前两个月的利率和销售额来预测第三个月的销售值。大家在进行算法研究与实现之后,可以此方法来将自己研究的模型赋予应用实现,以便他人更方便的了解你的研究性工作。
线性回归
线性回归模型的目标是找到一个或多个特征(独立变量)与连续目标变量(独立变量)之间的关系。当只有一个特征时,称为单变量线性回归;如果有多个特征,则称为多重线性回归。
线性回归理论推导
线性回归模型可用以下方程式表示:
- Y是预测值
- θ ₀是偏置项。
- θ ₁,...,θ ₙ是模型参数
- X ₁,X ₂,...,X ₙ是特征值。
FLASK特性
易于使用。
内置开发服务器和调试器。
支持集成的单元测试。
RESTful请求分派。
项目结构
该项目包括四个部分:
- model.py —包含用于机器学习模型的代码,该代码可根据前两个月的销售额预测第三个月的销售额。
- app.py-包含Flask API,它们通过GUI或API调用接收销售明细,并根据我们的模型计算预测值并返回。
- request.py-这使用请求模块来调用app.py中定义的API,并显示返回的值。
- HTML / CSS-HTML / CSS —包含HTML模板和CSS样式,允许用户输入销售明细并显示第三个月的预计销售量。
代码依赖库
- scikit-learn
- pandas
- numpy
- flask
GUI界面实现代码
系统界面HTML代码:
用户需要填写三个字段:利率、第一个月的销售额和第二个月的销售额。并点击预测,实现对第三个月的预测。
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Deployment Tutorial 1</title>
<link href='https://fonts.googleapis.com/css?family=Pacifico' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Arimo' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Hind:300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body style="background: #000;">
<div class="login">
<h1>预测销售</h1>
<!-- Main Input For Receiving Query to our ML -->
<form action="{{ url_for('predict')}}"method="post">
<input type="text" name="rate" placeholder="rate" required="required" />
<input type="text" name="第一个月销售额" placeholder="sales in first month" required="required" />
<input type="text" name="第二个月销售额" placeholder="sales in second month" required="required" />
<button type="submit" class="btn btn-primary btn-block btn-large">预测第三个月的销售量</button>
</form>
<br>
<br>
{{ prediction_text }}
</div>
</body>
</html>
为此项目创建了一个自定义销售数据集,该数据集包含四个个列:利率,第一个月的销售额,第二个月的销售额和第三个月的销售额。
rate | sales_in_first_month | sales_in_second_month | sales_in_third_month |
| 2 | 500 | 300 |
| 4 | 300 | 650 |
four | 600 | 200 | 400 |
nine | 450 | 320 | 650 |
seven | 600 | 250 | 350 |
five | 550 | 200 | 700 |
现在可以建立一个机器学习模型来预测第三个月的销售量。首先,使用pandas处理缺失值。如果某列或者某行出现空缺,则可能会发生数据丢失。如果未提供该值,将在“利率”列中填充零,并在第一个月的销售额中填写该列的平均值。预测模型使用线性回归作为机器学习算法。
序列化/反序列化
简而言之,序列化是一种在磁盘上写入python对象的方法,该对象可以转移到任何地方,然后通过python脚本反序列化(读)回去。
模型部分代码实现:
该部分主要完成对线性模型的预训练,并保存相关模型参数,在下一步使用。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pickle
dataset = pd.read_csv('sales.csv')
dataset['rate'].fillna(0, inplace=True)
dataset['sales_in_first_month'].fillna(dataset['sales_in_first_month'].mean(), inplace=True)
X = dataset.iloc[:, :3]
def convert_to_int(word):
word_dict = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8,
'nine':9, 'ten':10, 'eleven':11, 'twelve':12, 'zero':0, 0: 0}
return word_dict[word]
X['rate'] = X['rate'].apply(lambda x : convert_to_int(x))
y = dataset.iloc[:, -1]
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X, y)
pickle.dump(regressor, open('model.pkl','wb'))
model = pickle.load(open('model.pkl','rb'))
print(model.predict([[4, 300, 500]]))
APP.PY实现
接下来的部分是制作一个API,该API通过GUI接收销售数据信息,并根据我们的模型计算预测的销售值。 为此,使用python保存模型的pickled,并再此加载训练好的模型。 使用index.html设置主页。 使用POST请求将表单值提交给/ predict后,将获得预测的销售价值。
最后可以通过向发出另一个POST请求来显示结果。/results.
它接收JSON输入,使用训练好的模型进行预测,然后以JSON格式返回该预测,可以通过API端点进行访问。其APP.py代码如下:
import numpy as np
from flask import Flask, request, jsonify, render_template
import pickle
app = Flask(__name__)
model = pickle.load(open('model.pkl', 'rb'))
@app.route('/')
def home():
return render_template('index.html')
@app.route('/predict',methods=['POST'])
def predict():
int_features = [int(x) for x in request.form.values()]
final_features = [np.array(int_features)]
prediction = model.predict(final_features)
output = round(prediction[0], 2)
return render_template('index.html', prediction_text='Sales should be $ {}'.format(output))
@app.route('/results',methods=['POST'])
def results():
data = request.get_json(force=True)
prediction = model.predict([np.array(list(data.values()))])
output = prediction[0]
return jsonify(output)
if __name__ == "__main__":
app.run(debug=True)
最后,使用了request请求模块来调用中定义的API app.py
。它显示第三个月的预测销售额。
import requests
url = 'http://localhost:5000/results'
r = requests.post(url,json={'rate':5, 'sales_in_first_month':200, 'sales_in_second_month':400})
print(r.json())
GUI显示界面运行
代码结构:
在pycharm界面下运行app.py,出现如下界面,表明运行成功。
在浏览器中打开http://127.0.0.1:5000/,然后将显示如下所示的GUI界面。
点击预测,输出预测销售结果: