【问题标题】:A few implementation details for a Support-Vector Machine (SVM)支持向量机 (SVM) 的一些实现细节
【发布时间】:2011-03-27 16:09:40
【问题描述】:

在一个特定的应用程序中,我需要机器学习(我知道我在本科课程中学习的内容)。我使用了支持向量机并解决了问题。它工作正常。

现在我需要改进系统。这里的问题是

  1. 我每周都会获得额外的训练示例。现在,系统开始使用更新的示例(旧示例 + 新示例)重新进行训练。我想让它成为增量学习。用以前的知识(而不是以前的例子)和新的例子来获得新的模型(知识)

  2. 没错,我的训练示例有 3 个类。因此,每个训练示例都适合这 3 个类之一。我想要“未知”类的功能。任何不符合这 3 个类别的内容都必须标记为“未知”。但是我不能把“Unknown”当作一个新的类,也不能为此提供例子。

  3. 假设实现了“未知”类。当类是“未知的”时,应用程序的用户输入他认为的类可能是什么。现在,我需要将用户输入整合到学习中。我也不知道如何做到这一点。如果用户输入一个新的类(即一个不在训练集中的类)会有什么不同吗?

我是否需要选择新算法或支持向量机可以做到这一点?

PS:我正在为 SVM 使用 libsvm 实现。

