Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn中的SVM支持增量(在线)学习吗?_Python_Machine Learning_Scikit Learn_Svm - Fatal编程技术网

Python sklearn中的SVM支持增量(在线)学习吗?

Python sklearn中的SVM支持增量(在线)学习吗?,python,machine-learning,scikit-learn,svm,Python,Machine Learning,Scikit Learn,Svm,我目前正在设计一个文本文章推荐系统(一个“有趣”或“不有趣”的二进制案例)。我的规范之一是,它应该不断更新,以适应不断变化的趋势 据我所知,最好的方法是使用支持增量/的机器学习算法 像Perceptron和Winnow这样的算法支持在线学习,但我不能完全肯定支持向量机。scikit learn python库是否支持在线学习?如果支持,支持向量机是可以利用它的算法之一吗 很明显,我并没有完全依赖于使用支持向量机,但由于它们的全面性能,它们通常是二进制分类的首选算法。最后,我愿意选择最合适的。技术

我目前正在设计一个文本文章推荐系统(一个“有趣”或“不有趣”的二进制案例)。我的规范之一是,它应该不断更新,以适应不断变化的趋势

据我所知,最好的方法是使用支持增量/的机器学习算法

像Perceptron和Winnow这样的算法支持在线学习,但我不能完全肯定支持向量机。scikit learn python库是否支持在线学习?如果支持,支持向量机是可以利用它的算法之一吗

很明显,我并没有完全依赖于使用支持向量机,但由于它们的全面性能,它们通常是二进制分类的首选算法。最后,我愿意选择最合适的。

技术方面 简而言之,答案是否定的。Sklearn实现(以及大多数现有的其他实现)不支持在线SVM训练。以增量方式训练支持向量机是可能的,但这并不是一项简单的任务

如果您想将自己局限于线性情况,那么答案是,因为sklearn为您提供了随机梯度下降(SGD),它可以选择最小化SVM标准

您也可以试用pegasos库,它支持在线SVM训练

理论方面 趋势适应问题目前在ML社区非常普遍。正如@Raff所说,它被称为概念漂移,有许多方法,通常是元模型的一种,它们分析“趋势如何表现”,并改变底层的ML模型(例如,通过强制它对数据子集进行再训练)。这里有两个独立的问题:

  • 在线培训问题纯粹是技术问题,可由SGD或sklearn以外的其他图书馆解决
  • 概念漂移是目前一个热门话题,没有什么好的答案。概念漂移有很多可能性、假设和证明,虽然没有一种公认的方法来处理这一现象,但事实上,目前许多医学博士学位论文都是基于这一问题

虽然支持向量机的在线算法确实存在,但指定您想要的是核支持向量机还是线性支持向量机变得非常重要,因为已经为线性支持向量机的特殊情况开发了许多有效的算法

对于线性情况,如果使用带有铰链损失和L2正则化的SVM,您将得到一个可以在线更新/增量所有的SVM。您可以将其与类似于在线内核SVM的方法相结合

我的规范之一是,它应该不断更新,以适应不断变化的趋势

这被称为概念漂移,简单的在线支持向量机无法很好地处理。使用被动渐进式分类器可能会获得更好的结果,因为它的学习速度不会随时间而降低

假设您在训练/跑步时收到反馈,您可以尝试检测精度随时间的下降,并在精度开始下降时开始训练新模型(并在您认为新模型已变得更精确时切换到新模型)。有2种漂移检测方法(请参阅),可用于跟踪精度并在精度发生变化时向您发出警报

它还有更多的在线线性和核方法


(偏见注:我是JSAT的作者)

也许是我太天真了,但我认为值得一提的是,当您以增量方式呈现数据时,如何实际更新:

clf = linear_model.SGDClassifier()
x1 = some_new_data
y1 = the_labels
clf.partial_fit(x1,y1)
x2 = some_newer_data
y2 = the_labels
clf.partial_fit(x2,y2)

如果对概念漂移在线学习感兴趣,那么这里是一些以前的工作

  • 概念漂移下的学习:综述

  • 概念漂移问题:定义和相关工作

  • 概念漂移适应研究综述

  • 面向流数据的MOA概念漂移主动学习策略

  • 概念漂移的一系列算法

  • 基于概念漂移的数据流挖掘

  • 用流处理和机器学习分析时间序列数据


  • 批量学习任务的SGD学习率通常会下降,并且会多次检查训练集。因此,对于纯在线学习,请确保在sklearn.linear_model.sgdclassizer()中将learning_rate设置为“常量”,并且eta0=0.1或任何所需的值。因此,流程如下:

    clf= sklearn.linear_model.SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False, n_iter = 1)
    # get x1, y1 as a new instance
    clf.partial_fit(x1, y1)
    # get x2, y2
    # update accuracy if needed
    clf.partial_fit(x2, y2)
    

    扩展SVM的一种方法是将您的大型数据集拆分为可由SVM算法安全使用的批次,然后分别为每个批次找到支持向量,然后在包含所有批次中找到的所有支持向量的数据集上构建生成的SVM模型


    更新趋势可以通过在每次运行培训管道时维护一个时间窗口来实现。例如,如果您每天进行一次培训,并且一个月的历史数据中有足够的信息,请根据最近30天获得的历史数据创建培训数据集。

    我会担心过度拟合和反馈。如果您的机器学习者倾向于将相空间的某些区域标记为“有趣”,它们将显示更多,并且您将在那里获得更多元素,这将增加点数。。。您可以随时积累一批数据点,并不时对机器进行重新培训;如果你的第一步和之前一样,那应该很快。迈克尔·阿奎利纳:我正在研究类似的问题。您能否分享您构建的解决方案的见解?我刚刚检查了网站的缓存版本,其中有一个重要的实施注意事项:“对于分类,需要注意的一点是,尽管无状态特征提取例程可能能够处理新的/看不见的属性,但增量学习器本身可能无法处理