【问题标题】:training unbalanced data in libsvm在 libsvm 中训练不平衡数据
【发布时间】:2013-06-11 04:24:08
【问题描述】:

我有 25 个类,第 0 类包含所有 24 个其他类的所有负样本,因此该类中的样本数量比其他类大得多(例如,大 10 倍,因为它应该包含所有负样本来自其他 24 个班级)

现在我的问题是,当我想训练这个数据集时应该怎么做?

我是否必须使用 libsvm 提供的非平衡训练选项? -w0 1 -w1 ....

我的意思是是否强制使用此选项?

因为当我训练数据时没有这个选项它提供了 99.8% 的分类准确率,当我测试这个准确的模型时!!!对于某些类,我得到 100% 的准确率,而对于其他一些类,我得到 0.0% !!!

我的意思是对于某些类,它不会错过任何样本,但对于另一个类,它总是返回 0 !!!这意味着它是一个负样本!!!

我想使用这个选项,但我不知道它的规则。我的意思是我应该如何使用这个选项为一个类设置一个值?

假设每个类中的样本数为:

0 级 -> 3433

1 级 -> 745

2 级 -> 232

3 级 -> 53

。 . . 23 级 -> 975

我应该如何为每个类设置 wi 我应该在 [0,1] 或 [-1 1] 或 (-inf +inf) 或什么之间缩放它们?

总结 >

1)。我的数据集必须使用 -wi 选项吗?

2)。我应该如何设置这个值

谢谢

【问题讨论】:

  • 那么如果你检查并说样品3不在1类中,你是否把它放在0类中,即使它是2类的例子?换句话说,是否有任何样本出现在多个类中?
  • 当然不是,可能会发生来自两个类别的两个样本在 60% 的特征向量值上相似,但绝不会发生来自特定类别的样本出现在另一个类别中...
  • 我明白了,我只是确保这不是 0 类样本量巨大的原因。默认情况下,权重为 1,您可能必须使用验证集尝试一些不同的值。不幸的是,w 参数在每个类的基础上修改 C,这也会影响低维空间中决策边界的正则化/平滑度。您现在可以将其他类保留为 1,然后开始减少类 0 的 w。如果类 0 不像训练数据中那样普遍,则需要使用 -wi 选项。否则你并没有真正达到 99.8% 的准确率。

标签: visual-studio-2010 opencv machine-learning libsvm


【解决方案1】:

无法评论,所以我会写它作为答案:

两个建议:

  1. 减少class0的权重
  2. 或采用两步法:
    • 结合其他24个类的所有示例,将它们视为一个类, 并构建一个二元分类器
    • 仅为正例构建一个 24 路分类器。如果上一步的分类结果是肯定的,则使用它。

【讨论】:

    【解决方案2】:

    由于每个类都有 +ve 和 -ve 数据,因此应该训练 24 个二元分类器。 然后,当您放入一个测试用例时,如果有多个 SVM 具有正预测,则选择分类器输出概率最高的类。

    如果您使用 LIBSVM 设置多类 SVM,它在内部只会训练多个二进制 SVM。因此,自己明确设置 24 个 SVM 并没有什么奇怪的。

    【讨论】:

    • 我强烈反对仅设置二进制分类器并自行实施投票。您可以实施更好的选民的机会很小。对“0”概率最高的类不一定能战胜其他非“0”类(石头剪刀布问题)。把这个留给那些提供实施背后的理论的受过教育的数学家。
    【解决方案3】:

    这不是强制性的,这取决于您的数据。如果你的班级很容易分开,那就没有必要了。开始没有重量,看看confusion matrix。如果您的错误介于拥挤类和稀疏类之间,则对权重进行一些调整可能会有所帮助。

    【讨论】:

    • 虽然几个月前我得到了答案...但是确实如此...这不是强制性的,这完全取决于第n维空间中的数据...
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2018-04-15
    • 2016-05-05
    • 2017-11-09
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多