我正在尝试使用scikit-learn MLPRegressor进行一些监督学习。我想知道监督学习中纪元数的杠杆作用是什么。
但是当我像这样设置 MLP 时:
mlp = MLPRegressor(max_iter=100, learning_rate_init=0.1)
然后这个:
mlp = MLPRegressor(max_iter=200, learning_rate_init=0.1)
然后这个:
mlp = MLPRegressor(max_iter=500, learning_rate_init=0.1)
预测分数保持不变。我不知道使用 max_iter 来设置纪元数是否正确,因为尽管我更改了max_iter数,但预测分数是恒定的。但是当我改变学习率时,分数会发生变化,因此学习率有一些杠杆作用。
有人可以帮忙吗?谢谢
使用max_iter
确实是限制纪元数的正确方法。从MLPRegressor
的文档:
max_iter:整数,可选,默认值 200 最大迭代次数。求解器迭代直到收敛(由"tol"确定)或此迭代次数。对于随机求解器('sgd', 'adam'),请注意,这决定了周期数(每个数据点将被使用的次数),而不是梯度步长的数量。
请注意,它们的实现还具有针对tol
参数的收敛检查,即当两次迭代之间的成本变化小于tol
时,学习将停止。 默认情况下,tol
设置为 0.0001 (10e-4),这对您的用例/训练数据可能会也可能不会太大容忍度。
在您的情况下,似乎甚至在 100 次迭代之前就达到了这个精度 ( max_iter=100
)。
粗略地说,epoch 的数量通过使优化器能够更长时间地搜索训练集中的最佳解来发挥杠杆作用。但正如@fxx所述,如果两次迭代之间的成本变化不小于 tol
,MLPRegressor 实现将停止周期数。在您的情况下,您可以减小tol
参数以强制算法运行更长时间。
提高实现性能,您还可以检查算法的learning_rate
。 0.1 可能有点太多了,因此优化器可能会超调。