我使用的是来自此处的最新Weka开发者版本,我正在尝试创建我的第一个SVM模型。我的数据是不平衡的。我想创建10个模型。每个模型需要从100个正样本(1个类别)对抗900个负样本(每个类别是唯一的)中学习,这些样本存储在Instances
中(一个实例集用于训练单个模型)。
我是新手,所以我一直在研究weka.classifiers.functions.supportVector
包中的一个名为RegSMOImproved的SVM算法。我认为这是使用回归的SVM变体。
我已经创建了10个Instances
并用DenseInstance
对象填充了它们。因此,实例集已经准备好用于训练。
1. RegSMOImproved是否适合我的问题?
2. 如果1.是肯定的:在训练之前是否需要设置任何选项?
3. 如果1.是否定的:使用Weka库,我的问题应该选择什么?
如果我遗漏了什么,请在下方评论,我会尽快补充更多信息。
提前感谢你。
编辑1:
所以主要问题是我的数据。好的,我先为我的英语不好道歉。我会尽量保持简单明了。
我想要分类的每个类别都是一种植物物种(独特的)。我有10个物种(意味着10个类别)。我收集了每个物种的100个样本,并拍摄了它们的花朵照片。每个花朵样本都有大小、对称性和纹理。我用特征数组描述了每朵花,细分了感兴趣区域,并从相对定位的兴趣点提取纹理特征。一个特征数组描述了一个样本花朵的整体(每个样本的有序特征)。每个特征数组恰好有100,000个纹理特征(类型为double)。
1000个样本(10个类别)将需要生成10个模型,每个模型应训练100个正样本对抗900个负样本,如一个类别对抗所有其他类别。
类别A: {100个正样本, 900个负样本} 类别B: {100个负样本, 100个正样本, 800个负样本} 类别C: {200个负样本, 100个正样本, 700个负样本} ... 等等...类别A:样本1: {3.4500864,6.4582390,...}{类别: 正样本}等等。样本101: {0.4594787, 2.543478,...}{类别: 负样本}等等。
当数组如此长时,在多维空间中比较一个类别与另一个类别是非常困难的。有些物种的花朵相似,但这不是障碍,因为我依赖纹理来区分它们(每个类别内部应该有一些非常好的模式 – 在测试我的特征提取程序时我已经看到了一些)。
我想将一个新采集的未知样本与每个模型进行比较,并从每次比较中返回一个介于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
我在邮件列表中建议的SMO选项中添加了“拟合逻辑模型”的选项-M和“交叉验证”的选项-V。
重要提示:此选项仅创建一个训练模型。
回答:
让我们看看…你这里有几个问题。
A. 我认为[RegSMOImproved]是使用回归的SVM变体。
正确:该过程最小化了观察值和预测值之间的平方误差。维基百科提供了一个很好的概述。请注意epsilon限制。
- 这是否适合我的问题?
这取决于你的数据。回归将为大多数应用提供一个合理的结果,并且会在合理的时间内完成。是否好取决于你对“好”的定义。
如果你的数据分区得当,没有明显的异常值,那么各种回归方法将表现良好——但大多数方法也将如此。如果你的正样本点中有几个“深入敌后”,SVM边界将不愉快地移动。如果渗透者接近自然边界,则没有问题。
- …
在训练之前是否需要设置任何选项?
同样,这取决于数据。我建议你仔细注意那个epsilon参数,因为它是一个硬性约束。如果你设置得太小,你可能会过度拟合。一个合适的值取决于你的数据混合。如果你有一个非常离群的值,一个原本合理的epsilon可能会扰乱整个过程。
- …
正确的选择是什么...?
同样,这取决于你的数据。你想要分类的区域形状是什么样的?有多少渗透者?他们有多远?他们应该有多大影响?你需要从训练中得到什么结果?
例如,如果数据是同心球体,你可能想要在内球体上使用1类SVM,或者可能使用光谱聚类方法。
希望这能帮助你找到解决方案。
**对编辑1的回应:**感谢你提供的额外信息。听起来你确实有一个经典的多类SVM案例。你训练每个类别为“一对多”这是正确的:这是其他软件包处理问题的方式。你可能想查一下这个术语。你有没有考虑过使用SMO参数的MultiClassClassifier?
大多数分类算法计算这些部分概率,但随后返回具有最高值的分类,并且不返回相对概率。我稍微查了一下,还没有找到任何返回类别倾向或标签(每个类别的概率,必须总和为1.0)的内容。
你可以用标签传播图来做这个:定义一个相似性度量,构建一个带有你的数据点的图,用观察到的物种标记每个点——1,0和九个0,0值——并使用邻近的相似性作为边权重。然而,我认为这可能会为你的应用带来过多的内存开销。