ML&DEV[13] | 快速从无到有建模完成思路

【ML&DEV】

这是大家没有看过的船新栏目!ML表示机器学习,DEV表示开发,本专栏旨在为大家分享作为算法工程师的工作,机器学习生态下的有关模型方法和技术,从数据生产到模型部署维护监控全流程,预备知识、理论、技术、经验等都会涉及,近期内容以入门线路为主,敬请期待!

往期回顾:

经过很长时间的准备,完成了一套比较OK的流程,借助这套流程,我已经能快速从无到有的快速完成一个流程的开发,一周,已经试验成功,庆祝一下。那么下面,来给大家介绍一下这套流程是怎么建立起来的,以便大家参考。

当然,程序和具体方法有涉密风险,只能和大家介绍这个思路。

懒人目录:

  • 方法出现的背景

  • 适用条件

  • 核心思路

  • 全流程内容

  • 离线部分

  • 在线部分

  • 在线和离线

  • 有关重用的问题

方法出现的背景

由于近期需要接触很多同类型相似的任务,因此如果有一个完整的pipline,在资源可依赖的情况下,就能很流畅地完整这个任务。

适用条件

当然任何方法都是有适用条件的,先写一下:

  • 数据资源相对充足。

  • 任务非常相似,需要重复地开展。

  • 整个流程需要花时间建设。

  • 任务时间会大大缩短,最终有多长,和任务复杂度、可重用量等都有关。

  • 算法任务,模型类方案,第一版方案,而非迭代类型。

核心思路

其实整个思路很简单,准备好关键点,大家都能做到。核心就是——可复用,减少可复用内容上花的时间,其实你就可以加快速度了。

  • 重复性工作,需要尽快形成函数,以便下一次可以使用,尤其是数据这块。

  • 特征工程、模型之类,形成特定方法,也是函数化,直接套用。

全流程内容

当然的,先把整个流程理一下。

  • 目标确认。这个一般不会以花太多时间。

  • 资源盘点,数据、机器、耗时、内存,这个也是一段时间。

  • 离线开发与实验,即在本地自己进行试验,这块一般不会涉及任何在线部分代码。

    • 数据处理、特征工程。这里会涉及数据清洗、数据转化等流程。

    • 模型开发,后面细说。

    • 结果检验,检测各种指标,包括bad case抽取等。

  • 在线部分开发,模型师需要上线的,这块肯定需要代码。

    • 数据处理、特征工程。这里会涉及数据清洗、数据转化等流程。

    • 模型开发,后面细说。

    • 结果检验这块,在线部分需要的不是很多。

离线部分

如果是相似项目,NLP里尤其常见,一个具体的任务可以被抽象为一个简单的NLP任务,例如文本分类等,这时候其实就可以按照文本分类的流程去处理了。当然,对于ctr预估之类比较复杂的任务,也只是可重用的内容减少而已。

数据处理

这块随着做的项目逐步多,你的工具会越来越完善,其实常规的自己平时也可以写。常用的可以自己平时就准备。

  • 分词,去标点符号。NLP基操,没什么好说的。

  • 关键的正则表达式,例如括号中内容提取等。

  • 数据标准化,正态分布法、最大最小归一化等。

  • 分桶、one-hot化。

类似这些内容,自己平时多准备好,形成自己的工具函数,一般一个月花点时间整理就好了。

模型开发

初版本,千万不要想着上多么复杂的模型,一般简单模型效果不好复杂模型就别想好,而且大模型耗时风险还高,辛辛苦苦做完了上不了线。第一版本为了保证开发时间,模型开发的时间是最应该压缩的,下面是给大家的一些基线选择。

  • 分类。简单的lr,稍微复杂点的可以上lightgbm或者xgboost,离线在线均可。

  • 回归。先考虑线性回归吧。

  • 序列标注。CRF。

  • 文本分类,简单在线的就fasttext,复杂的bert可以试试,但是这玩意基本上不了线。

这个东西要做到一个水平,数据进来你能直接算,并导出结果。类似这样:

# 模型初始化
model = lr_model()
# 模型训练
model.train(data_train_x, data_train_y)
# 模型预测
model.test(data_test_x, data_test_y) # 批量
model.pred(data_test_x[0], data_test_y[0]) # 单个,出最终分类结果
model.pred_prod(data_test_x[0], data_test_y[0]) # 单个,出类目所属概率

如果没有,要自己包装一个,这个一般写个类就好了,如果是sklearn之类的,其实已经写好了,可以多去看文档。

更加极端点,请到这个地步,shell命令行水平。

nohup python model_learn.py -input_data data_train -dev_data data_dev -model_name model_20200301_1 >> train_log.log &# 训练
python model_test.py -input_data data_test -type 1-model_name model_20200301_1 >> data_test_result

如果是nlp类任务,这块应该是与任务本身无关的简化了,例如要做情感分析,好评1差评0,整理好数据放入,如果是做美食意图识别,那就换个文件的事,就问你快不快吧。

在线部分

在线部分的开发很大程度上取决于在线项目目前的现状,越是完整的项目,这个支持会越好。来看看要怎么做。

但可预知的是,由于这是一个之前有基础的工作,只要照着弄,其实会很快。

数据处理

要是你的这块新模型不需要新的特征,其实这块压根没有开发。如果有新增,在特征工程里面添加,如果这个数据的原始数据都没有,就要考虑埋点、特征采集之类的方式获取了。

模型

一般而言,新增一个变量或者说指针,然后准备好调用即可,由于有了之前项目的基础,其实这块只要再添加一个就行。

结果检验

一般在线部分不需要结果检验,为了保证你能验证在线部分的结果,需要注意这几个事情要具备:

  • 单测。查看最终结果

  • debug日志。查看必要的过程变量。

在线和离线

在线部分和离线部分其实是一个非常微妙的关系,这是算法工作的特色。

  • 离线部分,主要负责模型的训练和测试,要求达到较高效果。

  • 在线部分,主要是模型应用,精准度与离线部分基本一致的同时,耗时、内存等保持较低水平。

那么在处理时,就要注意如下问题:

  • 离线在线要一致,不只是模型,还有特征工程等全流程。

    • 这个没有想象中简单,因为离线在线可能用的不同的环境,例如语言等,离线用的python,在线就成了c++。

  • 在线部分的耗时和内存消耗要有预判,否则离线搞了这么个玩意在线用不了,白干了。

有关重用的问题

有很多做算法的,尤其是学生,不是计算机出身,甚至哪怕是计算机专业出身,工程上的经验比较少,这就导致一些工程经验会很少,逻辑复杂没有算法复杂度概念,或者是代码就很长,几百行上千行,维护起来很困难,这其实就是经验较少的原因,多做项目,多去实习其实就是很好地提升反复,这也是为什么我提倡大家去实习。

本方法的核心在于构造可重用的东西,函数化,因为一个函数、一个类很多内容是固定的,这些固定的重用,会让你少些很多代码,同时也不容易出错,效率自然就提升了,这个,其实就是我们自己写的包。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值