scikit-learn 的 SGDClassifier 中的参数 n_iter

机器算法验证 scikit-学习 随机梯度下降
2022-04-03 02:58:14

我对scikit-learnn_iter的函数参数有疑问。SGDClassifier以下是定义:

n_iter : 整数,可选

训练数据的传递次数(又名 epochs)。使用 partial_fit 将迭代次数设置为 1。默认为 5。

对于大小为的数据集,我可以对上面的文字有两种解释:n

  • 解释1:该算法只随机选取n_iter数据点并计算这些点的梯度,因此梯度的评估总数为n_iter所以默认情况下只有5个?!)。
  • 解释2:算法遍历整个数据集时间,为每个循环n_iter挑选个点(基本上没有替换的随机抽样),因此梯度的评估总数为n_iternn ×n_iter

鉴于 scikit-learn 的建议是选择n_iter等于,如果上面的解释 1 是正确的np.ceil(10**6/n),我很难理解对于,算法如何在 1 次计算后收敛......n=1,000,000

根据经验,我们发现 SGD 在观察到大约 1 次后收敛。10^6 个训练样本。因此,对迭代次数的第一个合理猜测是n_iter = np.ceil(10**6 / n),其中n是训练集的大小。

有人可以对此有所了解吗?

功能描述在这里,技术文档在这里

1个回答

应该是第二个。

我总是通过查看源代码来回答这些问题(在 sklearn 中质量非常高,并且写得非常清楚)。有问题的函数在这里(我搜索SGDClassifier然后跟随函数调用,直到我找到这个,这是一个低级例程)。

打破重要的部分:

for epoch in range(n_iter):
    ...
    for i in range(n_samples):
        ...

这正是您期望n_iter通过完整训练数据的模式。