28

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

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

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

  2. 对,我的训练示例有 3 个类。因此,每个训练示例都适合这 3 个类之一。我想要“未知”类的功能。任何不符合这 3 个类别的内容都必须标记为“未知”。但我不能将“未知”视为一个新类并为此提供示例。

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

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

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

4

4 回答 4

9

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

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

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

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

于 2010-08-10T09:40:33.470 回答
5

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

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

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

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

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

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

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

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

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

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

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

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

    • 如果您使用“未知”类作为“此实例尚未分类,但属于已知类之一”的标记,那么您的 SVM 就有很大麻烦。原因是 libsvm 构建了几个二进制分类器并将它们组合在一起。因此,如果您有三个类——比如说 A、B 和 C——SVM 通过将训练示例分为“分类为 A”和“任何其他类”来构建第一个二元分类器。后者显然将包含来自“未知”类的所有示例。在尝试构建超平面时,“未知”中的示例(实际上属于“A”类)可能会导致 SVM 构建一个边距很小的超平面,并且很难识别 A 的未来实例,即它的泛化性能会减少。那'

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

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

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

于 2013-02-06T15:29:25.073 回答