WEKA - 用 Java 训练多类 SVM 模型
Posted
技术标签:
【中文标题】WEKA - 用 Java 训练多类 SVM 模型【英文标题】:WEKA - Training multiclass SVM models in Java 【发布时间】:2016-05-31 01:00:46 【问题描述】:我正在使用来自 here 的最后一个 weka 开发人员版本,并且我正在尝试创建我的第一个 SVM 模型。我的数据不平衡。我想创建 10 个模型。每个模型必须从存储在Instances
(用于训练单个模型的一个实例集)中的 900 个负样本(每个类是唯一的)中学习 100 个正样本(1 个类别)。
我是新手,所以我一直在检查 weka.classifiers.functions.supportVector
包中名为 RegSMOImproved 的 SVM 算法。我认为这是使用回归的 SVM 变体。
我已经创建了 10 个Instances
并用DenseInstance
对象填充它们。因此,实例集已准备好进行训练。
1.这(RegSMOImproved)是解决我问题的好算法吗?
2。如果 1. 为“是”:在训练之前我需要设置什么选项吗?
3.如果 1. 为否:使用 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 的 SMO 的“逻辑模型拟合”和带有选项 -V 的 SMO 的“交叉验证”。
重要提示: 此选项仅创建一个经过训练的模型。
【问题讨论】:
请包含完整的错误:消息和回溯。您能否也发送样本数据让我们重现问题?解决这个问题很可能是一些解决方案的最快途径。 在我的代码中发现了一些错误。将尝试修复它们并在完成后添加编辑。 【参考方案1】:让我们看看……你有几个问题。
A. I asume [RegSMOImproved] is a SVM variant with the use of regression.
正确:该过程最大限度地减少了观察和预测之间的平方误差。 Wikipedia 提供了一个很好的概述。注意 epsilon 限制。
-
这是解决我的问题的好算法吗?
这取决于您的数据。对于大多数应用程序,回归将为您提供合理的结果,并且会在合理的时间内完成。是否好取决于你对“好”的定义。
如果您的数据被恰当地划分,没有异常异常值,那么各种回归方法都可以很好地工作 - 但大多数方法也可以。让你的一两个积极点“远离敌后”将使 SVM 边界移动一个令人不快的数量。如果渗透者靠近自然边界,没问题。
-
...
are there any options I need to set before training?
同样,这取决于数据。我建议您特别注意那个 epsilon 参数,因为它是一个硬约束。如果将其设置得太小,则会有过度拟合的风险。适当的值取决于您的数据混合。如果您有一个非常异常的值,那么一个在其他方面合理的 epsilon 可能会影响整个过程。
-
...
what would be the correct choice ...?
同样,这取决于您的数据。您要分类的区域的形状是什么?有多少渗透者?他们离得有多远?你希望他们产生什么样的影响?您需要从培训中获得什么结果?
例如,如果数据来自同心球,您可能需要仅在内球上使用 1 类 SVM,或者可能需要光谱聚类方法。
我希望这能让您找到解决方案。
** 对编辑 1 的回应:** 感谢您提供的补充信息。听起来你确实有一个多类 SVM 的经典案例。您将每个课程训练为“一对一”是正确的:这正是其他软件包处理问题的方式。您可能想查找该术语。您是否考虑过 MultiClassClassifier 与 SMO 参数?
大多数分类算法计算这些部分概率,然后返回具有最高值的分类,而无法返回相对概率。我已经投了一点,我还没有找到任何返回类倾向或标签的东西(在每个类中的概率,必须总和为 1.0)。
您可以使用标签传播图来做到这一点:定义相似度指标,用您的数据点构建图表,用观察到的物种标记每个点 - 1,0 和九个 0,0值——并使用相邻的相似性作为边缘权重。但是,我认为这可能需要您的应用程序过多的内存开销。
【讨论】:
我添加了一个编辑,希望它能显示我在这里想要完成的工作。感谢您抽出时间对此进行调查。 再次感谢您的解释。我确实必须检查一些多类分类器。 Weka 有一些元分类器,其中一个分类器完全命名为MultiClassClassifier
,另一个使用SGD 命名为MultiClassClassifierUpdateable
。将不得不阅读更多关于他们的信息。希望其中一个可以解决问题,或者我什至可能不得不搬到另一个图书馆,这又会很耗时。
当你得到一个答案时,记得“接受”一个答案。在这种情况下,您可能希望发布您的研究结果,然后接受您自己的答案。接受允许 SO 很好地提出问题。
没错。我认为你的建议可能是正确的。刚刚用 SMO 搜索了一个 MultiClassClassifier,果然。成功了:weka.8497.n7.nabble.com/… 一旦我在这里得到一些结果,肯定会用完整的答案更新我的帖子。我不喜欢留下悬而未决的问题。再次感谢。
宾果游戏!我想你把它钉在那里!感谢你的接纳”;当您完成答案时,请随意切换它,或者您可以根据自己的喜好编辑我的。选择任何能为 SO 留下良好遗产的东西。以上是关于WEKA - 用 Java 训练多类 SVM 模型的主要内容,如果未能解决你的问题,请参考以下文章
WEKA - 多类分类 - 找不到名为:weka.classifiers.functions.supportVector.RegSMOImproved 的类