作者:赵鹏
链接:https://www.zhihu.com/question/27292215/answer/133141387
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
我是一个从传统行业转行到数据挖掘的应届生,我从我的角度回答一下这个问题吧,希望能对其他的同学有帮助,不过毕竟是个人经历,有一定的局限性,还请大家以批判的眼光看待这篇回答。
1. 前言
答主是2017应届毕业生,已签美团的数据挖掘岗,本次秋招一共投递了39份简历,做了19场笔试,面了12家公司,从一开始的完全不自信,到被折磨的要死但还是坚强的活下来,到最后的各种坦然,成长了许多。
答主本硕均是机械专业,在校学习成绩中等偏上,原本想从事嵌入式方向的工作,无奈学了两个月被导师叫停,说没有项目学完就忘,遂作罢。研二上在没有目标的情况下系统的学习了C++和数据结构,入门了Python。研二下开始学习机器学习相关知识,从四月下旬开始出差给导师做无聊的项目,白天出去搬砖,晚上回来学习,暑假没回家继续学习(暑假其实就两周),直到八月底开始找工作。
整个自学的过程一年左右,主要内容有计算机专业的基础知识,基础的机器学习知识,由于时间的原因,没有学hadoop和spark,这点确实是短板,各位如果有时间,最好能看看。
2. 基础知识自学
面试的时候一般先问基础知识:编程语言,数据结构和算法,操作系统和网络编程(数据库相对而言问的比较少),前两部分非常重要!如果前两部分非常熟悉,后两部分稍微会一点都能过面试,但是前两部分只会一点或者不会,九成九会跪在一面。答主就是前两部分比较熟悉,后两部分背了背常见的面试题,所有的面试都走到了终面。
2.1 编程语言
编程语言常问的是C/C++和Java,答主学的是C++。我首先把C语言圣经《C程序设计语言》详细的看了一遍,然后系统的看了《C++ Primer》(这本书已经出到第五版了),如果其他同学时间充裕的话,可以再把《Effective C++》看一下。
此处说明一下,看书不是简单地“看”,而是不看书能手敲出书上的例子,能独自做课后题。在这个过程中,常常会发现自己写的代码和书上代码,参考答案的代码有一些不一样,重点分析不一样的部分,会有很大的收获。我常常用笔抄一些关键代码,然后在纸上画出一个章节的简单思维导图,默记一会,把纸扔掉,最后把没有记住的知识点总结在为知笔记中,每过一段时间复习一下。
如果学的是C++,学完以后,要能回答下面的问题:内存怎么管理,const有什么用,引用和指针的区别,虚函数和纯虚函数,虚函数表,继承,重载和多态,模板函数,模板类,容器等相关知识。
2.2 数据结构和算法
网上大多人推荐的是《算法导论》或者《数据结构与算法分析(C语言描述)》,《算法导论》确实是一本很牛逼的书,但是真的太难啃了,不适合“快速学习”,这里我推荐《算法(第4版)》,这本书使用Java讲解常见的算法,但是完全木有关系,Java零基础的我看起来没有任何压力,因为该书几乎没有用到Java的任何特殊语法。
仅仅看《算法(第4版)》是不够的,还需要《剑指offer》和《程序员代码面试指南》,《剑指offer》一定要多看几遍,里面的题目真的被考烂了,被问到原题的概率很大。《程序员代码面试指南》属于提升书籍,里面按照专题把题目归类了,强烈建议把动态规划专题看一遍。
如果只会算法而不能把代码写出来,也不行,锻炼这个能力只能靠OJ了。这里推荐去牛客网刷题,可以先刷《剑指offer》或者学习《直通BAT面试算法精讲课》,然后再刷leetcode专题,刷leetcode的时候可以按照网上推荐的顺序刷,非常舒服(第一次做的时候,可以先跳过hard,最后再做)。
数据结构和算法常考的是堆,栈,排序,链表,二叉树和动态规划等,相关的问题多练练,面试的时候才能写得比较快。有句话这么说,考试并不是让考生在考场上把不会的题做出来,而是检查考生会什么,不会什么,仅此而已。面试的时候,如果反应快一点,能给面试官留下很好的印象。
2.3 操作系统和网络编程
这里答主没怎么学,时间不够,看了几章《深入理解计算机系统》就看不下去,罪过。。。
后来就去搜索常见的面试题:进程和线程的区别有哪些?进程/线程间如何通信?如何防止线程死锁?TCP三次握手四次挥手是个什么步骤?我把这些问题的答案背下来,等面试官问我的时候我再背出来,然后坦白自己没有学过操作系统和网络编程,这些都是我在网上找答案背的,再深一点我也不会了。一般情况下,面试官的表情会比较诧异,不过也就不再讨论这个话题了。
这部分怎么学我不清楚,各位还是咨询计算机专业的同学或者看看别的答案吧。
2.4 个人学习历程
答主花了半年时间(研二上)点了编程语言,数据结构和算法的技能点,顺道点了一些别的小技能点。这段时间主要看了《C++ Primer》,《算法(第4版)》,《Learn Python The Hard Way》,《鸟哥的Linux私房菜》,按照廖雪峰的教程把git学了一下,开始用markdown写博客。
3. 机器学习自学
今年的机器学习很火,稍微大一点的公司都招这个方面的人才,我的感觉大多人都是自学的,貌似本科开这个专业的学校很少?
个人理解的机器学习主要有三个方向(按照岗位要求分):数据挖掘,自然语言处理和深度学习。数据挖掘主要是搜索排序,反作弊,个性化推荐,信用评价等;自然语言处理主要是分词,词性分析等;深度学习主要是语音和图像识别。
(此处经知友@吴文君提醒,数据挖掘是一个较为宽泛的概念,包含机器学习,自然语言处理和深度学习,我在这里把概念搞混了,大家不要被我误导哈)
我找的是数据挖掘方向,所以就说说这个方向的个人学习经验吧。
主要准备两个方面,一方面是掌握常见机器学习算法原理,另一方面是应用这些算法并解决问题。
3.1 常见机器学习算法
和大部分人一样,我是看吴恩达老师的《机器学习》视频入门的,看了两遍,说实话第一遍自己以为懂了,看第二遍的时候才发现第一遍的懂了是“假懂”,第一遍懂得就是皮毛。吴恩达的视频有两个版本,一个是网易公开课在教室讲课录制的版本,另一个是在自己办公室录制的版本,我看的是在办公室录制的版本,看了网易公开课版本的目录之后,个人感觉网易公开课的要难一点。
看完视频以后,需要自己动手实践加深理解,这里我主要看《机器学习实战》和《统计学习方法》,前者全是实践没有理论,后者全是理论没有实践,所以结合起来学习非常棒。我主要按照《机器学习实战》的目录学,涉及到什么机器学习模型,就去《统计学习方法》中看该模型的数学推导及证明,然后把《机器学习实战》上的代码敲一遍,验证一遍。
后来市面上出了一本很好的机器学习教材:周志华老师的《机器学习》。我现在的建议是主要按照《机器学习》的结构走,《机器学习实战》和《统计学习方法》作为辅助,《机器学习实战》有对应模型的代码就敲一遍,没有就算了;《统计学习方法》的证明一般比《机器学习》更深一点,有对应的证明就看,没有就算了。
上面三本书吃透,基础就差不多了,但是面试的时候会发现,除了DT,LR,SVM问得比较多之外,随机森林和GBDT问的也非常多,以及参数如何调整,模型如何评价等等。这些东西只能求助于搜索引擎和论文了,暂时没有别的系统的学习方法。
补充一下,推荐算法问的也比较多,把项亮的《推荐系统实践》好好看就行了。
学完这个部分应该会的问题,我放在了最后,以免影响排版。
3.2 应用这些算法并解决问题
在实际的工作中,硕士生其实大多是用算法而不是发明算法,所以还得学会怎么用算法解决实际问题。这里建议参加Kaggle的比赛,都是比较实际的问题,而且还有排名,面试的时候也有一定的说服力。
这里主要学一些Python的包就行了,如numpy,pandas,matplotlib和sklearn等,推荐一本五星级好书:《利用Python进行数据分析》。
这一部分关于特征处理的问题问的比较多,比如怎么选相关特征,如何清洗数据,以及选取什么样的机器学习模型。
3.3 个人学习历程
机器学习部分答主也花了半年的时间学习(研二下),看了《机器学习实战》和《统计学习方法》,《机器学习》只看了几章,《利用Python进行数据分析》看了一大半,《推荐系统实践》看了一半。机器学习相关的东西得经常复习,尤其是推导部分,SVM的推导我每隔几周复习一次,每次都有新的收获。
自己写了一个豆瓣爬虫,爬了豆瓣11W多网页共4W本书,利用PyQt写了一个界面,使用基于物品的协同过滤算法推荐书籍。
这段时间还走了点弯路,报了个课程,写了一个图片分享网站,学了一些前端和后台的东西,如HTML,CSS,JavaScript和Flask等等,本来是想学完这个,把书籍推荐的那个项目从单机版做成网页版,服务于他人,结果根本没时间,做不到那一步,面试也从来没问过这些东西,囧……
4. 其它
做数据挖掘不可避免的要接触大数据,目前常用的大数据框架就两个,Hadoop和Spark,如果会一个就很有优势,在美团实习的同学说这两个都用……所以建议看完C以后,不学C++,学Java,因为Hadoop的原生开发语言是Java,资料多;相应的Spark的原生开发语言是Scala,不过也有Python的API。
具体学Hadoop还是Spark,学Java还是Scala,大家还是在拉勾网上面看自己心仪岗位的要求。反正答主目前是在恶补Java和Hadoop,希望在入职前补上短板。
5. 校招
每年3、4月份各大厂会招很多实习生,尽量出去实习,面试的时候有实习经历很有优势,哪怕公司比较小,只要你实际上在认真的做项目就可以了,有人带怎么都比自学好。答主原本计划出去实习,但是导师根本不放,心好累。
面试主要有两点要说,一是一定要先去面一下不想去的公司,熟悉一下面试流程和套路,二是一定要多看面经。答主花了两天看了近200篇机器学习岗的面经,把问题和答案都整理了一下,收获很大,后面面试碰到了好多原题。
对于答主来说,最难的不是面试,而是笔试,笔试范围广,难度大,今年要是不能全AC,进面试很难。怎么办?想办法内推吧,避免参加笔试,内推从7月份就开始了,多找学长问问,没有学长,就去论坛上发帖求内推,要不然9月份笔一次挂一次,会严重怀疑人生。
6. 推荐书单
先说答主看过的,质量保证:
C/C++:《C程序设计语言》,《C++ Primer》
数据结构和算法:《算法(第4版)》,《剑指offer》,《程序员代码面试指南》
机器学习:《机器学习》(周志华),《机器学习实战》,《统计学习方法》,《推荐系统实践》
Python:《Python核心编程(第二版)》,《利用Python进行数据分析》
其中《Python核心编程(第二版)》有点厚,像字典,不适合遍历,网上都推荐《Python基础教程》,应该也不错。
没看过的,但是评价也不错的:《Effective C++》,《STL源码剖析》;《编程之美》,《编程珠玑》;《数据挖掘导论》,《集体智慧编程》,《模式识别和机器学习》,《凸优化》;《深入理解计算机系统》,《操作系统》,《计算机程序的构造和解释》,《代码大全》,《Head First 设计模式》,《代码整洁之道》,《程序员的自我修养》。
这些书足够看3-5年了,233~
7. 小结
一定要耐得住寂寞,守得住孤独,没有人和你讨论问题,就去网上求助
一定要动手实践并且随时做笔记,要不然忘得很快
OJ尽早开始刷,最晚7月开始,9月前至少做完200~300道题
能实习就实习,不能实习一定要参加Kaggle比赛
常见的机器学习模型都能推导,会调参,能说优缺点,能和别的模型比较
彩蛋——常见机器学习问题
什么是bias和variance
k折交叉验证中k取值多少有什么关系
分类模型和回归模型的区别是什么
为什么会产生过拟合
如何解决过拟合
写出信息增益,信息增益比和基尼系数的公式
写出LR的目标函数和损失函数
LR和SVM的异同
推导SVM
SVM在哪个地方引入核函数
常用的核函数有哪些,说说它们的特点及调参方式
随机森林的学习过程
随机森林的优缺点
GBDT和随机森林的区别
如何判断决策树过拟合
线性分类器与非线性分类器的区别及优劣
特征比数据量还大时,选择什么样的分类器
L1和L2正则的区别,如何选择L1和L2正则
多分类怎么处理
如何进行特征选择
吐槽一个推荐算法,并提出修改意见