支持向量机(SVM)的一些实现细节

cla*_*aws 26 machine-learning svm libsvm

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

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

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

  2. 我的训练样例有3个班级.因此,每个训练样例都适合这三个类中的一个.我想要"未知"类的功能.任何不适合这3个类的东西都必须标记为"未知".但我不能将"未知"视为一个新类,并为此提供示例.

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

我是否需要选择新算法或支持向量机可以执行此操作?

PS:我正在使用libsvm实现SVM.

dou*_*oug 8

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

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

  2. 我认为你可以通过一对多配置LIBSVM来轻松解决这个问题 - 即,作为一类分类器.SVM 一类分类器; 将SVM应用于多类意味着它已被编码为执行多个逐步的一对多分类,但同样,该算法一次被训练(和测试)一个类.如果你这样做,那么在对测试集逐步执行之后剩下的是"未知" - 换句话说,在执行多个顺序一类分类之后没有对任何数据进行分类,根据定义是'未知'上课.

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


Cer*_*rin 5

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

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

我个人没有使用过任何一个.他们似乎都处于"研究玩具"阶段.我甚至无法编译SVMHeavy.

目前,您可以通过定期批量培训来结合更新.我也使用LibSVM,而且速度非常快,所以在实现适当的增量版本之前,它应该是一个很好的替代品.

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

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

[({'color':3},'unknown'),({'color':125},'unknown')]
Run Code Online (Sandbox Code Playgroud)

让您的SVM了解"未知"颜色的含义.


Sto*_*ken 4

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