为什么 `SGDClassifier` 中的 `partial_fit` 模型精度逐渐降低

Why does `partial_fit` in `SGDClassifier` suffer from gradual reduction in model accuracy

我正在 sklearn 中使用 SGDClassifier 训练 在线学习 SVM 分类器。我了解到可以使用 partial_fit.

我的模型定义是:

model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=1e-3, shuffle=True, verbose=0, learning_rate='invscaling', eta0=0.01, early_stopping=False)

而且是第一次创建。

为了测试它,我首先使用 fit 在整个数据上训练我的分类器模型 1,并获得了 87% 的模型准确率(使用 model.score(X_test, y_test))。然后,为了演示在线训练,我将相同的数据分成 4 组,然后使用 partial_fit 在 4 个不同的 运行 中输入所有 4 个部分。这是模型 2。

但在这种情况下,我的准确率下降为:87.9 -> 98.89 -> 47.7 -> 29.4。

这可能是什么原因造成的?

我就是这样克服的。

通常,partial_fit 的准确性容易出现 or fluctuation。在某种程度上,这可以通过改组和提供整个数据集的 小部分来稍微缓解。但是,对于更大的数据,在线训练似乎只能降低精度,使用 SGDClassifier/SVM 分类器。

我试着用它做实验,发现使用低学习率有时可以帮助我们。粗略的类比是,在大数据上重复训练同一个模型,会导致模型忘记它从以前的数据中学到的东西。因此,使用 tiny 学习率会减慢学习速度和遗忘速度!

我们可以使用 sklearn 提供的 adaptive 学习率功能,而不是手动提供速率。

model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=None, shuffle=True, verbose=0, learning_rate='adaptive', eta0=0.01, early_stopping=False)

这在 [scikit 文档] 中描述为:

‘adaptive’: eta = eta0, as long as the training keeps decreasing. Each time n_iter_no_change consecutive epochs fail to decrease the training loss by tol or fail to increase validation score by tol if early_stopping is True, the current learning rate is divided by 5.

最初,对于每一轮新数据,我们会得到准确度的下降:

7.9 -> 98.89 -> 47.7 -> 29.4

现在,我们得到了更好的结果,准确率为 100%,尽管由于 epochs 的增加,over-fitting 的范围很大。我试图证明 this kaggle notebook

中的观察结果