小样本情况下使用SVM的思考

今日在验证测试数据时,发现当采用cross_val_score进行交叉验证时,对于随机分配的测试集比例越大,正确率便越高,而测试集越小,平均正确率就越有可能低。 使用svm推导模型时,有两个大坑,一个是train_test_split后,当数据量不够时,学习到的样本分布差异很大,极不稳定,如何才是最优的train_test_split分法,很难确定,然后就是模型的泛化能力的评估是否可靠,这一块又与train_test_split所划分的数据集相捆绑,这直接导致了,偶尔在测试集上拿了高分,也只是一种假象。 这是因为SVM实际上拟合的是数据分布,在样本中学习到的也是分布,而样本数量在随机抽样时,分布的所呈现的结构也是不同的。 当测试集小时,有时集中推断错误的数据会集中在一起,因此便会导致在测试集上的平均表现欠佳。 因此在卷积里在图像识别时,对于图像可以进行不同分辨率的采样,其实目换就是为了得到指向一个概念的不同分布,通过这样的训练能够提升神经网络的泛化能力。 SVM的过程是直接一次性fit的,因此很难进行调整与改善,因为它每一次fit的都是整个分布的情况,难以实现渐进式学习那样的调整。 随机森林相对来说,因为有分裂子树进行局部抽样的学习机制,所以相对更容易不过拟合,但整体效果是否会更好,也看数据的实际情况。 因此对于SVM拟合的数据集,应当做出一假设,即是在已有的数据中,如果能抽样出来的子分布集中,恰好有一个泛化性能很好的分布存在,那么通过网格搜索参数的方法,是能很有可能将它搜索出来的。 而更好的泛化性,意味着,比如在实际的推断任务中,假如存在有一个完整的数据分布话,这个泛化性能好的子集分布,整体上会与这个完整的数据空间分布更为相近。 因此,如果整个数据集合是G,而近似的这个子集为g,而从G中抽出来的其它集合,如果比较小的话,例如a,b,c,那么呈现出来的分布,便不一定会与g相似。 显然比如一个整体分布是{0,1,0,0,1,0,1,0,0,0},按0.33的比例抽取出来的分布可能是{0,0,0}与{1,1,1},这也就意味着如果数据集不大,并在例较小的测试集上,进行交叉验证,得出来的分数会出现不客观地偏低的情况。 因此交叉验证取K折的话,需要进行测试所取的数据的量,应当与原有训练集的量差不多才能更好地客观反映accuracy,roc,f1之类的评分。 根据实验来看,例如用0.8比例的数据作为训练集,如用随机森林达到90%正确率,而再用全集取随机抽取0.8的比例数据集做K折验证,结果会下降到78%左右,这与大多数时候,实验时数据模型效果看起来不错,但上线后会损失10%~20%的情况相近。

Read More