好的算法模型需要有大量的数据来“喂”,哪怕最开始的算法模型很简单很不合理,通过大规模的数据且结合一些方式方法也能“喂养”出好的模型来。
所以,如何利用现有数据成了最初的关键点。
1.如何割裂数据
首先,我们需要将现有数据划分成三类:训练集(Training set)、开发集(Development set)、测试集(Test set)。
训练集(Training Set):用于训练模型;
开发集(Development Set):用于决定算法模型,包括调试算法模型的参数、对模型进行错误分析、调整模型特征等;
测试集(Test Set):用于评估算法模型,主要针对算法的泛化能力;
训练集得到的算法模型不是最优的,需要通过开发集进行调整,调整后的算法是否能适应未来的数据特性需要通过测试集来验证。建议三类数据的割裂比例为:6:2:2,也可以动态调整。
2.三类数据的特性
训练集的数据特征分布可以与开发集和测试集不同,但开发集和测试集的数据特征分布要一致。开发集和测试集的数据特征分布代表了数据未来发展的趋势。
开发集的数据特性应该具备全局性,比如一款识别猫的APP,在取样时选择了来自美国、中国、印度和希腊,此时开发集应该涵盖这四个地域的样本。
开发集和测试集的数据特征分布必须一致,若不一致会带来额外的不确定性:算法在开发集表现良好,在测试集表现糟糕,算法有可能是在开发集上过拟合了,也可能是测试集很难预测……此时,利用开发集对算法进行的任何优化都会徒劳。
3.数据集的大小
开发集需要足够大,大到能鉴别模型之间的优劣。如A分类器的识别率是90%,B分类器的识别率是90.1%,这0.1%的差异足以影响收入。此时,如果样本只有100个,那就不能很好的区别,但有海量的数据比如10000个,就能很好的甄别出这0.1%的差距。
一般的,针对大规模数据训练,开发集的规模需要在1000~10000;
测试集的容量需要满足针对算法整体能给出一个高可信的评估。一般,随着样本数据的增大,开发集和测试集的绝对数量是递增的,但是占比却未必上升,只要足够能够评估算法模型即可。