交叉验证时要注意的几点

无论哪种机器学习的算法,检测的最终标准都是其能否泛化。而检测的方式,则是交叉验证。交叉验证是一个需要讲究细节的环节,在交叉验证,你用的是正确的版本吗?中,我区别了两种不同的交叉验证的方式。而今天想谈谈交叉验证设计上的其他问题。

假设你在做一个推荐萌猫照片的app,其核心的算法是用深度神经网络从一堆照片中找出下面这样的图

/pic/1_4kblJfu1UrF5R2V63c8TmElhrSzCog.png

在这种情况下,你该怎样划分你的测试集和训练集了。对于不熟悉的读者,训练集是提供给机器用来寻找规律的数据,而训练集则是用来检测算法给出的预测是否靠谱的。如果你划分不当,就会出现这样的问题。假设你的训练数据全部是美国的猫,而测试数据则全部是印度的猫。那么也许你训练出的神经网络会只适合检测米国的喵,而忽略其他国家的喵。从这个案例中我们总结道,在做交叉验证的时候,测试集和验证集的分布要是一致的。

然而分布一致是一个很模糊的标准。具体来说,你考虑了猫的品种,避免了训练集中只有花狸猫,而测试集之中只是波斯猫,也就是说你保证了不同品种的猫在训练集和测试集中分布一致。然而,你可能会没有意识到下图这样的小猫,从而导致了你训练的分类器不适合标出小猫,可偏偏小猫是最萌的最受喜欢的。之所以会出现这样的问题,是因为你不是猫的专家,无法设想出对猫进行分类的多种维度。这也是说为什么机器学习项目的成功必须要结合应用领域的专业知识的原因。机器学习算法的研发,永远需要人的参与,只有懂得相关领域的人,才能找出对数据进行分类的不同维度,从而避免出现训练集与测试集分布不一的情况。

/pic/2_lljP7PTyjPW4GHUeBCftdCD4rEYgag.png

然而,了解一项应用的使用场景对设计交叉验证的细节也是很关键的。还举之前的那个应用。假设你的分类器给用户推送了一张小黄图,但是小黄图上有一只喵。这样的推送是你不需要的。这时你应该做什么?你首先要意识到会出现这样的情况,然后要么调整你训练出的神经网络,让其能识别出小黄图,从而避免这样尴尬的情况。要么就需要再训练一个识别小黄图的神经网络,过滤最初用来作为筛选的数据。这个例子用来说明在设计交叉验证时,你需要对需求有足够的了解,对可能出现的情况有全面的设想,如果你在设计交叉验证的时候,在测试集和训练集中都引入了小黄图+猫的类型,那么这样的问题就能在测试时识别出来。

在设置好了测试集和训练集之后,你需要做的是找出一个指标,来帮助你快速的评价不同的方法/参数,以实现迅速的迭代。但问题是评价的标准往往有很多个,且往往不再一个维度。对于不同的应用领域和问题,这个用来评价的指标应该考虑多个因素。还用推荐萌猫的神经网络作为例子,你评价时不止要考虑分类的准确度,还要考虑这个神经网络的运行所需的时间和资源,毕竟你的APP每天都会给用户推荐猫的照片,是一个持续的需求,再细想,如果你的APP 每天不止给用户推荐一张猫的照片,而是推荐一组,那么这一组照片中最好能够不全是小猫或者某一组猫。如何将这些评价标准组合成一个一维的指标,是需要用户去在摸透了实际需求后去考虑的。

对一个模型的评价,也会如同对测试数据的分布一样存在多个维度。有的是眼前要解决的需求,有的是立足长远的考量。还是萌猫照片推荐的问题,另一个评价的标准是模型的迁移能力,你的模型能否在不做大修改的前提下应用到推荐狗的照片。这是横向的迁移,你的模型能否应用到只推荐某一种狗,比如只推荐雪橇犬或者牧羊犬的照片,这是纵向的迁移。只有在模型一开始的设计和选择时就考虑到了这些未来的应用场景,才能在一开始不做出短视的选择。

更多阅读

Logistic 回归101

算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

说说随机森林