WEKA - 在 Java 中训练多类 SVM 模型

WEKA - Training multiclass SVM models in Java

我正在使用 here 的最后一个 weka 开发者版本,我正在尝试创建我的第一个 SVM 模型。我的数据不平衡。我想创建 10 个模型。每个模型必须从存储在 Instances 中的 100 个正样本 (1 class) 中学习 900 个负样本(每个 class 都是唯一的)(一个实例集用于训练单个模型)。

我是新手, 所以我一直在检查 weka.classifiers.functions.supportVector 包中名为 RegSMOImproved 的 SVM 算法。我认为这是使用回归的 SVM 变体。

我已经创建了 10 个 Instances 并用 DenseInstance 个对象填充它们。因此,实例集已准备好进行训练。

1。这是 (RegSMOImproved) 解决我的问题的好算法吗?

2。如果 1. 是 YES:训练前是否需要设置任何选项?

3。如果 1. 是否定的:对于我的问题,使用 weka 库的正确选择是什么?

如果我遗漏了什么,请在下方留言,我很乐意尽快添加更多信息。

提前谢谢你。

编辑 1:

所以主要关心的是我的数据。好的。我提前为我糟糕的英语道歉。会尽量保持简单。

每个 class 我想 classify 是一个植物物种(唯一)。我有 10 个物种(意思是 10 classes)。我收集了每个物种的 100 个样本,并为它们的花朵拍照。每个花样本都有大小、对称性和纹理。我用一系列特征描述了每朵花,分割了 ROI 并从相对定位的兴趣点提取纹理特征。特征数组将一朵样本花描述为一个整体(每个样本的有序特征)。每个特征数组恰好有 100.000 个纹理特征(type = double)。

1000 个样本(10 classes)将不得不产生 10 个模型,每个模型应该训练 100 个正样本对 900 个负样本,就像一个 class 对所有其他样本。

Class A: {100 positives, 900 negatives} 
Class B: {100 negatives, 100 positives, 800 negatives} 
Class C: {200 negatives, 100 positives, 700 negatives} 
... etc...

Class A:
Sample 1: {3.4500864,6.4582390,...}{class: positive}
etc.
Sample 101: {0.4594787, 2.543478,...}{class: negative}
etc.

当数组很长时,很难在多维 space 中将一个 class 与另一个进行比较。有些物种有相似的花朵,但这不是障碍,因为我依靠纹理来区分它们(每个 class 内部应该有一些非常好的图案 - 我在测试我的功能时看到过一些提取程序)。

我想将新采集的未知样本与每个模型进行比较,return 每次比较的概率值介于 0 和 1 之间如果这完全可能的话。我的决定已经排除了classes基于花的形状和大小在机器学习过程之外完成的,这意味着基于机器学习的最终决定将从模型总数的一半中做出。每个模型都将以 class 名称保存在我的本地硬盘上,因此我将 return 3 个模型名称(它们将是 class 名称)放在最后。

如果我无意中遗漏了什么,请告诉我。

更新:

这些是我在多 class class 化问题上尝试过的设置,它们给了我一些有希望的结果。对于任何想要使用选项 SMO 制作多 class classifier 的人来说,尝试它们可能是值得的。

MultiClassClassifier cModel = new MultiClassClassifier();
String options[] = {
        "-M","0",
        "-R","2.0",
        "-S","1",
        "-W","weka.classifiers.functions.SMO",
        "--",
        "-C","1",
        "-L","0.001",
        "-P","1.0e-12",
        "-M",
        "-N", "0",
        "-V","10",
        "-W","1",
        "-K", "weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0"
};

我从这里得到了这个解决方案:

http://weka.8497.n7.nabble.com/meta-multi-class-classifier-with-the-option-smo-td26548.html

我已经按照邮件列表中的建议为 SMO 添加了带有选项 -M 的 "fitting of logistic models" 和用于 SMO 的带有选项 -V 的 "cross validation"。

重要提示: 此选项仅创建一个经过训练的模型。

让我们看看...您这里有几个问题。

一个。 I asume [RegSMOImproved] is a SVM variant with the use of regression.

正确:该过程最小化了观察值和预测值之间的平方误差。 Wikipedia 给出了一个很好的概述。注意 epsilon 限制。

  1. 这是解决我的问题的好算法吗?

这取决于你的数据。对于大多数应用程序,回归将为您提供 合理的 结果,并且会在合理的时间内完成。 好不好要看你对"good"的定义了。

如果您的数据分区合理且没有异常值,那么各种回归方法都可以正常工作——但大多数方法也可以。有一个或两个正点 "far behind enemy lines" 会使 SVM 边界移动一个令人不快的量。如果渗透者靠近自然边界,没问题。

  1. ...are there any options I need to set before training?

同样,这取决于数据。我建议您特别注意那个 epsilon 参数,因为它是一个硬约束。如果将它设置得太小,则有过度拟合的风险。适当的值取决于您的数据混合。如果你有一个非常离群的值,一个在其他方面是合理的 epsilon 可能会中断整个过程。

  1. ...what would be the correct choice ...?

同样,这取决于您的数据。您想要 class 化的区域的形状是什么?有多少渗透者?他们有多远?你希望他们有什么影响力?您希望从培训中获得什么成果?

例如,如果数据来自同心球体,您可能需要仅在内部球体上使用 1-class SVM,或者可能需要光谱聚类方法。

我希望这能让您找到解决方案。


** 对编辑 1 的回应:** 感谢您提供的补充信息。听起来您确实确实有一个 classic 案例用于多 class SVM。您将每个 class 训练为 "one vs all" 是正确的:这正是其他包处理问题的方式。您可能想查找该术语。您是否考虑过使用 SMO 参数的 MultiClassClassifier

大多数 class 化算法计算这些部分概率,但随后 return 具有最高值的 class 化,并且无法 return 相对概率。我已经做了一些预测,但我没有发现任何 return 的 class 倾向或标签(在每个 class 中的概率总和必须为 1.0)。

可以用标签传播图来做到这一点:定义一个相似性度量,用你的数据点构建一个图,用它观察到的物种标记每个点 -- 1,0和九个 0,0 值——并使用相邻的相似性作为边缘权重。但是,我认为这可能需要您的应用程序过多的内存开销。