WEKA - 用Java培训多类SVM模型

时间:2016-02-18 17:41:27

标签: java machine-learning svm weka

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

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

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

1。这个(RegSMOImproved)是我的问题的一个很好的算法吗?

2。如果1.是'是:在培训之前我需要设置任何选项吗?

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

如果我遗漏了任何内容,请在下面发表评论,我很乐意尽快添加更多信息。

提前谢谢你。

编辑1:

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

我要分类的每个班级都是植物物种(独特的)。我有10种(意思是10种)。我收集了每个物种的100个样本并拍摄了他们的花朵照片。每个花样具有大小,对称性和质地。我已经描述了具有一系列特征的每朵花,分割ROI并从相对定位的兴趣点提取纹理特征。特征数组描述了一个样本花的整体(每个样本的有序特征)。每个要素数组都有100,000个纹理要素(type = double)。

1000个样本(10个等级)必须生成10个模型,每个模型应该训练100个阳性样本,对900个阴性样本进行训练,如同一个类别对抗所有其他样本。

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.

当数组太长时,在多维空间中将一个类与另一个类进行比较真的很难。有些物种有相似的花,但这不是障碍,因为我依靠纹理来区分(每个类中应该有一些非常好的模式 - 在我测试我的特征提取程序时看到了一些)。

我想将新鲜采集的未知样本与每个模型进行比较,并在每次比较中返回0到1之间的概率值如果可能的话。我的决定已经根据在机器学习程序之外完成的花形和大小排除了类别,这意味着基于机器学习的最终确定将从模型总数的一半进行。每个模型都将在我的本地硬盘驱动器上保存一个类名,因此我将在最后返回3个模型名称(它们将是类名)。

如果我无意中遗漏了任何内容,请告诉我。

更新

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

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

我已经添加了"物流模型的拟合"使用选项-M for SMO和"交叉验证"使用-V for SMO选项,如邮件列表中所示。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

  1. 这是我的问题的好算法吗?
  2. 这取决于您的数据。对于大多数应用程序,回归将为您提供合理的结果,并且将在合理的时间内完成。是否取决于您对" good"的定义。

    如果您的数据被正确地划分为没有异常的异常值,那么各种回归方法都可以正常工作 - 但大多数方法也是如此。拥有一个或两个积极点远远落后于敌人"将移动SVM边界令人不快。如果渗透者接近自然界限,没问题。

    1. ... are there any options I need to set before training?
    2. 同样,这取决于数据。我建议你注意那个epsilon参数,因为它是一个硬约束。如果将其设置得太小,则存在过度拟合的风险。适当的值取决于您的数据混合。如果你有一个非常异常的话,那么合理的ε可以摒弃整个过程。

      1. ... what would be the correct choice ...?
      2. 同样,这取决于您的数据。您想要分类的区域有哪些形状?有多少渗透者?他们有多远?你想让他们有什么影响?您需要从培训中获得什么结果?

        例如,如果数据是同心球体,那么您只需要在内部球体上使用1级SVM,或者可能需要光谱聚类方法。

        我希望这会让你走向解决方案。

        **对编辑1的回应:** 感谢您添加的信息。听起来好像你确实拥有多类SVM的经典案例。你在训练每个班级时都是正确的#34;一个对所有":这正是其他包处理问题的方式。您可能想要查找该术语。您是否考虑过使用SMO参数的 MultiClassClassifier

        大多数分类算法计算这些部分概率,但随后返回具有最高值的分类,并且无法返回相对概率。我已经投了一点,我还没有发现任何可以返回班级倾向或标签的东西(每个班级的概率,必须总和为1.0)。

        可以使用标签传播图执行此操作:定义相似性指标,使用您的数据点构建图表,使用其观察到的物种标记每个点 - 1,0和9 0,0值 - 并使用边缘权重的邻近相似性。但是,我认为这可能需要为您的应用程序提供太多的内存开销。