【发布时间】: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 的“交叉验证”。
重要提示: 此选项仅创建一个经过训练的模型。
【问题讨论】:
-
请包含完整的错误:消息和回溯。您能否也发送样本数据让我们重现问题?解决这个问题很可能是一些解决方案的最快途径。
-
在我的代码中发现了一些错误。将尝试修复它们并在完成后添加编辑。
标签: java machine-learning svm weka