对于一个新问题,事先是很难知道用什么方法解决它是最合适的。即使机器学习经验丰富的研究员也需要尝试许多,才能得到令自己满意的东西。在构建机器学习系统时,我经常会:
- 首先有一些如何构建系统的想法(idea)。
用代码实现这些idea。
进行实验(experiment),来告诉我 我的idea工作的如何。(通常我前几个idea效果不是很好)但是基于这些想法的结果,我会返回去产生更多的idea。并不断的迭代。
对于一个新问题,事先是很难知道用什么方法解决它是最合适的。即使机器学习经验丰富的研究员也需要尝试许多,才能得到令自己满意的东西。在构建机器学习系统时,我经常会:
用代码实现这些idea。
进行实验(experiment),来告诉我 我的idea工作的如何。(通常我前几个idea效果不是很好)但是基于这些想法的结果,我会返回去产生更多的idea。并不断的迭代。
分类准确率是单一数字评估指标(single-number evaluation metric)的示例:你在你的开发集(或测试集)上运行你的分类器,然后得到样本分类正确的比例(fraction)(单个数字),根据这个指标,如果分类器A的准确率为97%,分类器B的准确率为90%,那么我们认为分类器A更好。
相比之下,精度(查准率)(Precision)和召回率(查全率)(Recall)[3]就不是一个单一数字的评估指标:它给出两个数字来评估分类器。拥有多个评估指标使得算法之间的比较更加困难,假设你的算法表现如下:
分类器 精度 召回率
开发集应该足够大,大到可以检测出不同算法之间的差异。比如:如果分类器A的精度为90.0%,分类器B精度为90.1%。如果你的开发集只有100条,那么你可能检测不出这0.1%的差异,与其它机器学习的问题相比,100条数据很小,常见的开发集数据规模在1000到10000条之间。数据量越高,模型之间的差异越明显。[2]
对于一些成熟的重要应用来说(如:广告推荐,网页推荐,产品推荐等)。我经常看到团队在为0.01%的性能提升而奋斗,因为这直接影响到了公司的利润。在这种情况下,开发集的数据量可能远远超过10000条,只为了对算法进行改进。
根据市场情况,由于存在不同地区的用户,你可以把你的猫咪APP图片数据分为四个区域:
(1) 美国
(2) 中国
(3) 印度
(4) 其它地区
为了生成一个开发集和测试集,你可能会随机的分配两个地区的数据到开发集中,另外两个作为测试集。比如:来自美国和印度的数据作为一类,来自中国和其它地区的数据作为另一类。
一旦你这样划分了数据集,你的团队可能会主要关注提高在开发集的上的性能。开发集应该能够正确的反映出你的整体情况,而不是局部情况。比如这里主要提升了APP在美国和印度区域的性能,而没有考虑到中国和其他地区。
其次,开发集和测试集如果来自不同分布还会导致另一个问题:你团队进行开发后会发现,算法在开发集(美国,印度)上的效果会非常好,但是到了测试集(中国,其它地区)上就会变得很差。我曾经看到过很多人都是因为这个问题导致白费了很多努力,所以我不希望这发生在你的身上。
举一个例子,假设你团队开发的系统在开发集上的效果非常好,但是在测试集上却表现的非常糟糕。如果你的开发集和测试集来自于同种分布,那么你可以立刻判断,你的算法在开发集上过拟合了。比较简单的解决办法是输入更多的数据进行算法性能提升。
但是如果开发集和测试集来自不同分布,那么你可能就比较不好找原因了,可能会出现以下错误:
让我们回到之前关于猫咪图片的例子: 你开发了一个移动APP, 用户可以上传许多不同的图片到你的APP上,你想识别出用户上传的图片中所有包含猫咪的图片。
你的团队下载了很多图片数据集,包含猫咪图片(正样本,positive example)和非猫咪图片(负样本, negative example)。他们将这些数据划分为70%的训练集,30%的测试集。当使用这些进行算法训练时,效果非常不错。
但是将算法(分类器)部署到APP的时候,发现效果却非常的糟糕!
发生了什么?
你发现用户上传的图片和你团队下载作为训练集的图片不同。用户使用收集拍摄的图片分辨率更低,模糊,而且照明效果较差。由于你的训练/测试集来源于网站上的图片,你的算法没有很好的把智能手机图片一般化。
大数据时代之前,在机器学习中人们对数据集的一个常见划分规则为:将数据集划分为70%/30%的训练集和测试集。但是在越来越多的应用(比如上面的例子)中,收集的数据与训练数据不同,这个时候该规则就不适用了。
深度学习(神经网络)中许多的想法都已经存在了几十年。为什么今天这些想法火起来了呢?
促进机器学习发展的因素主要有两个:
• 数据量越来越多. 如今人们在数字设备(电脑,移动设备)上所花费的时间相比以前多得多,这些活动产生了大量的数据,我们可以使用这些数据来训练我们的算法。
如果你已经学习了机器学习课程(如我在Coursera上的Machine Learning MOOC),或者你拥有应用监督式学习的经验,你应该可以理解下面的内容。
我假设你熟悉监督式学习(supervised learning): 使用带有标签的训练样例(x,y)学习一个从x映射到y的函数。监督式学习包括线性回归(linear regression),逻辑回归(logistic regression)和神经网络(neural networks)。机器学习的形式有很多种,但今天大多数的机器学习应用都是监督式学习。
我会经常提到神经网络(neural networks)(也被称为“深度学习(deep learning)”),而你只需要对他们有一个基本的了解即可。
如果你对这里提到的概念不是很熟悉,你可以看一下Coursera上面的Machine Learning课程(课程网址:
http://ml-class.org )前三周的视频。
在读完本书后,你将会对如何制定机器学习项目中的技术方案有一个深刻的理解。
但是你的队友可能不会理解为什么使用你制定的技术方案,也许你想和你的团队定义一个评估指标,如果他们不信服你,你该怎么说服他们?
这就是为什么我把章节设置的这么短的原因,这样你可以把你想让队友知道的那几页打印出来给他们看。
面对几个不同的选择,对这些选择的排序可能会对团队的生产力产生巨大的影响。通过帮助你的团队做出一个最优的选择,我希望你可以变为团队中的大佬!