【问题讨论】:

    标签: machine-learning libsvm svm


    【解决方案1】:
    1. 有一些算法可以逐步训练 SVM,但我不认为 libSVM 实现了这一点。我认为你应该考虑你是否真的需要这个功能。我认为您当前的方法没有问题,除非培训过程真的太慢。如果是,您能否分批重新训练(即在每 100 个新示例之后)?
    2. 您可以让 libSVM 产生类成员的概率。我认为这可以用于多类分类,但我对此并不完全确定。您需要确定分类不够确定的某个阈值,然后输出“未知”。我想像为最有可能和第二最有可能的类别之间的差异设置一个阈值之类的东西可以实现这一点。
    3. 我认为 libSVM 可以扩展到任意数量的新类。但是,添加新类可能会影响模型的准确性。

    【讨论】:

    • 我不太确定增量算法。虽然我相信增量算法是存在的,但它们很少而且相差甚远,因此找到实现可能很困难。
    • @Chris S 是的,我同意。这可能是因为批量训练通常是一种更简单、更实用的解决方案。
    • 玩弄 libsvm,看起来分配给所有类的概率总和总是等于 1,所以你永远不会遇到“未知”样本对所有类的概率都低的情况.我什至找不到如何“欺骗”它让所有类的概率相等。
    【解决方案2】:

    我刚刚使用与您的问题 (1., 2., 3) 相同的组织编写了我的答案。

    1. SVM 可以做到这一点——即增量学习吗?多层感知器当然可以——因为后续的训练实例不会影响基本的网络架构,它们只会导致权重矩阵值的调整。但是支持向量机呢?在我看来,(理论上)一个额外的训练实例可以改变支持向量的选择。但是,我也不知道。

    2. 我认为您可以通过将 LIBSVM 配置为一对多(即,作为一个一类分类器)来很容易地解决这个问题。支持向量机一类分类器;将 SVM 应用于多类意味着它已被编码为执行多个逐步的一对多分类,但该算法还是一次训练(和测试)一个类。如果你这样做,那么在对测试集逐步执行之后剩下的就是“未知”——换句话说,在执行多个顺序的一类分类之后没有分类的任何数据,根据定义在那个“未知”中' 班级。

    3. 为什么不让用户的猜测成为一个特征(即,只是另一个因变量)?唯一的其他选择是将其设置为类标签本身,而您不希望这样做。因此,例如,您可以在数据矩阵“用户类猜测”中添加一列,然后用一些最有可能对那些不在“未知”类别中的数据点没有影响的值填充它,因此用户不会提供猜测 - 此值可能是“0”或“1”,但实际上这取决于您如何对数据进行缩放和标准化)。

    【讨论】:

      【解决方案3】:

      您的第一项可能是最困难的,因为基本上不存在好的增量 SVM 实现。

      几个月前,我还研究了在线增量 SVM算法。不幸的是,当前的实现状态非常稀少。我只找到了Matlab exampleOnlineSVR(仅实现回归支持的论文项目)和SVMHeavy(仅支持二进制类)。

      我个人没有使用过它们中的任何一个。他们似乎都处于“研究玩具”阶段。我什至无法编译 SVMHeavy。

      目前,您可能可以通过定期批量训练来整合更新来摆脱困境。我也使用 LibSVM,它的速度非常快,因此在实施适当的增量版本之前,它应该是一个很好的替代品。

      我也不认为 SVM 默认可以模拟“未知”样本的概念。它们通常作为一系列布尔分类器工作,因此样本最终会被积极分类为某物,即使该样本与以前看到的任何东西截然不同。一种可能的解决方法是对您的特征范围进行建模,并随机生成这些范围之外的样本,然后将这些样本添加到您的训练集中。

      例如,如果您有一个名为“color”的属性,其最小值为 4,最大值为 123,那么您可以将它们添加到您的训练集中

      [({'color':3},'unknown'),({'color':125},'unknown')]
      

      让您的 SVM 了解“未知”颜色的含义。

      【讨论】:

        【解决方案4】:

        即使这个问题可能已经过时了,我还是觉得有必要提供一些额外的想法。

        1. 由于其他人已经回答了您的第一个问题(没有可用于实现增量学习的生产就绪 SVM,即使它是可能的),我将跳过它。 ;)

        2. 将“未知”添加为一个类不是一个好主意。根据用途不同,原因也不同。

            1234563原因是 libsvm 构建了几个二进制分类器并将它们组合在一起。因此,如果您有三个类——比如说 A、B 和 C——SVM 通过将训练示例分为“分类为 A”和“任何其他类”来构建第一个二元分类器。后者显然将包含来自“未知”类的所有示例。在尝试构建超平面时,“未知”中的示例(实际上属于“A”类)可能会导致 SVM 构建一个边距很小的超平面,并且很难识别 A 的未来实例,即它的泛化性能会减少。这是因为,SVM 将尝试构建一个超平面,将 A 的大多数实例(官方标记为“A”)分离到超平面的一侧,而将一些实例(官方标记为“未知”)分离到超平面的一侧。另一边。
        3. 如果您使用“未知”类来存储 SVM 尚不知道其类的所有示例,则会出现另一个问题。例如,SVM 知道 A、B 和 C 类,但您最近获得了两个新类 D 和 E 的示例数据。由于这些示例未分类且 SVM 不知道新类,您可能希望临时存储他们在“未知”中。在这种情况下,“未知”类可能会造成麻烦,因为它可能包含其特征值变化很大的示例。这将使创建良好的分离超平面变得非常困难,因此生成的分类器将很难将 D 或 E 的新实例识别为“未知”。可能属于 A、B 或 C 的新实例的分类也会受到阻碍。

        4. 总而言之:引入包含已知类示例或几个新类示例的“未知”类将导致分类器效果不佳。我认为在训练分类器时最好忽略所有未分类的实例。

        5. 我建议您在分类算法之外解决此问题。我自己被要求提供此功能并实现了一个网页,该网页显示了相关对象的图像和每个已知类的按钮。如果所讨论的对象属于未知的类别,用户可以填写另一个表格来添加新的类别。如果他回到分类页面,该类别的另一个按钮将神奇地出现。实例分类后,可用于训练分类器。 (我使用一个数据库来存储已知的类并引用哪个示例属于哪个类。我实现了一个导出功能以使数据支持 SVM。)

        【讨论】:

        • 在将问题转变为回归问题之前,我已经解决了未知类问题。我将每个类映射到输出域中的一个范围,外部的所有内容都被视为未知。听起来确实很丑陋,但确实有效:)
        猜你喜欢
        • 2010-12-17
        • 2011-11-09
        • 2023-03-15
        • 2019-06-27
        • 2016-03-17
        • 2013-08-21
        • 2019-09-19
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多