倾斜的多类数据

数据挖掘 分类 支持向量机
2021-09-17 07:13:00

我有一个数据集,其中包含 50 个类的约 100,000 个样本。我一直在使用带有 RBF 内核的 SVM 来训练和预测新数据。但问题是数据集偏向于不同的类别。

例如,1 级 - 30 级(各约 3%)、31 级 - 45 级(各约 0.6%)、46 级 - 50 级(各约 0.2%)

我看到该模型往往很少预测训练集中出现频率较低的类,即使测试集与训练集具有相同的类分布。

我知道有诸如“欠采样”之类的技术,其中多数类被缩减为次要类。但是,这适用于有这么多不同类别的地方吗?还有其他方法可以帮助处理这种情况吗?

4个回答

我建议你使用 libsvm,它已经实现了可调整的类权重。不是复制训练样本,而是修改 SVM 优化中不同类别的 C 参数。例如,如果您的数据有 2 个类别,而第一个类别仅占数据的 10%,则您可以选择类别 1 和 2 的类别权重分别为 10 和 1。因此,第一类的边际违规将比第二类的边际违规成本高出 10 倍,并且每类的准确性会更加平衡。

我不是使用 SVM 的出口,但通常(如果您使用的是 Pythonscikit-learn或 R 之类的机器学习库libsvm,则分别有class_weight参数 or class.weights

或者,如果您使用贝叶斯分类器,您将通过“先验(类)概率”P(ω j )考虑这种“偏斜”

关于这种方法,带有 RBF 内核的 SVM 做得很好,但是 SVM 可能会因大对象大小而变慢,除非您使用 CV,例如每个折叠随机分配十分之一的数据。但是,您有没有问过自己为什么首先要使用 SVM?

您是否尝试过多元线性回归, Y=Xβ, 其中每条记录 Y 被编码 yij=+1 如果 ith 对象在类中 j, 和 yij=1否则?如果使用线性回归的分类准确度相当高,那么您的数据是线性可分的,不需要更复杂的方法,例如 SVM 和 ANN。第 2 步将证明 k-最近邻、朴素贝叶斯、线性(Fisher)判别分析、多分逻辑回归等会崩溃并失败。

对于术语,您可能会在“某些类中对象的比例较低”或“类大小接近零”的背景下提出更多类权重的问题。偏斜往往用于描述特征值的分布,如偏斜、肥尾等。

你有多少功能?在尝试使用 SVM 进行监督分类(类预测)之前,您是否尝试过对 100,000 个对象进行无监督聚类(类发现)?也许这 100,000 个对象可以分为少于 50 个的类,新的类成员可以在分类分析期间用作目标类。这可以缓解班级规模接近于零的问题。

在使用带有 Rbf 内核的 SVM 时,我曾多次遇到过这个问题。使用线性内核而不是 Rbf 内核解决了我的问题,但我处理的类数量较少。使用线性内核,结果偏差较小且更准确。希望这能解决您的问题。

编辑:虽然我写了原始答案,但我很天真,没有考虑将这些类加权为其中一个正确回答。此外,在使用 rbf 内核时,确保惩罚参数或 sklearn 的 svm 模块中的“C”值过于通用也很重要。我发现 C=1 的默认值在大多数情况下过于通用,我通常最终得到 C=10000 的值。希望这可以帮助其他使用 svm(rbf) 获得偏斜结果的人,尽管它们在数据中具有良好的类分布。