在开始学习之前推荐大家可以多在 FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。
在2019年橄榄球世界杯期间,我做了一个小型的数据科学项目来尝试预测比赛结果。我现在将其记录下来。我已经将其扩展成了一个端对端学习项目的示例,来展示如何部署一个应用机器学习模型的交互式网页端应用。
目标
概述从原始数据到可用的已部署机器学习应用程序所需的关键步骤。
完成此操作后——您就可以选择一个感兴趣的主题,找到一些数据,动手实践,直到建起自己的机器学习应用程序,即从数据准备到部署。
关键步骤
1. 使用Pandas处理数据&使用SQLite储存数据
2. 使用Keras建立机器学习模型(神经网络)
3. 使用Flask(还有一些CSS&HTML)建立Web应用
4. 使用Docker和Heroku部署应用
代码可以在GitHub上获取,可用的应用可以在此浏览。(注意,这些代码还未达到生产水平,但是足以展示开头应该做的内容。这个可用的应用使用的是特定时点数据的快照)。
1. 使用Pandas处理数据&使用SQLite储存数据
数据科学家会在这上面花费45%的时间,只是为了让数据满足建立模型的要求
数据处理包括清洗、结构化和丰富,借此使你的数据满足建立机器学习模型的要求。例如,解决空缺数据或者不规则格式。
除非你已经有了一个干净的数据集(现实中几乎不可能发生),你将需要使用探索性数据分析(EDA)来更好得理解数据。
Pandas-profiling 是用于EDA的一个优秀的模块。他会生成一个DataFrames格式的文件报告,其中包括分位数和描述性统计信息、相关系数、缺失值和直方图。
使用Pandas-profiling进行EDA的一个输示例
-
为了这个项目,我需要来自 ESPN Scrum 的数据。您可以在 data_prep.py 属性定义格式,例如使用 to_datetime() 方法匹配日期。我还用了 世界橄榄球排名 的数据来丰富,使用微软的技术衡量 TrueSkill 评级系统。
-
如果你正在寻找数据集,加州大学欧文分校的机器学习知识库 和 Kaggle 都是值得探索的好资源。另外,您也可以使用 BeautifulSoup 抓取来获取数据。
-
我将我的数据帧作为表存储在SQLite数据库中。这是一个轻量级数据库,在世界上应用也最广泛。当然你也可以使用普通的csv文件,但是这提供了一个学习SQLite的机会。下面的代码连接到 match_results 数据库,并将 latest_stats 作为表写入其中。
-
conn = sqlite3.connect('match_results.db') latest_stats.to_sql('latest_stats', conn, if_exists='replace')
现在我们有了测试和训练机器学习模型的数据时间。
2. 机器学习- Keras神经网络
测试中
使用均方误差(MSE)作为损失函数来最小化。我们进行了超参数调整(Jason Brownlee在这里提供了教程),并且我尝试了宽网络(带有大量神经元的一层)和深网络(更多层但每层神经元更少),直到MSE没有显著改善。
您希望模型能够很好地处理不可见的数据。如果你对你的模型进行过拟合,你的训练数据可能会有一个小的错误,但是你的测试数据(看不见的)会有一个大的错误。当这种情况发生时,模型已经学习训练数据几乎太好,不能推广到新的数据。有避免过拟合的各种技术。
下面我们可以看到,训练数据和测试数据的MSE在大约25个时期之前迅速下降,然后保持相对稳定。
Training
最终模型的第一层有15个神经元,第二层有8个神经元,均带有矫正线性激活单元(ReLU)。
它是用Adam优化算法编译的,这是一个 efficient gradient descent algorithm.
model = Sequential()
model.add(Dense(15, input_dim=5, kernel_initializer='normal', activation='relu'))
model.add(Dense(8, kernel_initializer='normal', activation='relu'))
model.add(Dense(2, kernel_initializer='normal'))
model.compile(loss='mse', optimizer='adam')
拯救你的模型
-
save() 函数用于保存最终的Keras模型。这节省了模型架构和权重,并允许我们稍后在应用程序中加载模型来对新数据进行预测。
3.Web应用与Flask(和一些CSS和HTML)
Flask 是一个web框架,可用于相对快速地开发web应用程序。你可以在这里找到一个快速发展的步行。
下面的代码 app.py 文件基本上建立了主页,并为用户提供index.html:
应用程序的主页与用户输入表单
WTForms 用于表单,以便用户可以选择他们的两个橄榄球队。单击按钮时,输入将通过model_predict函数发送到保存的ML模型。得到的模型预测然后作为输入变量发送到predict .html模板。
@app.route("/", methods=['GET', 'POST'])
def home():
form = TeamForm(request.form)
# Get team names and send to model
if request.method == 'POST' and form.validate():
team1 = request.form['team1']
team2 = request.form['team2']
return render_template('prediction.html', win_prob=model_predict(team1,team2)[0],
score=model_predict(team1, team2)[1])
# Send template information to index.html
return render_template('index.html', form=form)
html模板做了三件关键的事情:
- 获取从模型输出发送给最终用户的获胜概率和分数(通过win_prob和分数变量)
- 提供一个按钮,让用户返回主页
- 引用 main.css 文件提供一些样式
预测结果页面
<!DOCTYPE html>
<head>
<title>Prediction</title>
<link rel="stylesheet" href="/static/css/main.css">
</head>
<body>
<div >
<h1>
<center>Predictions</center>
</h1>
{% block content %}
<div >{{win_prob}}</div>
<div >{{score}}</div>
<form action="/button" method = "POST">
<p><input type = "submit" value = "Return" /></p>
</form>
{% endblock %}
</div>
</body>
</html>
-
这是它的内容!总之,你明白:
-
两个模板:首页和预测结果页面的index.html和predict .html
-
4. 使用Docker和Heroku部署应用
-
Docker 容器
-
我不会去太详细地介绍 Docker ,但关键要知道的是,它允许您计划您的应用程序在一个自给自足的容器,可以跨系统即使用它创建一个便携式容器,让它更容易部署你的应用,你可以深入的细节在官方 Docker 文档。
-
下载Docker的方法在这里。
-
在你的app目录中创建一个 Dockerfile 。这包含了构建 Docker 映像的说明。Dockerfiles 的最佳实践可以在这里和这里查看。下面您将看到,我已经包含了运行 requirements.txt 文件的说明,该文件包含应用程序的依赖项。
FROM Python:3.7.3-stretchRUN mkdir /app
WORKDIR /app#Copy all files
COPY . .# Install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt# Run
CMD ["python","./main.py"]
打开终端,进入包含Dockerfile和app的目录。使用build命令构建你的镜像: docker build -t rugby_prediction 这将从Dockerfile构建Docker映像。
-
你可以在本地使用 run 创建容器的命令 docker run --name rugby -p 5000:5000 -d rugby_prediction 在这里,-p将容器的端口发布到主机,-d使容器在后台运行。一旦这是运行,你应该能够查看你的应用程序运行在你的浏览器(在Docker桌面,点击打开浏览器按钮)。
如果你在运行应用程序时遇到任何错误,你可以使用 docker logs 命令,查看日志和调试。
部署 Heroku
我使用Heroku作为主机,因为他们有一个很好的免费层,用于非商业应用程序。
下载这个 Heroku CLI 然后登录你的Heroku帐号: heroku login
-
登录到容器注册表:heroku container:login
-
进入你的应用工作目录,并推送Docker的镜像: heroku container:release web --app [YOUR APP NAME]
-
完成了!您已经准备好分享您的实时机器学习web应用程序。
希望这对你开始有帮助。请随意在评论中发布您自己的ML应用程序的链接——如果能看到它们就太好了。
-
- 最终部署的web应用
更多深度学习竞赛项目,大家可移步官网进行查看和参赛!
更多精彩内容请访问FlyAI-AI竞赛服务平台;为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台;每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。
挑战者,都在FlyAI!!!