用机器学习分析流行音乐(四):生产模型

2020 年 9 月 09 日

用机器学习分析流行音乐(四):生产模型

本文是该教程的第四部分,我将使用 FLASK 将预测模型投入生产。如果你有兴趣,可以先看本教程的第一部分、第二部分、第三部分


什么是模型部署?模型部署就是将机器学习模型集成到现有的生产环境中,以便基于数据做出实际的业务决策。


我们将使用带有 FLASK 的 Python web API 来部署模型。因此,我们的最终目标是创建一个网站,一旦用户在网站上输入值,该网站就会给你预测的结果。


从 GitHub 下载文件


首先,到我的 GitHub 页面上的 K-pop 仓库下载模型部署文件夹


我们将使用名为 GitZip 的网站,它可以让你下载 repo 中的特定文件夹,你所需要做的就是将连接复制并粘贴到模型部署文件夹。



复制并在此处粘贴文件夹链接


你可以随意命名文件夹,我将文件夹命名为“K-pop Model Deployment”。


使用 Spyder IDE


在本教程中,我们将使用 Spyder IDE。


如果你还没有安装 Spyder IDE 的话,可以从这里下载(你需要从 Anaconda 网站下载),请务必下载版本 7.3,因为这是最新版本。



安装 Anaconda(Python 3.7)


安装后,打开 Spyder IDE,导航到“File Explorer”,然后选择刚刚下载的文件夹。


在 templates 文件夹下打开 app.py、k_pop_model_building.py 和 index.html。



Spyder 中的 File Explorer


只选择连续变量


在上一部教程中,我们使用了.pd.get_dummies(df_model)将类别变量转换为虚拟变量/指标变量。我意识到,这样做会产生太多额外变量,我认为这样对用户不太友好(我们并不希望用户输入 73 个答案)。因此,我们只选择连续变量,这样,用户只需输入 5 个变量(“yr_listened”、“daily_MV_hr”、“yr_merch_spent”、“age”、“num_gr_like”)即可预测他们每天听歌的小时数:“daily_music_hr”。


df_real = df[[“yr_listened”, “daily_music_hr”, “daily_MV_hr”,“yr_merch_spent”, “age”, “num_gr_like”]]
复制代码


然后,进行训练并在此测试分离。


from sklearn.model_selection import train_test_splitX = df_real.drop('daily_music_hr', axis = 1)y = df_real.daily_music_hr.valuesX_train, X_test, y_train, y_test = train_test_split(X, y,test_size = 0.2,random_state = 1)
复制代码


运行 XGBoost 模型


在上一部教程中,我们看到 XGBoost 模型是最好的一个。因此,我们将部署这个模型。


import xgboost as xgb# initialize the linear regression modelxgb_clf = xgb.sklearn.XGBClassifier(nthread = -1, seed = 1)# train the modelxgb_clf.fit(X_train, y_train)# Tune XGBoost using GridSearchCVfrom sklearn.model_selection import GridSearchCVparams = {'min_child_weight': [5], 'gamma': [1],'subsample': [0.8, 1.0],'colsample_bytree': [0.6, 0.8],'max_depth': [1,2]}gs_xgb = GridSearchCV(xgb_clf, params ,scoring = 'neg_mean_absolute_error',cv = 10)gs_xgb.fit(X_train, y_train)gs_xgb.best_score_xgb_best = gs_xgb.best_estimator_xgb_bestxgb_best.fit(X_train, y_train)
复制代码


保存训练模型


我们可以使用pickle将经过训练的模型保存到磁盘中。然后,它在以后重新加载后,可以完全使用,就像我们已经训练过它一样。


# save the model to diskwith open('model.pkl', 'wb') as file:pickle.dump(xgb_best, file)
复制代码


使用 FLASK 创建 Web 应用程序


首先,我们需要这两样东西来创建一个 Web 应用程序。


  1. Pythono 脚本将加载经过训练的模型,要求用户将输入值放到网站上,执行预测,并返回结果。

  2. HTML 模板,即网站的格式。这将允许用户输入他们的数据并显示结果。


结构如下所示:


web app/


├── model/


│ └── model.pkl — trained model


├── templates/


│ └── index.html — format of the website


└── app.py — to host the model


创建 app.py 以托管模型


app.py 将成为 Web 应用程序的基础。它将发送网页,从用户哪里获取数据来执行预测。


# use flask to host the modelimport flaskimport pickleimport pandas as pd# Use pickle to load in the pre-trained modelwith open(f'model.pkl', 'rb') as f:model = pickle.load(f)# initialize the flask appapp = flask.Flask(__name__, template_folder='templates')# set up the main route@app.route('/', methods=['GET', 'POST'])def main():if flask.request.method == 'GET':# rendering the initial form, to get inputreturn(flask.render_template('index.html'))if flask.request.method == 'POST':# extracting the input valuesyr_listened = flask.request.form['yr_listened']daily_MV_hr = flask.request.form['daily_MV_hr']yr_merch_spent = flask.request.form['yr_merch_spent']age = flask.request.form['age']num_gr_like = flask.request.form['num_gr_like']# making dataframe for modelinput_variables = pd.DataFrame([[yr_listened, daily_MV_hr, yr_merch_spent, age, num_gr_like]],columns=['yr_listened', 'daily_MV_hr', 'yr_merch_spent', 'age', 'num_gr_like'],dtype=float,index=['input'])# get the model's predictionprediction = model.predict(input_variables)[0]output = float(round(prediction, 2))# render the form again, but add in the prediction and remind user of the values they input beforereturn flask.render_template('index.html',original_input={'yr_listened':yr_listened,'daily_MV_hr':daily_MV_hr,'yr_merch_spent':yr_merch_spent,'age':age,'num_gr_like':num_gr_like},result=float(output))if __name__ == "__main__":app.run(debug=True)
复制代码


