2010-08-10 68 views
23

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

现在我需要改进系统。这里存在的问题有:

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

  2. 对我的训练例子有3个类。所以,每个训练样例都适用于这三个类中的一个。我想要“未知”类的功能。任何不适合这三类的东西都必须标记为“未知”。但我不能把“未知”当成一个新班级,并提供这方面的例子。

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

我需要选择一种新的算法还是支持向量机可以做到这一点? PS:我使用libsvm实现SVM。

回答

3
  1. 有算法来增量训练SVM,但我不认为libSVM实现这个。我认为你应该考虑你是否真的需要这个功能。我认为目前的方法没有问题,除非培训过程太慢。如果是这样,你能否分批进行再培训(即每100个新的例子)?
  2. 您可以使用libSVM生成类成员资格的概率。我认为这可以用于多类分类,但我并不完全确定这一点。您需要确定某个阈值,在该阈值处分类不够确定,然后输出“未知”。我想,像最可能的和第二最有可能的类别之间的差异设置阈值将实现这一点。
  3. 我认为libSVM可以扩展到任何数量的新类。但是,您的模型的准确性可能会因添加新类而受到影响。
+0

我不太确定增量算法。尽管我相信增量算法存在,但它们之间并不多见,因此寻找实现可能很困难。 – Cerin 2010-08-10 12:16:10

+0

@Chris S是的,我同意。这可能是因为批量培训通常是一个更简单,更实用的解决方案。 – Stompchicken 2010-08-10 14:18:45

+0

围绕libsvm进行游戏时,看起来分配给所有类的概率总和总是等于1,所以你永远不会有一个“未知”样本对所有类都有低概率的情况。我甚至无法找到如何“欺骗”它给予所有班级相同的概率。 – Cerin 2010-08-11 17:33:58

8

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

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

  2. 我想你可以很容易地解决这个问题,通过配置LIBSVM在一对多 - 即,作为单级分类器。支持向量机单类分类器;将SVM应用于多类意味着它已被编码以执行多个逐步的一对多分类,但是该算法一次又一次地被训练(并测试)一个类。如果你这样做,那么在对测试集执行逐步执行之后留下的是“未知” - 换言之,无论数据在执行多个连续的一类分类之后没有被分类,其定义都是“未知的'班。

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

5

您的第一个项目可能是最困难的,因为现在基本上没有好的增量式SVM实现。

几个月前,我还研究了在线递增支持向量机算法。不幸的是,目前的实现状态相当稀疏。我发现的只有Matlab example,OnlineSVR(一个只实现回归支持的论文项目)和SVMHeavy(仅支持二进制类)。

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

现在,您可能会摆脱定期批量培训来整合更新。我也使用LibSVM,速度非常快,所以它应该是一个很好的替代品,直到实现一个适当的增量版本。

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

举例来说,如果你有一个名为“色”的属性,其中有4最小值和123的最大值,那么你可以添加这些到你的训练设置

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

给你支持向量机是什么是“未知”颜色的概念。

2

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

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

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

    • 如果您使用的是“未知”类作为一个标签“这种情况还没有被分类,但属于已知类别之一”,那么你的SVM深陷困境。原因是,libsvm构建了几个二进制分类器并将它们组合在一起。因此,如果您有三个类 - 让我们假设A,B和C - SVM通过将训练示例分为“分类为A”和“任何其他类”来构建第一个二元分类器。后者显然将包含来自“未知”类的所有示例。当试图构建一个超平面时,'未知'(实际上属于类'A')中的例子可能会导致SVM构建一个极小余量的超平面,并且很难识别未来的A实例,即泛化性能会减少。这是由于这样一个事实,即SVM将尝试构建一个超平面,将超平面的大部分实例(正式标记为'A')分离到超平面的一侧,以及一些实例(正式标记为“未知”的实例)另一边 。

    • 如果您正在使用“未知”类来存储所有类,但其类尚不知道SVM的示例,则会出现另一个问题。例如,SVM知道类A,B和C,但您最近获得了两个新类D和E的示例数据。由于这些示例未分类,并且SVM未知新类,因此您可能需要临时存储他们在'未知'。在这种情况下,'未知'类可能会引起麻烦,因为它可能包含其特征值的巨大变化的示例。这将使得创建良好的分离超平面变得非常困难,因此由此产生的分类器将很难识别D或E的新实例为“未知”。属于A,B或C的新实例的分类可能也会受到阻碍。

    总结:引入包含已知类的示例或几个新类的示例的'未知'类将导致较差的分类器。我认为在训练分类器时最好忽略所有未分类的实例。

  3. 我会建议,你解决这个问题以外的分类算法。我被要求自己提供这个功能,并实现了一个单一的网页,它显示了所讨论对象的图像和每个已知类的按钮。如果有问题的对象属于尚未知晓的类,则用户可以填写另一个表单以添加新的类。如果他回到分类页面,那个类别的另一个按钮会神奇地出现。在实例被分类之后,它们可以用于训练分类器。 (我用一个数据库来存储已知的类和参考哪个例子属于哪个类,我实现了一个导出函数来使数据支持SVM。)

+0

我已经解决了未知类问题,然后才将问题转化为回归问题。我将每个类映射到输出域中的一个范围,并将外部的所有内容都视为未知。它听起来像丑陋的黑客,但它工作:) – Pedrom 2013-03-07 20:21:51