首页 > 解决方案 > 为什么`SGDClassifier`中的`partial_fit`会遭受模型精度逐渐降低的影响

问题描述

我正在使用in训练一个在线学习SVM 分类器。我了解到可以使用.SGDClassifiersklearnpartial_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)

它只是第一次创建。

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

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

这可能是什么原因?

标签: pythonscikit-learnsvmtraining-datasgd

解决方案


这就是我克服它的方式。

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

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

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

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 docs] 中被描述为:

'adaptive': eta = eta0,只要训练不断减少。如果 early_stopping 为 True,每次 n_iter_no_change 连续 epoch 未能将训练损失减少 tol 或未能将验证分数增加 tol,则当前学习率除以 5。

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

7.9 -> 98.89 -> 47.7 -> 29.4

现在,我们以 100% 的准确率获得了更好的结果,尽管由于 epoch 的增加存在很大的过拟合范围。我试图在这个 kaggle notebook中展示观察结果


推荐阅读