python - 为什么`SGDClassifier`中的`partial_fit`会遭受模型精度逐渐降低的影响
问题描述
我正在使用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 组,然后在 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,只要训练不断减少。如果 early_stopping 为 True,每次 n_iter_no_change 连续 epoch 未能将训练损失减少 tol 或未能将验证分数增加 tol,则当前学习率除以 5。
最初,对于每一轮新数据,我们会得到准确度的下降:
7.9 -> 98.89 -> 47.7 -> 29.4
现在,我们以 100% 的准确率获得了更好的结果,尽管由于 epoch 的增加存在很大的过拟合范围。我试图在这个 kaggle notebook中展示观察结果
推荐阅读
- json - 在 groovy 中解析 Json 时遇到困难
- c++ - C ++访问没有迭代器的映射中的键值对
- math - 如何计算表面法线和表面积
- python-3.x - 如何在python3中计算平均日期时间时间戳
- shiny - 根据输入更改托盘值(闪亮和传单)
- c++ - std::map 插入线程安全吗?
- jquery - Jquery Tagit 只允许通过单击 Tagit 输入窗口下的可用标签来输入
- neural-network - 前馈神经网络 (ANN) 和循环神经网络 (RNN) 有什么区别
- javascript - 如何在Angular / Angular 9中初始化之前动态创建路由
- excel - 工作簿是vba中的类或对象?