支持向量机(SVM)的一些实现细节
libsvm
machine-learning
svm
8
0

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

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

  1. 我每周都会收到其他培训示例。现在,系统开始使用更新的示例(旧示例+新示例)进行全新的培训。我想使其逐渐学习。使用先前的知识(而不是先前的示例)和新示例来获取新模型(知识)

  2. 正确,我的培训示例有3节课。因此,每个训练示例都适合于这三个课程之一。我需要“未知”类的功能。任何不符合这3个类别的内容都必须标记为“未知”。但是我不能将“未知”视为新类,也不能提供示例。

  3. 假设实现了“未知”类。当类“未知”时,应用程序的用户输入他认为该类可能是的类。现在,我需要将用户输入纳入学习中。我也不知道该怎么做。如果用户输入一个新的班级(即培训集中尚没有的班级),会有所不同吗?

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

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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

我只是使用与您的问题相同的组织来写我的答案(1、2、3)。

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

  2. 我认为您可以通过一对多配置LIBSVM(即,作为一类分类器)来轻松解决此问题。 SVM 一类分类器。 SVM在多类中的应用意味着它已被编码为执行多个,逐步的,反对多对多的分类,但是算法又一次被训练(和测试)了一个类。如果执行此操作,则针对测试集逐步执行之后剩下的是“未知的”-换句话说,根据定义,在执行多个连续的一类分类之后未分类的数据都是“未知的” '课。

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

收藏
评论

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

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

我还没有亲自使用过它们。它们似乎都处于“研究玩具”阶段。我什至无法让SVMHeavy进行编译。

目前,您可能可以进行定期批处理培训以合并更新。我也使用LibSVM,它的速度非常快,因此在实现适当的增量版本之前,它应该是一个很好的替代品。

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

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

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

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

收藏
评论
  1. 有一些算法可以逐步训练SVM,但我不认为libSVM可实现此功能。我认为您应该考虑是否真的需要此功能。我认为您当前的方法没有问题,除非培训过程确实太慢。如果是,您是否可以分批重新培训(即每100个新示例之后进行一次培训)?
  2. 您可以使libSVM产生类成员资格的概率。我认为可以对多类分类执行此操作,但是我对此并不完全确定。您将需要确定分类不够明确的某个阈值,然后输出“未知”。我猜想像设置一个最有可能和第二个最有可能造成的差异之间的阈值可以达到目的。
  3. 我认为libSVM可扩展到任何数量的新类。但是,模型的准确性可能会因添加新类而受到损害。
收藏
评论

即使这个问题可能已经过时,我还是有义务提出一些其他想法。

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

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

    • 如果您将“未知”类用作“此实例尚未分类,但属于已知类之一”的标记,则您的SVM陷入严重麻烦。原因是,libsvm构建了几个二进制分类器并将其组合。因此,如果您拥有三个类(例如A,B和C),则SVM通过将训练示例分为“分类为A”和“其他任何类”来构建第一个二进制分类器。显然,后者将包含“未知”类中的所有示例。尝试构建超平面时,“未知”(确实属于类“ A”)中的示例可能会导致SVM构建具有很小裕度的超平面,并且将无法很好地识别A的未来实例,即其泛化性能会减少。这是由于以下事实:SVM将尝试构建一个超平面,该平面将A的大多数实例(正式标记为“ A”的实例)分离到超平面的一侧,而某些实例(那些正式标记为“ Unknown”的实例)分离到另一边 。

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

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号