我正在使用in训练一个在线学习的SVM 分类器。我了解到可以使用.SGDClassifier
sklearn
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)
它仅在第一次创建。
为了测试它,我首先使用整个数据训练了我的分类器模型 1,fit
并获得了 87% 的模型准确度(使用model.score(X_test, y_test)
)。然后,为了演示在线训练,我将相同的数据分成 4 组,然后使用partial_fit
. 这是模型 2。
但在这种情况下,我的准确率下降为:87.9 -> 98.89 -> 47.7 -> 29.4。
这可能是什么原因?
这就是我克服它的方式。
通常,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,只要训练不断减少。每次 n_iter_no_change 连续 epochs 未能将训练损失减少 tol 或如果 early_stopping 为 True 则无法将验证分数增加 tol 时,当前学习率除以 5。
最初,对于每一轮新数据,我们会得到准确度的下降:
7.9 -> 98.89 -> 47.7 -> 29.4
现在,我们以 100% 的准确率获得了更好的结果,尽管由于增加的 epochs 存在很大的过度拟合范围。我试图证明这个 kaggle notebook 中的观察结果
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句