【问题标题】:Batch gradient descent with scikit learn (sklearn)使用 scikit learn (sklearn) 进行批量梯度下降
【发布时间】:2013-02-08 19:20:21
【问题描述】:

我正在使用 Scikit-Learn (sklearn) 使用一对多的逻辑回归分类器。我有一个大型数据集,它太慢而无法一次性运行;我还想随着培训的进行研究学习曲线。

我想使用批量梯度下降来批量训练我的分类器,比如 500 个样本。有什么方法可以使用 sklearn 来做到这一点,还是我应该放弃 sklearn 并“自己动手”?

这是我目前所拥有的:

from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier

# xs are subsets of my training data, ys are ground truth for same; I have more 
# data available for further training and cross-validation:
xs.shape, ys.shape
# => ((500, 784), (500))
lr = OneVsRestClassifier(LogisticRegression())
lr.fit(xs, ys)
lr.predict(xs[0,:])
# => [ 1.]
ys[0]
# => 1.0

即它正确地识别了一个训练样本(是的,我意识到用新数据评估它会更好——这只是一个快速的烟雾测试)。

R.e.批量梯度下降:我还没有创建学习曲线,但是可以简单地在训练数据的后续子集上重复运行fit 吗?还是有其他功能可以批量训练?文档和谷歌对此事相当沉默。谢谢!

【问题讨论】:

  • 最好的办法是查看这个库的源代码。

标签: python machine-learning scikit-learn


【解决方案1】:

你想要的不是批量梯度下降,而是随机梯度下降;批量学习意味着一次性学习整个训练集,而您所描述的正确称为小批量学习。这是在sklearn.linear_model.SGDClassifier 中实现的,如果你给它loss="log" 选项,它适合逻辑回归模型。

使用SGDClassifier,就像使用LogisticRegression 一样,无需将估算器包装在OneVsRestClassifier 中——两者都可以开箱即用地进行一对多训练。

# you'll have to set a few other options to get good estimates,
# in particular n_iterations, but this should get you going
lr = SGDClassifier(loss="log")

然后,要在小批量上进行训练,请使用 partial_fit 方法而不是 fit。第一次,你必须给它一个类列表,因为不是所有的类都可能出现在每个小批量中:

import numpy as np
classes = np.unique(["ham", "spam", "eggs"])

for xs, ys in minibatches:
    lr.partial_fit(xs, ys, classes=classes)

(在这里,我为每个 minibatch 传递了classes,这不是必需的,但也不会造成伤害,并且会使代码更短。)

【讨论】:

  • 感谢您的详细回答,我会尽快尝试。关于定义,我遵循 Andrew Ng 的 Coursera 课程中的术语;在他的命名法中,随机梯度下降涉及改变每个训练样本的梯度,你称之为小批量,他称之为批量梯度下降。但尽管命名,我可以看到这是我所要求的 - 非常感谢!
  • @JohnJ:实际上 SGD 可用于批处理、小批量或在线(一次一个样本)模式。我在这里使用的术语是教授的。 Hinton 的 Coursera NN/ML 课程,到目前为止我发现它与大多数文献一致。
  • 太好了,谢谢。到目前为止,您的回答对我也很有效。你推荐那门课吗?再次感谢。
  • @JohnJ:是的,非常好。它从 Ng 停止的地方继续,如果你喜欢干巴巴的,那么你就可以请客了。
  • @larsmans,有什么方法可以将可变特征传递给 partial_fit 函数吗?
猜你喜欢
  • 2020-08-06
  • 2019-06-27
  • 2014-01-29
  • 2019-08-28
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2020-04-28
  • 2016-06-21
相关资源
最近更新 更多