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++。
在线部分的耗时和内存消耗要有预判,否则离线搞了这么个玩意在线用不了,白干了。
有关重用的问题
有很多做算法的,尤其是学生,不是计算机出身,甚至哪怕是计算机专业出身,工程上的经验比较少,这就导致一些工程经验会很少,逻辑复杂没有算法复杂度概念,或者是代码就很长,几百行上千行,维护起来很困难,这其实就是经验较少的原因,多做项目,多去实习其实就是很好地提升反复,这也是为什么我提倡大家去实习。
本方法的核心在于构造可重用的东西,函数化,因为一个函数、一个类很多内容是固定的,这些固定的重用,会让你少些很多代码,同时也不容易出错,效率自然就提升了,这个,其实就是我们自己写的包。