SVM对于不平衡数据集的性能不佳-如何改进?

时间:2018-12-12 22:58:19

标签: matlab machine-learning classification svm

请考虑数据集A,其中包含有关二进制分类问题的训练示例。由于数据集高度不平衡,因此我使用了SVM并应用了加权方法(在MATLAB中)。我将权重与每个类别中的数据频率成反比。这是在训练中使用命令完成的

 fitcsvm(trainA, trainTarg , ...
            'KernelFunction', 'RBF', 'KernelScale', 'auto', ...
            'BoxConstraint', C,'Weight',weightTrain  );

我已经使用10倍交叉验证进行训练,并且还学习了超参数。因此,在CV中,数据集A被分为训练(trainA)和验证集(valA)。在CV循环之外进行训练之后,我在A上得到了混淆矩阵:

80025 1
0 140

其中第一行用于多数类,第二行用于少数类。仅有1个假阳性(FP),所有少数族裔类别的示例均已正确分类,给出真实阳性(TP)= 140。

问题:然后,我在新的看不见的测试数据集B上运行了训练后的模型,该数据集在训练期间从未见过。这是在B上进行测试的混淆矩阵。

50075 0
100 0

可以看出,少数派根本没有被分类,因此权重的目的失败了。尽管没有FP,但SVM无法捕获少数类的示例。 我尚未在B上应用任何权重或平衡方法,例如采样(SMOTE,RUSBoost等)。有什么问题以及如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

可以设置类别错误分类权重,而不是样本权重!

您可以根据以下示例设置班级权重。

将A类(n个记录;显性)分类为B类(m个记录;少数类)的错误分类权重可以为n / m。 错误分类权重对于B级,您可以根据学习的严重程度将A级设置为1或m / n

c=[0 2.2;1 0];
mod=fitcsvm(X,Y,'Cost',c)

根据documentation

  

对于两类学习,如果您指定成本矩阵,则   该软件通过合并以下内容来更新先验概率   成本矩阵中所述的罚款。因此,成本矩阵   重置为默认值。有关关系的更多详细信息和   BoxConstraint,费用,优先级,标准化和   权重,请参阅算法。

答案 1 :(得分:1)

Area Under Curve (AUC)通常用于衡量应用于不平衡数据的模型的性能。绘制ROC曲线以从视觉上获得更多见解也很好。仅将混淆矩阵用于此类模型可能会导致误解。

统计和机器学习工具箱中的

perfcurve提供了两种功能。