问题：﻿一个算法工程师的日常是怎样的？ 比如思考、写代码的时间分布是怎样的？
话题：﻿互联网、数据挖掘、机器学习、计算机科学、算法工程师
回答：﻿机器学习算法工程师的日常目前笔者已经在互联网行业从事机器学习方向三年有余，经常也被问到做机器学习算法工程师是一个什么样的体验，同时也常常在其他平台上看到其他人问类似的问题。于是提笔写下此文，供有志投身于这个行业的人参考。日常生活读数学博士的时候，通常的日子是这样的：根据论文或者某个讲座得到的信息来提出某个数学猜想->然后开始在Google上搜索论文->再花费几周到几个月的时间来读论文，并且思考这些论文的优点和缺点->思考->思考->思考->继续读更多的论文->思考->思考->思考->…->放弃。。。。在互联网公司做机器学习的时候，通常的日子是这样的：根据行业的PPT或者业务中的某些痛点来提出技术方案->然后开始收集数据，不仅要问遍组内，还要去其他组收集各种各样的需求->根据之前的技术方案来进行数据的预处理->撰写特征工程->训练模型->调参->调参->重新收集数据->数据的预处理->收集更多数据->调参->调参->调参->…->放弃。。。。业务理解就做机器学习的经验来看，通常来说在做业务之前，一定要清楚的弄明白项目的业务需求是什么，弄清楚这个问题是什么比一开始就写代码重要得多。意思就是在回答问题之前，一定要把问题的内容弄清楚。有的时候，虽然看上去是一个很大的需求，但是实际操作起来的时候使用一些简单的办法也能够达到项目指标。有的时候，虽然看上去很简单，但是实际操作起来并不是一件容易的事情。从之前做理论数学的经验来看，通常数学里面的一些问题是是非题，不能够添加条件的。在PDE等方程领域，定理的条件越多，表示定理越不值钱。不过在工作中，这些条条框框会相对减少很多，只要能够达成项目目标，无论是添加样本，添加特征，添加服务器数量其实都是可以的，并且要把机器学习模型和业务指标有机结合才能够达到最终的项目指标。一般搞数学科研的时候都是单打独斗，通常来说都是自己干自己的事情，别人也没办法帮自己。但是在工作中是不一样的，工作中除了干好自己的事情之外，周边的很多资源其实是可以在一个合理的范围内去争取的。无论是人员的数量，还是人员的种类，只要最终能够达成项目目标即可。无论是算法人员，还是开发人员，产品经理，最终都是要为一个项目的结果负责的。之前听过一句经典的话“失败的项目里没有成功的个人”，因此，无论怎么做，最终都要保证项目尽量成功。数据清洗和特征工程而在机器学习算法工程师的日常生活中，除了上面的小段子之外，其实最重要的是样本层和特征层的处理工作。在学术界，都是使用开源的数据，别人都已经完全标记好了，学术圈的人通常来说只需要在这些数据的基础上提出更好的模型，更创新的算法即可。但是在工业界就完全不一样了，不要说有人帮你标记数据了，有的时候连数据在哪里都不知道，数据的质量如何也不知道，因此更多的时候是进行数据的处理和清洗工作。之前做一个项目的时候，准确率和召回率始终上不去，但是等把样本里面的脏数据清理掉之后，模型的效果瞬间提升了一个档次。在脏数据面前，再好的模型都是没有用的，在训练模型之前，一定要先看一下数据层的问题。除了数据的问题，通常来说在一些场景下，样本的数量并没有那么大，因此深度学习等方案不一定特别适合。在这种情况下，一般就会使用传统的机器学习方法，并且会使用一些基于业务的特征工程。这种时候就需要机器学习从业者对业务有一个精准的理解，只要业务理解得好，有的时候写一些简单的规则就可以解决问题。特征工程也是机器学习里面的一个重要问题。持续学习在人工智能这个领域，无论是CV，NLP，还是机器学习，里面的技术迭代都是非常快的，而且是需要相对专业的人才能够从事这些领域。在这种情况下，机器学习从业者的持续学习就显得尤其重要，几年前的技术在新的业务场景下就未必适合，可能需要使用其他的模型或者框架才能够更好地解决问题。所以，除了完成日常的搬砖工作之外，建议每天抽一点时间来阅读论文，保持对业界技术的跟进和迭代。不过这个行业鱼龙混杂，有的时候论文或者PPT里面的技术框架其实没有办法复现，能够精准地判断哪些方案好，哪些方案差绝对是算法工程师必备的关键能力之一。编程能力如果是在工业界的话，编程能力是非常重要的。因为从事算法的人通常来说会有一些算法上的优化，工程上的改进，数据分析之类的工作。在这种情况下，首先需要有一定的业务直觉。而业务的经验积累需要通过各种各样的基础数据提取，在海量的数据分析工作中逐渐积累的。在这种情况下，提取数据的工具就是必须要掌握的，例如SQL等。其次，分析数据的工作也是必须要具备的，无论是使用SQL来进行分析，还是使用Python来做数据分析，都是自行编程解决的。再次，在从事机器学习方向的时候，不可避免的就会进行算法的效果对比。而在这种情况下，算法的效果对比是需要机器学习从业者通过写程序来实现的。最后，工业界的算法通常来说都强调上线，如果能够自行把离线，上线，效果验证，ABTest都做完，其实是最好的状况。在这种情况下，通常Python就不太够了，需要使用C++或者Java等其他编程语言。因此，熟练使用多种编程语言也是一个算法工程师的能力。常用工具在互联网公司里面笔者用过的机器学习工具大概有这几个：XGBoost：做分类的工具，提供离线的Python训练和在线的C++调用功能，方便机器学习从业者训练模型和线上部署；不仅在推荐场景可以用，在安全，运维等领域都有着用武之地。Tensorflow：这个也不用多说了，深度学习的经典工具之一，离线训练和在线服务都是不错的。ScikitLearn：单机版本的机器学习工具。方便学生在校学习知识，文档详细感人，关键是还开源。其实在工业界，如果数据量不大的话，其实用ScikitLearn就基本上够用了。Pandas：表格类数据或者时间序列数据的经典工具。尤其是在时间序列的处理上面有特别独到的优势，应该还有其他功能，但是笔者暂时了解不多。Pandas的接口和函数特别多，每次遇到问题的时候可以搜一下，其实比自己重头写好得多。Spark：在大数据的情况下用得比较多，通常是推荐系统一类的，海量样本的前提下，单机版的模型根本搞不定，因此会用分布式的工具。SQL：提数工具。如果不掌握这个的话，基本上什么都做不了。。。。。FbProphet：稍微小众一些，Facebook的开源工具之一，在时间序列预测的场景下才能用到。工作感受给自己压力。一般来说，转专业求职是一个艰苦的过程，但是入职之后的生活则更加辛苦。因为公司的考核是每半年甚至两个月就一次，所以，在这种情况下，任何人都需要有一个上手的速度。有的人因为在学校学过相关的内容，或者之前实习过，因此上手的时候比较快；但是有的人转专业就面临上手慢的情况。其实这些对于应届生来说都可以理解，毕竟所有的人都需要有一个适应的过程。在这种情况下，在工作的初期一定要给自己一定的压力。意思就是说：在刚工作的第一年，每三个月就要让自己有一个飞速的提升；在工作的第二年，每半年就要让自己有一个提升；后续的话，每一年都要让自己有提升才是关键。因此，无论是本专业还是转专业的同学，都建议在前两年工作的时候，多给自己一些压力，只有这样，才能够让自己有更好的进步空间。对业务的理解。公司里面有很多东西并不是直接使用开源代码就能够发挥作用的，在公司里面无论做什么事情，最重要的一点就是对业务的理解。在对业务的理解方面，老员工相对于新人来说确实有着不少的优势。其次，在做业务的过程中，通常都会经历很多的坑，无论是别人主动挖的，还是自己踩坑踩出来的，都是自身宝贵的财富和经验。而这些经验只能够通过靠做大量的业务来获得。如果要想长期保持自身的优势，通过长期的训练和学习确实是一个有效的办法。无论是天才还是普通人，要想提升自身的技术，不花一定的时间去学习是不可行的。因此，无论在任何时候都不能够放弃让自己学习和充电的机会。勇于接受新的挑战。公司里面除了已有的项目之外，通常来说都会开启各种各样的新项目，在这种情况下，如果有机会做新的项目，也就是别人没有做过的项目。这种机会已经要把握住，因为对于新人来说，能够接触全新的项目肯定是好过维护已有的项目的。但是几乎所有的人都是从维护旧的项目开始的，只有旧的项目做好了，才有机会拿到新的项目。不要永远抱着已有的方向不放手。在公司里面，业务方向总会或多或少的发生变化，随着部门的调整，方向的变化，所做的内容总会发生一些变化。在工作的时候，最好不要抱着我就是来做这个方向的，除了这个方向之外其他的内容我一概不想做。因为当时的工作岗位未必能够提供你想做的方向，但是说不定能够提供其他的研究方向。有的时候，在公司里面，根据方向的变化来调整自己的工作内容也是一个必要的技能。而且，在公司的时候，一定要多做一些有挑战的项目，只有通过这些项目，才能够让自己的技术壁垒更加深厚。当然，在求职的时候，每个人都有着自己的想法和选择，所以，在求职的时候，是可以选择一个自己喜欢的方向来做的。经验总结通常来说，在干了两三年算法工程师之后：（以下是从其他地方看到的小段子，出处忘记了~~~）能够熟练写各种脚本；80%的时间在写脚本；能够说出几种机器学习算法的名字；轻松完成各种脏活累活（叫小弟做）；对无法解释的结果已经习以为常，能够强行解释一波，让领导信服；调参前，都会去寺庙烧柱香；桌上堆着很多崭新的技术书籍，没怎么翻过，大概都会有一本叫做《统计学习方法》的书。