从0到1快速构建银行存款预测应用

胡琦 发表于 2020/07/02 00:50:46 2020/07/02
【摘要】 模型在线服务基于ModelArts预测分析开发,应用基于Vue.js和Koa.js开发,从0到1实现银行存款预测!

本文首次发表于华为云社区ModelArts版块,主要是作者在学习使用AI开发平台ModelArts过程中的一些经验产出。此次要和大家分享的是基于ModelArts的自动学习实现银行存款预测,值得注意的是这里的银行存款是动作,是指根据您的年龄、工作类型、婚姻状况、文化程度、是否有房贷以及是否有个人贷款来预测您是否会办理存款业务。相比银行系统的真实业务场景及应用,此次实践仅仅是一次趣味性的尝试,是我对ModelArts在线服务调用的首次尝试,如您有意见和建议欢迎在评论区留言,感谢!

start.png
↑开局一张图,故事全靠编。

今天Q姐问我最近有没有什么创意项目,我想了想还真没有什么拿的出手的,无意间看到官方的仓库ModelArts-Lab又更新了,了解到这个银行存款预测的自动学习教程已更新,另外还有重磅好消息:AI市场数据集等模块即将开放!最开始的想法是想做那个数据集的练习,结果发现还没开发,于是想到我还有真正调用过ModelArts的在线服务,之前每次实践完都是用的那个在线预测,感觉训练出来的模型没有真正落地,这次就打算Copy一个小应用将在线服务真正利用起来。因为我的技术栈是JavaScript,所以选用的NodeJS作为我这次落地的服务端,幸好官方有提供JavaScript的AK配置Demo,不然摸着石头过河的Copy攻城狮本尊估计早就淹死了。废话不多说,和Copy攻城狮一起从0到1实现“今天你存款了吗”的银行存款预测小应用。

准备

还是那句老话,“磨刀不误砍柴工”,“工欲善其事必先利其器”,“巧妇难为无米之炊”,好像我有只记得这几句。OBS、ModelArts、全局访问密钥等等先准备一下,这里就不提具体的细节了,关注过我的朋友应该很熟悉了,默认大家已经开通OBS并新建了桶,同时开通ModelArts。

  • 数据集下载

点击下载训练数据集train.csv[1]

银行客户数据集的字段解释如下:

字段名 含义 类型 描述
attr_1 年龄 Int 表征客户的年龄
attr_2 职业 String 表征客户所从事的职业
attr_3 婚姻情况 String 表征客户是否结婚或已离异
attr_4 教育情况 String 表征客户受教育的程度
attr_5 房产情况 String 表征客户名下是否有房产
attr_6 贷款情况 String 表征客户名下是否有贷款
attr_7 存款情况 String 表征客户名下是否有存款

data-view.png

  • 上传数据集到OBS

