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

问题描述

我正在使用SGDClassifier中的sklearn训练在线学习 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的准确度容易达到reductionfluctuation。在某种程度上,可以通过改组和仅提供整个数据集的 小部分来稍微缓解这种情况。但是,对于较大的数据,使用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]中描述为:

“自适应”:eta = eta0,只要训练持续减少即可。每次n_iter_no_change个连续的纪元未能将训练损失减少一倍,或者如果Early_stopping为True,则未能增加鉴定分数一次,则当前学习率除以5。

最初,随着每一轮新数据的出现,我们的准确性都会下降:

7.9-> 98.89-> 47.7-> 29.4

现在,尽管由于历时增加而导致过度拟合的范围很大,但我们仍可以100%的精度获得更好的结果。我试图证明this kaggle notebook

中的观察结果