针对不同任务如何挑选机器学习模型

其实这个题目其实早就想探讨一下了,因为工作有时候会在这件事情上花费很多时间。这两天坐着思考了一下,这个问题其实应该分几个维度来讨论。
当然,这里只讨论工业界。

区分目的

首先需要明白,你是要做什么,是要快速落地,还是提升模型效果,还是讲故事,还是做算法可行性研究,都有不同的套路,以及工作中各种形形色色的约束。

讲故事--PPT型

工作中,总要给客户或者领导讲各种的故事,做个看起来fantastic的ppt,以前还没工作多久的时候,对这种事情嗤之以鼻,现在啊,赚钱嘛,不丢人
因为现在不像以前,故事不是带有AI,听众就使劲鼓掌,让人信服。时代变了,还是得拿点东西出来给别人看的。如何讲一个好的技术性故事,根据我的经验,一定要在吹牛逼和实用性和普及性中间平衡。
举个例子,NLP相关的任务,你给别人讲故事,不要一开始就把rf,word2vec就掏出来,你得讲Transformer,elmo和BERT,但是你又不能讲GPT-2和ERNIE2这种最新模型。
不是因为GPT-2和ERNIE2不好用,甚至ERNIE2对于中文的效果是非常好的,而是说这两个模型对于专门做NLP的人熟悉且好用,而Bert这个名字流传度更广,业界出的成果更多,开发起来更便捷(github上的各类demo源码更多,便于落地),但是相对于word2vec这种老古董更先进。
综合这样,东西可以落地,效果也查不到哪里去,又是业界较新生产力,这个故事还是可以给你别人的。当然,只能是给别人看看,真正落地又是另一件事。

预研--研究型

工作里面,算法可能遇到瓶颈了,可能是性能太差,不满足生产,可能是准确性上不去,效果不好,就需要搞研究工作了。
研究工作模型是一个纵向的,不能一味的把模型往深了做,而是不同深度各出一个结果。
举个例子,现在我的工作是一个时间序列预测的工作,数据充足,特征管够,不缺人力,算力拉满(多么理想的工作环境),一开始是接到任务,首先深度学习整起来,简单的CNN和LSTM来一套,往深了搞,也训练出来了比较好的效果。嗯,我很满意。但是这个工作是与硬件相关的,硬件上给分配了30M的内存,深度学习的模型都加载不了。好的,前期工作白费。
换模型降维,普通的网络搞一下,xgboost和adaboost,其实都可以做,但是这个时候还不够,我们最后选择了的模型是用信号频率分解+线性拟合。
为什么这么选,网络和xgboost的效果还可以,但是效率低,当实时数据量非常大的时候,还是有点慢的,adaboost(回归树)效率可以,但是效果又不好,最后我们选择了一个比较简单的模型。
所以,搞模型预研,一定要做成一个纵向,不能一直往深了做,也要回头看看,也许有更好的选择。合适才是最好的模型。

实干--落地型

模型要落地,重点应该关注在生产中的约束条件。

  • 监督和非监督,考虑人手够不够,训练需要投入的成本,优先选择监督。
  • 深度学习和机器学习,考虑算力和效率,算力充足,性能要求不高,优先选深度学习。
  • 深度学习新模型和旧模型,不要选最新模型,选最流行的模型,因为最新模型是学术界做的demo,面对SOTA做模型。就算效果好也要等网上资料足够多了(github上的开源demo足够多)再考虑换模型。
  • 选择机器学习模型,考虑任务。如果分类,优先考虑随机森林,xgboost和SVM,SVM性能最好,随机森林最平衡,xgboost效果最好。如果回归,线性拟合,SVM,xgboost都可以用。

一点感悟

训练了这么多模型,其实最后发现,有些模型,在数据较好的情况下,效果差不太多,准确率就是那几个点的事情,不超过5个点,特别是深度学习。所以不要觉得换了一个模型就可以大幅度提升把数据选好才是最大的提升空间。
而实际情况是,一个模型或者几个模型并不能解决业务的问题,需要一套组合拳。最常见做法是,先做预处理,排除最明显的,再跑模型(组合模型),最后做后处理,这才是效果最好的。


今天就到这,有什么问题欢迎交流。mail: [email protected]

你可能感兴趣的:(针对不同任务如何挑选机器学习模型)