上传银行数据集文件至OBS(OBS操作指导参考:https://support.huaweicloud.com/qs-obs/obs_qs_0001.html ),本案例上传至OBS路径“/ai-camp/automl/bank/train.csv”。
data-obs.png

实践

  • 新建预测分析项目

进入ModelArts 自动学习[2],选择【预测分析】创建项目,本次实践命名为exeML-bank-predict,数据集选择上一步上传的train.csv,点击【创建项目】即可新建一个预测分析类型的自动学习项目。
createML.png

  • 数据标注
    成功创建完项目,会自动进入【数据标注】界面,如果不小心关闭了,可在【自动学习】界面找到刚刚创建的exeML-bank-predict项目,点击项目名称exeML-bank-predict仍可进入到【数据标注】界面,我们这里根据业务需求,标签列选择“attr_7”(是否会办理存款),标签列数据类型选择“离散值”,点击【训练】,开始训练。如有弹窗点击确认即可。
    data-mark.png

  • 模型训练

在【模型训练】界面等待训练完成(预计5分钟,我等了10分钟),训练完成后,可以查看模型的精度,当然如果不小心关闭页面了,同样在【自动学习】界面找到当前项目并点击顶部【模型训练】再次进入到【模型训练】页面查看训练状态、版本信息等。
data-train.png

  • 部署上线
    当训练成功完成之后,之前【停止】的按钮会变成【部署】,点击即可进入部署流程,等待部署成功即可进行服务测试。
    data-server.png

  • 服务测试
    在【部署上线】界面,等待服务部署成功(PS:耐心等待中……)。添加一条银行客户信息,然后点击【预测】,即可完成测试。
    银行客户信息:

{
  "meta": {
    "uuid": "10eb0091-887f-4839-9929-cbc884f1e20e"
  },
  "data": {
    "count": 1,
    "req_data": [
      {
        "attr_1": "58",
        "attr_2": "management",
        "attr_3": "married",
        "attr_4": "tertiary",
        "attr_5": "yes",
        "attr_6": "no",
        "attr_7": "no"
      }
    ]
  }}

data-testresult.png

应用

虽然整个实践很简单,在实践之后,我也思考了一下,从实践本身来说,我们可以落地的应用就是基于客户特征判断是否有存款的需求。于是,我们根据已有的数据挖掘了新的特征。按照服务测试时的请求数据格式,我们是可以一次请求实现多条数据预测的,那么对于大量数据来说,就可以批量进行预测了。当然,ModelArts自动学习的预测分析还可以做很多很多不同场景的应用。最后,既然完成了服务端的实践,那客户端的形态可以是千千万万种,意味着我们的应用也是可以不同的,我这里已一个简单的表单提交完成客户端的实践,【今天你存款了吗?】终于得以完成!说实话,自动学习模型部署从无到有只需一会儿,而我开发这个简单的表单应用却花了一天,主要还是服务端调用ModelArts在线服务那卡壳了。最终采用NodeJS框架koajs[3]进行开发,表单页面使用VueJS粗暴的堆了组件,什么VantUI、Axios等等。详细代码见Bank_Deposit_Predictio[4],欢迎star和拍砖指正!
myserver.png

核心代码

此处使用NodeJS调用ModelArts在线服务,可参考华为云提供的API签名指南[45。我这里采用的KoaJS,其他实现方案类似。首先新建.env文件存放AK/SK,通过dotenv库读取;然后借助signer配置签名;最后简单封装了api调用,只需在调用的时候传入数据和请求地址就可以获取预测结果,当然目前没有做文件上传预测的功能,后续一起研究研究。

// dotenv读取.env配置文件const dotenv = require("dotenv");// http组件const koaRequest = require("koa2-request");// 官方提供的签名工具const signer = require("./signer");// 默认api地址const URL =
  "https://3b3d112b50be48a29350819fb3f576dc.apig.cn-north-4.huaweicloudapis.com/v1/infers/cd97ab64-3081-4f09-8cfd-6a615239990e";// 默认请求参数const BODY = `
{
    "meta": {
      "uuid": "10eb0091-887f-4839-9929-cbc884f1e20e"
    },
    "data": {
      "count": 1,
      "req_data": [
        {
          "attr_1": "58",
          "attr_2": "management",
          "attr_3": "married",
          "attr_4": "tertiary",
          "attr_5": "yes",
          "attr_6": "no",
          "attr_7": "no"
        }
      ]
    }
  }`// 签名配置dotenv.config();const sig = new signer.Signer();sig.Key = process.env.AK;sig.Secret = process.env.CK;// 简单封装api调用const submit = async function (body, url) {
  const r = new signer.HttpRequest("POST", url || URL);
  r.body = body || BODY;
  r.headers = { "Content-Type": "application/json" };

  const opt = sig.Sign(r);

  //koa封装的请求第三方接口的方法(koa2-request)
  let res = await koaRequest(Object.assign(opt, { body: r.body }));
  return res.body;};module.exports = submit;

入口调用及返回前端页面:

const fs = require("fs");const Koa = require("koa");const bodyParser = require('koa-bodyparser');const app = new Koa();const submit = require('./submit')app.use(bodyParser());const main = async (ctx) => {
  if (ctx.request.path == "/") {
    ctx.response.type = "html";
    ctx.response.body = fs.createReadStream("./bank.html");
  } else if (ctx.request.path == "/submit") {
    console.log(ctx.request.body)
    ctx.response.type = 'json';
    ctx.response.body = await submit(JSON.stringify(ctx.request.body)||'');
    console.log(ctx.response.body)
  }
  else {
    ctx.response.body = "Hello World";
  }};app.use(main);app.listen(3000);

就这么几行代码,琢磨了一天,看来还是无法摆脱Copy攻城狮的魔咒啊!

参考链接

[1] https://cdn.jsdelivr.net/gh/huaweicloud/ModelArts-Lab/ExeML/ExeML_Bank_Deposit_Prediction/data/train.crv
[2] https://console.huaweicloud.com/modelarts/?region=cn-north-4#/exeml
[3] https://github.com/koajs/koa
[4] https://github.com/hu-qi/Bank_Deposit_Prediction
[5] https://support.huaweicloud.com/devg-apisign/api-sign-provide.html


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。