首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scikit学习的批量梯度下降(sklearn)

使用scikit学习的批量梯度下降(sklearn)
EN

Stack Overflow用户
提问于 2013-02-23 11:13:41
回答 1查看 14.6K关注 0票数 10

我正在使用一个一对一的Logistic回归分类器,使用Scikit-Learn (sklearn)。我有一个很大的数据集,它太慢了,不能一下子跑完所有的数据;我还想在训练过程中研究学习曲线。

我想使用批量梯度下降来训练我的分类器,比如说,以500个样本为一批。有没有什么方法可以使用sklearn来做这件事,或者我应该放弃sklearn,转而“自己滚”?

这就是我到目前为止所知道的:

代码语言:javascript
复制
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吗?或者,是否有其他函数可以批量训练?文档和谷歌在这件事上相当沉默。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-23 19:32:37

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

使用SGDClassifier,就像使用LogisticRegression一样,不需要将估计器包装在OneVsRestClassifier中--两者都进行开箱即用的一对一训练。

代码语言:javascript
复制
# 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。第一次,您必须向它提供一个类列表,因为每个小批量中可能不存在所有类:

代码语言:javascript
复制
import numpy as np
classes = np.unique(["ham", "spam", "eggs"])

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

(在这里,我为每个小批处理传递classes,这不是必需的,但也不会有什么坏处,并使代码更短。)

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15036630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档