<p>尝试设置低于默认值<code>0.01</code>的初始学习率,例如:</p>
<pre><code>import numpy as np
from sklearn.linear_model import SGDRegressor
from random import random
X = np.array(range(1000))
y = np.array([x + random() for x in X])
X = X.reshape(1000,1)
sgd = SGDRegressor(eta0=0.000001)
sgd.fit(X, y)
print [sgd.intercept_, sgd.coef_]
</code></pre>
<p>输出:</p>
^{pr2}$
<hr/>
<p>编辑:我不确定确切的原因,但是<code>X</code>和{<cd3>}中包含的大值似乎会引起一些数值稳定性问题。在<code>SGDRegressor</code>中设置<code>verbose=1</code>,它将显示具有默认学习率的以下输出:</p>
<pre><code> Epoch 1
Norm: nan, NNZs: 1, Bias: nan, T: 1000, Avg. loss: nan
Total training time: 0.00 seconds.
</code></pre>
<p>这意味着内部计算已经溢出了。使用<code>eta=0.000001</code>:</p>
<pre><code> Epoch 1
Norm: 1.00, NNZs: 1, Bias: 0.006449, T: 1000, Avg. loss: 873.136013
Total training time: 0.00 seconds.
Epoch 2
Norm: 1.00, NNZs: 1, Bias: 0.006461, T: 2000, Avg. loss: 436.597862
Total training time: 0.00 seconds.
Epoch 3
Norm: 1.00, NNZs: 1, Bias: 0.006471, T: 3000, Avg. loss: 291.085373
Total training time: 0.00 seconds.
Epoch 4
Norm: 1.00, NNZs: 1, Bias: 0.006481, T: 4000, Avg. loss: 218.329235
Total training time: 0.00 seconds.
Epoch 5
Norm: 1.00, NNZs: 1, Bias: 0.006491, T: 5000, Avg. loss: 174.675614
Total training time: 0.00 seconds.
[array([ 0.00649087]), array([ 1.00035165])]
</code></pre>
<p>另一种可能的方法是预先将数据(输入和输出)调整到正常范围,例如使用<code>StandardScaler</code>。预处理完成后,默认参数工作良好。在</p>