批量梯度下降与scikit学习(sklearn)

Joh*_*hnJ 8 python machine-learning scikit-learn

我正在使用Scikit-Learn(sklearn)玩一对一的Logistic回归分类器.我有一个大的数据集太慢,无法一次性运行; 我也希望在培训过程中学习学习曲线.

我想使用批量梯度下降来分批训练我的分类器,比如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
Run Code Online (Sandbox Code Playgroud)

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

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

Fre*_*Foo 23

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

随着SGDClassifier,像LogisticRegression,有没有必要换行估计中OneVsRestClassifier-无论是做一个-VS-所有培训开箱.

# 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")
Run Code Online (Sandbox Code Playgroud)

然后,要在小型车上训练,请使用该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)
Run Code Online (Sandbox Code Playgroud)

(在这里,我正在classes为每个小批量传递,这不是必需的,但也不会伤害并使代码更短.)

  • @JohnJ:实际上,SGD可用于批处理,小批量或在线(一次采样)模式。我在这里使用的术语是教授。Hinton的Coursera NN / ML课程,到目前为止,我发现它与大多数文献都是一致的。 (2认同)
  • @JohnJ:是的,非常好.它继续在Ng离开的地方,如果你喜欢干涩的机智,你就可以享受美食了. (2认同)