【问题标题】:Does the SVM in sklearn support incremental (online) learning?sklearn 中的 SVM 是否支持增量(在线)学习?
【发布时间】:2023-03-08 14:30:01
【问题描述】:

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

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

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

我显然并不完全依赖于使用支持向量机,但由于它们的全面性能,它们通常是二进制分类的首选算法。我愿意改变任何最终最适合的方式。

【问题讨论】:

  • 我会担心过度拟合和反馈。如果您的机器学习器倾向于将相空间的某些区域标记为“有趣”,它们会出现更多,并且您会在那里获得更多元素,这将增加点数......您总是可以积累一批数据点并时不时地重新训练机器;如果您的初始步骤与您停止的步骤相同,则应该很快。
  • Michael Aquilina :我正在解决类似的问题。您能否分享您对您构建的解决方案的见解?

标签: python machine-learning scikit-learn svm


【解决方案1】:

虽然 SVM 的在线算法确实存在,但指定是需要内核还是线性 SVM 变得很重要,因为已经为线性 SVM 的特殊情况开发了许多有效的算法。

对于线性情况,如果您将SGD classifier in scikit-learn 与铰链损失和 L2 正则化一起使用,您将获得一个可以在线/增量更新的 SVM。您可以将其与feature transforms that approximate a kernel 结合使用,以获得类似于在线内核 SVM。

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

这被称为概念漂移,,简单的在线 SVM 无法很好地处理。使用 PassiveAggressive 分类器可能会给您带来更好的结果,因为它的学习率不会随着时间的推移而降低。

假设您在训练/跑步时获得反馈,您可以尝试检测准确性随时间的下降,并在准确性开始下降时开始训练新模型(并在您认为新模型变得更准确时切换到新模型)。 JSAT 有 2 种漂移检测方法(请参阅 jsat.driftdetectors),可用于跟踪准确性并在发生变化时提醒您。

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

(偏见说明:我是 JSAT 的作者)。

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

    • 我刚刚检查了网站的缓存版本,并且有一个重要的实现注意事项:“对于分类,有一点需要注意的是,虽然无状态特征提取例程可能能够应对有了新的/看不见的属性,增量学习器本身可能无法处理新的/看不见的目标类。在这种情况下,您必须使用 classes= 参数将所有可能的类传递给第一个 partial_fit 调用。"
    • 是的,sgdclassifier 无法进行增量学习。如果我们在 fit() 之前给出所有新数据,那么使用 partial_fit() 的目的是什么?在你的 ide 中运行它,ideone.com/SFwdI5。我可以预测没有 partila_fit。如果我在初始拟合()之前提供所有数据,我只是从头开始训练我的所有数据。从增量更新使用 fit() 训练的现有模型的意义上说,您指定的方式对我不起作用。 scikit 是否可以加载使用 fit() 生成的预训练模型并使用 partial_fit 用新样本更新它?
    • 这个其他答案可能有助于解决这些问题。使用warm_start=True 结合fit()partial_fit()stackoverflow.com/questions/49208617/…
    【解决方案3】:

    技术方面

    简短的回答是。 Sklearn 实施(以及大多数现有的其他实施)不支持在线 SVM 培训。以增量方式训练 SVM 是可能的,但这并不是那么简单的任务。

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

    您也可以尝试使用支持在线 SVM 训练的 pegasos 库。

    理论方面

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

    • 在线培训问题,纯技术问题,可以通过 SGD 或 sklearn 以外的其他库解决
    • 概念漂移,目前是一个热门话题,没有有效的答案,实际上很多机器学习的博士论文都是基于这个问题。

    【讨论】:

      【解决方案4】:

      批量学习任务的 SGD 通常会降低学习率,并且会多次遍历训练集。因此,对于纯在线学习,请确保在 sklearn.linear_model.SGDClassifier() 中将 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)
      

      【讨论】:

      • 您能解释一下您是如何添加 x2,y2 的吗?我收到错误,所有类标签都包含在 SGDClassifier 的第一个 partial_fit() 之前。请运行您的 ide:ideone.com/qtGpnY。事实证明,partial_fit 在在线学习方面没有用。对于流数据,在第一个 initial_fit() 之前不可能知道标签。能否请您添加一个工作示例,可能包含一些虚拟数据?
      • 这取决于您如何读取数据,或者您从数据流中获取数据点。 x2 和 y2 是您的第二个训练实例。
      【解决方案5】:

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

      1. 在概念漂移下学习:概述 https://arxiv.org/pdf/1010.4784.pdf

      2. 概念漂移问题:定义及相关工作 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.9085&rep=rep1&type=pdf

      3. 概念漂移适应调查 http://www.win.tue.nl/~mpechen/publications/pubs/Gama_ACMCS_AdaptationCD_accepted.pdf

      4. 用于流数据的 MOA 概念漂移主动学习策略 http://videolectures.net/wapa2011_bifet_moa/

      5. 概念漂移算法流 http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf

      6. 使用概念漂移挖掘数据流 http://www.cs.put.poznan.pl/dbrzezinski/publications/ConceptDrift.pdf

      7. 使用流处理和机器学习分析时间序列数据 http://www.ibmbigdatahub.com/blog/analyzing-time-series-data-stream-processing-and-machine-learning

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-11-04
          • 2017-05-17
          • 2020-10-26
          • 2011-04-27
          • 2014-07-03
          • 2019-03-06
          • 2014-01-16
          相关资源
          最近更新 更多