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等(。可能出了什么问题,如何克服这个问题?

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

可以根据以下示例设置类权重。

A类(n个记录;优势类(到B类(m个记录;少数类(的错误分类权重可以是n/m。根据严重程度,B类和A类的分类错误权重可以设置为1或m/n,这是你想强加给学习的

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

根据文件:

对于两类学习,如果指定成本矩阵,则软件通过合并成本矩阵中描述的处罚。因此,成本矩阵重置为默认值。有关关系和BoxConstraint、Cost、Prior、Standardize和权重,请参见算法。

曲线下面积(AUC(通常用于衡量应用于不平衡数据的模型的性能。绘制ROC曲线也很好,可以直观地获得更多见解。对于这样的模型只使用混淆矩阵可能会导致误解。

统计和机器学习工具箱中的perfcurve提供了这两种功能。

最新更新