对于SVM中遇到的非均衡数据集,可以采用以下策略:
假设有4类样本,比如,第一类有500个,第二类有300个,第三类有600个,第四类有200个,那么,可以通过SVM的class_weights(CvSVM中有该参数)来进行均衡,具体如下,
1 求所有样本和,在这里为1600
2 求每一类样本数与总数的比值,如在这里为 500/1600=0.3125,
300/1400=0.817,
600/1600=0.375,
200/1600=0.125,
3 求各个小数的比值,并转化为整数,在这里是
5:3:6:2,
对于opencv中的SVM可以采用如下的方式给class_weights进行赋值:
CvSVMParams SVM_params;
float a[4]={5,3,6,2};
CvMat mat=cvMat(1,4,CV_32FC1,a);
SVM_params.class_weights=&mat;
在这里,class_weights是C_SVC中的可选权重,赋给指定的类,乘以C变成
class_weights*C。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类的误份类数据的惩罚项就越大。惩罚项越大,代表了其越不能够容忍错误。