最近会面试一些“做过机器学习”的人。但是经常遇到的很让我无语的一种情况是,在问他们一些机器学习的相关知识的时候,对话往往是这样的:
-- 呃, 你用过 logistic 回归?
-- 嗯,是的。
-- 能跟我说说 logistic 回归是怎么回事么?
-- 我不知道,我用的是 XX 包,把数据整理成一个什么样的格式丢进去,然后它就出结果了……
确实,现在 Machine Learning 的 toolkit 非常多,基本上可以想得到的,都能找到对应的开源项目。如果你在BAT这些公司,说不定这些 toolkit 连图形化界面都给你提供了。这大大降低了我们的使用成本。但是,如果你认为自己“做过”机器学习的话,只会调用别人的工具显然是不够的。一直都一帆风顺还好,如果你的数据扔进去,吐出的模型文件并不能像你预想的那样 work 的很好的时候,如果你只会调用别人的工具,你怎么知道问题出在了哪儿呢?
所以其实我觉得如果做机器学习的话,一些基础还是要打好的。就像不了解对象模型的人,仍然可以很欢畅地写 C++ 代码(也许都写成了C),但是恐怕不能说自己熟悉 C++。而机器学习是建立在数理统计、线性代数、信息论和决策论上的,打基础的话,应该也从这些知识开始。尤其是机器学习这个领域发展到今天,各种算法及这些算法的种种变体非常之多,很少有人能够把这些算法全都摸得门儿清。但是,在有了一定的基础知识之后,看懂一个算法应该不会成为太困扰你的事儿,看懂了之后,这个算法的优劣、使用范围等也应该会有大致的了解了。
如果要入门机器学习的话,有两本书推荐一下。一本是Mitchell的《机器学习》,这本书现在机器学习中一些最常用的、经典的算法,包括 Regression,Classification,Cluster,EM,简单的神经网络等等,顺带穿插讲述了一些基本概念,如最大似然估计、误差函数、梯度下降、后向传播算法等,Andrew Ng 在 MIT 的机器学习课程,也是以这本书为蓝本的;另外一本书是《数据挖掘:实用机器学习技术》,这本书有意思的地方是搭配了一个开源的、带GUI界面的机器学习工具Weka,并且带一些数据集合,可以亲自动手试一下,避免入门的时候太过枯燥而产生畏难情绪。这两本书大致看过之后,可以看看Bishop的神书《Pattern Recognition And Machine Learning》……的前两章,尝试弄清下面的几个问题:
- 统计学的基础:先验,后验,大数定理,bayes rule,marginal probability,等等;
- 如何度量信息的有用程度:信息熵,交叉熵和互信息都是什么?
- 什么是点估计?什么是区间估计?
- 最大似然估计,最大后验估计,Bayesian估计之间有什么样的联系和区别?
- 什么是过拟合?如何避免过拟合?什么是正则化?试着使用MLE和MAP分别推一下曲线拟合中没有正则化(不带惩罚项)和L2正则化(带有针对参数平方和的惩罚项)的error function。
……等等。
然后呢?然后你就可以愉快地玩弄各种 toolkit,撸各种 paper 去了。(至于要发各种paper的童鞋……对不起哪不在我的知识范围之内了T.T)