我正在使用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
即。它正确地识别了一个训练样本(是的,我意识到用新数据评估它会更好 - 这只是一个快速的烟雾测试)。
R.E。批量梯度下降:我还没有创建学习曲线,但是可以在训练数据的后续子集上重复运行fit
吗?还是有其他一些功能可以批量训练?文档和谷歌在这件事上相当沉默。谢谢!
答案 0 :(得分:21)
你想要的不是批量梯度下降,而是随机梯度下降;批量学习意味着一次性学习整个训练集,而你所描述的恰当称为minibatch学习。这是在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)
(在这里,我为每个小批量传递classes
,这不是必需的,但也不会伤害并缩短代码。)