创建 index.html 对网站进行格式化


这是该项目的前端部分。它要求用户输入值,执行预测并给出输出结果。这是一种非常基本的样式。我当时试着用 CSS,但无法真正让它工作起来。如果你熟悉 CSS 或者想使用样式,请随意使用。


<!doctype html><html><style></style><head><title>Predicting Daily K-Pop Listening Hours</title></head><form action="{{ url_for('main') }}" method="POST"><fieldset><legend>Input values:</legend>Number of years you listened to K-Pop:<input name="yr_listened" type="number" step=".01" required><br><br> Number of hours you watch K-Pop MV per day:<input name="daily_MV_hr" type="number" step=".01" required><br><br> How much money you spend on K-Pop merchandise a year:<input name="yr_merch_spent" type="number" step=".01" required><br><br> Your age:<input name="age" type="number" step=".01" required><br><br> Number of groups you like:<input name="num_gr_like" type="number" step=".01" required><button type="submit" class="btn btn-primary btn-block btn-large">Predict!</button></fieldset></form><br><div class="result" align="center">{% if result %}{% for variable, value in original_input.items() %}<b>{{ variable }}</b> : {{ value }}{% endfor %}<br><br> Predicted Daily K-Pop Listening Hours:<p style="font-size:50px" step=".01">{{ result }}</p>{% endif %}</div></html>
复制代码


运行 Web 应用程序


现在,我们终于可以进行测试了,看看是否一切都按照我们设想的方式运行。


  1. 转到 Anaconda 提示符。

  2. 将目录切换到你的工作文件夹(即 cd Desktop → cd k-pop Model Deployment)。

  3. 运行 app.py(即 python app.py)

  4. 将获得的链接复制并粘贴到浏览器。

  5. 输入值并检查它给出了预测结果。


Anaconda 提示符命令示例:


cd Desktopcd K-Pop Model Deploymentpython app.py
复制代码



完成,希望这篇教程对你有所启发。


我的 GitHub 仓库这里


作者介绍:


Jaemin Lee,专攻数据分析与数据科学,数据科学应届毕业生。


原文链接:


https://towardsdatascience.com/analyzing-k-pop-using-machine-learning-part-4-productionizing-the-model-model-deployment-a9fc2e703d95


2020 年 9 月 09 日 12:00518

评论

发布
暂无评论
发现更多内容

Java中的一些限制

xiaoxi666

Python代码调试指南

王坤祥

Python Python基础

ARTS打卡 第13周

引花眠

微服务 ARTS 打卡计划

架构师训练营第十一周作业

Melo

Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存

newbe36524

Docker 云计算 微服务 .net core ASP.NET Core

rockchip的yocto编译环境搭建

良知犹存

Linux yocto rockchip

看智微智能互动录播系统如何建设“三个课堂”

InfoQ_967a83c6d0d7

架构师训练营 - 第 8 周学习总结

红了哟

想问面试官什么问题么?

escray

学习 面试 面试现场

utf8字符集下的比较规则

Simon

MySQL 字符集

ARTS打卡Week 11

teoking

MacOS抓包工具Charles

叉叉敌

ios charles 抓包

想不出来问题的你

escray

学习 面试 面试现场

你期待的薪酬是多少?

escray

学习 面试 面试现场

从Vessel到二代裸金属容器,云原生的新一波技术浪潮涌向何处?

华为云开发者社区

Docker 容器 云原生 k8s Vessel

关于Aborted connection告警日志的分析

Simon

MySQL MySQL错误日志

disruptor 高性能队列最佳选择

柿子

队列 disruptoer 高性能队列

【Elasticsearch 技术分享】—— ES 常用名词及结构

程序员小航

Java 搜索引擎 elastic ES Lucene Elastic Search

ARTS打卡(20.08.17-20.08.23)

小王同学

我与游戏相伴【自我访谈2】

叶阳夏烟

系列 游戏 访谈录 剧情游戏 仙剑奇侠传

1.Flink任务之间通信开销-6

小知识点

scala 大数据 flink

要刷LeetCode了,才发现自己连时间复杂度都不懂

海星

算法 LeetCode

“深化产教融合·共育数字人才”全国产教融合信息化高峰论坛·江苏站成功举办

InfoQ_967a83c6d0d7

Java ForEach语句判断是否为空

引花眠

bug

浅谈 GET 和 POST 区别

叉叉敌

面试题 post GET

一家估值20亿美元的公司,竟然没有办公室?

Atlassian速递

远程办公 Atlassian Jira

大数据技术思想入门(三):分布式文件存储的流程

抖码算法

Java 大数据 hadoop 分布式

顺时针遍历矩阵,提高系统高并发350倍,React Native原理浅析 组件设计原则 安全架构 防火墙ModSecurity John 易筋 ARTS 打卡 Week 14

John(易筋)

ARTS 打卡计划 组件设计原则 React Native 高并发优化

速看!今天我才知道,UUID还分五个版本

麦叔

Java uuid

Docker 安装及配置镜像加速

哈喽沃德先生

Docker 容器 微服务 容器技术 容器化

6. 二十不惑,ObjectMapper使用也不再迷惑

YourBatman

json Jackson ObjectMapper

用机器学习分析流行音乐(四):生产模型-InfoQ