在特定的应用程序中,我需要机器学习(我知道我在本科课程中学到的东西).我使用支持向量机并解决了问题.它的工作正常.
现在我需要改进系统.这里的问题是
我每周都会获得额外的培训示例.现在,系统开始使用更新的示例(旧示例+新示例)进行新的培训.我想让它增量学习.使用以前的知识(而不是前面的例子)和新的例子来获得新的模型(知识)
我的训练样例有3个班级.因此,每个训练样例都适合这三个类中的一个.我想要"未知"类的功能.任何不适合这3个类的东西都必须标记为"未知".但我不能将"未知"视为一个新类,并为此提供示例.
假设,实现了"未知"类.当类是"未知"时,应用程序的用户输入他认为该类可能的内容.现在,我需要将用户输入合并到学习中.我也不知道怎么做.如果用户输入一个新类(即一个尚未在训练集中的类),它会有什么不同吗?
我是否需要选择新算法或支持向量机可以执行此操作?
PS:我正在使用libsvm实现SVM.
我刚使用与您的问题相同的组织编写了我的答案(1.,2.,3).
支持向量管理系统能做到这一点 - 即增量学习吗?多层感知器当然可以 - 因为后续的训练实例不会影响基本的网络架构,它们只会调整权重矩阵的值.但SVM?在我看来(理论上)一个额外的训练实例可以改变支持向量的选择.但是,我不知道.
我认为你可以通过一对多配置LIBSVM来轻松解决这个问题 - 即,作为一类分类器.SVM 是一类分类器; 将SVM应用于多类意味着它已被编码为执行多个逐步的一对多分类,但同样,该算法一次被训练(和测试)一个类.如果你这样做,那么在对测试集逐步执行之后剩下的是"未知" - 换句话说,在执行多个顺序一类分类之后没有对任何数据进行分类,根据定义是'未知'上课.
为什么不让用户猜测一个特征(即,只是另一个因变量)?唯一的另一个选择是使它成为类标签本身,你不希望这样.例如,您可以在数据矩阵"用户类猜测"中添加一个列,然后只使用某些值填充它,这些值最有可能对那些不在"未知"类别中的数据点产生影响,因此对用户而言不会提供猜测 - 这个值可能是'0'或'1',但实际上这取决于你如何缩放和规范化数据).
您的第一个项目可能是最困难的,因为基本上没有好的增量SVM实现存在.
几个月前,我还研究了在线或增量 SVM算法.不幸的是,当前的实现状态非常稀少.我发现的只是一个Matlab示例,OnlineSVR(一个仅实现回归支持的论文项目)和SVMHeavy(仅二进制类支持).
我个人没有使用过任何一个.他们似乎都处于"研究玩具"阶段.我甚至无法编译SVMHeavy.
目前,您可以通过定期批量培训来结合更新.我也使用LibSVM,而且速度非常快,所以在实现适当的增量版本之前,它应该是一个很好的替代品.
我也不认为SVM可以默认模拟"未知"样本的概念.它们通常作为一系列布尔分类器工作,因此样本最终会被归类为某种东西,即使该样本与之前看到的任何内容完全不同.可能的解决方法是对要素范围进行建模,并随机生成这些范围之外的样本,然后将这些样本添加到训练集中.
例如,如果您有一个名为"color"的属性,其最小值为4,最大值为123,那么您可以将这些属性添加到训练集中
[({'color':3},'unknown'),({'color':125},'unknown')]
让您的SVM了解"未知"颜色的含义.