2021年5月10日,我转行到互联网做算法工作,离开了工作接近8年的机械设计工作,还是要在这里感谢军哥对我的帮助和指点!
换工作后,陆续学了《流畅的python》,FastAPI框架学了点皮毛,python web 编程学了点,LeetCode的算法题还在写,新年还是要抽时间多学习新的知识。
下面对自己的算法工作做一些总结:
-
如果没有标注数据,一开始需要自己先标注少量的数据,对数据的特点进行大致的归类
-
能用简单规则去解决相当一部分的问题(就是一个简单的手写决策树:if - else)
-
需要抽样估计一下有多少 case 漏召回,可以将算法中的一些规则放松一些,看看有多少例子被召回,此时召回率会上升,准确率会有所下降,用这样的方法去看看,算法有没有漏掉很多问题,尽量把这个规则算法的召回率做高,准确率保证在20%-30%以上都可以
-
根据规则算法把召回来的case自己进行标注,注意各类样本的比例是否合适,避免后面标注人员的无效工作,注意什么标注方法比较合理,或者编写标注工具,需要和业务方就标注标准达成共识
-
拿到标注结果后,抽样检查标注结果一致性如何,确定是否要进行二次标注或修改
-
数据准备好之后,会发现规则算法越写越复杂,解决了一部分问题,另一些问题又冲突不对了,准确率和召回率的跷跷板来回倒腾,可以使用GBDT等树模型进行机器学习,抽取一些特征,如是否有疑问词,是否有
?
,编辑距离是多少(参考加州房价项目),一种特征的one-hot维数比较大,可以考虑分桶降维,不断的加入特征,提高准确率,可以用sklearn搜索参数,看看比较重要的特征是哪些 -
如果到这步效果已经可以了(业务认可业务场景下的效果,注意不要拿算法研发的中间结果说明问题),那就可以收敛了,毕竟机器学习的计算成本还是比较小的
-
如果还不能满意,考虑深度学习算法,使用BERT,ERNIE等大模型进行学习
-
出来一版算法的结果时,去分析混淆矩阵中的 badcase,发现 badcase 的共同特征,把这个特征加入到模型当中,通过分析还可能发现 有的 case 就是人漏标了,有的 case 就是人标错了,汇总各类问题的分布比例是如何,找准问题的大头去努力解决
-
如果需要的话,还可组合更复杂的模型,比如底层用多个深度学习模型,预测的结果作为上层模型的特征,另外再添加一些其他的特征,一起提供给上层的模型(可以是机器学习模型或者深度学习模型),需要注意标注的数据量是否足够多能满足模型这么多参数的学习