【问题标题】:Why does `partial_fit` in `SGDClassifier` suffer from gradual reduction in model accuracy为什么`SGDClassifier`中的`partial_fit`会遭受模型精度逐渐降低的影响
【发布时间】:2020-12-18 02:55:04
【问题描述】:

我正在使用SGDClassifiersklearn 中训练一个在线学习 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。

这可能是什么原因?

【问题讨论】:

标签: python scikit-learn svm training-data sgd


【解决方案1】:

这就是我克服它的方法。

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

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

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

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 的增加,过度拟合的范围很大。我试图证明this kaggle notebook

中的观察结果

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2011-07-16
    • 2017-04-02
    相关资源
    最近更新 更多