为什么 `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
中的观察结果
我正在 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
的准确性容易出现
我试着用它做实验,发现使用低学习率有时可以帮助我们。粗略的类比是,在大数据上重复训练同一个模型,会导致模型忘记它从以前的数据中学到的东西。因此,使用 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
中的观察结果