手把手教你用 Python Pandas,Keras ,Flask ,Docker和 Heroku 部署机器学习模型(附代码)

                                                                            Fly-AI竞赛服务平台 flyai.com

在开始学习之前推荐大家可以多在        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模板做了三件关键的事情:  

  1. 获取从模型输出发送给最终用户的获胜概率和分数(通过win_prob和分数变量)  
  2. 提供一个按钮,让用户返回主页  
  3. 引用  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!!!

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值