<p>编辑:关于您的输出,我猜您的结果与验证集非常接近,因为像SGDregressor这样的线性模型往往不适合复杂数据</p>
<p>要了解这一点,可以在每次迭代时检查模型输出的权重。你会发现它们是一样的或者非常接近</p>
<p>为了增强输出的可变性,需要引入非线性和复杂性</p>
<p>您正在获得机器学习中所谓的“偏差”(与“差异”相反)</p>
<p>我想我现在明白了</p>
<p>萨马马尼最后我认为问题在于不合身。事实上,您正在使用数据集的增量大小。模型欠拟合速度相当快(这意味着模型在开始时或多或少地固定在固定模型上)</p>
<p>只有第一次训练为测试集输出不同的结果,因为它或多或少没有达到最终模型</p>
<p><strong>基本的可变性存在于增量训练集中。</strong>
简单地说,测试结果是对欠拟合模型性能的更准确估计。增加训练样本最终会使测试和训练的结果接近,而不会有太大的改善</p>
<p>您可以检查培训的增量数据集是否与测试集不同。你做错的是检查所有训练集的数据</p>
<hr/>
<p>首先,为什么要进行增量训练集大小的训练?奇怪的结果是因为您正在以增量方式对数据集进行训练</p>
<p>执行此操作时:</p>
<pre><code>for m in my_rng:
modelSGD = SGDRegressor(alpha=0.00001, penalty='l1')
modelSGD.fit(X_train[:m], y_train[:m])
[...]
</code></pre>
<p>您基本上是以增量方式训练您的模型,使用这种增量大小:</p>
<pre><code>for m in range(10, 180001, 30000):
print(m)
10
30010
60010
90010
120010
150010
</code></pre>
<p>如果您试图进行小批量梯度下降,则应将数据集拆分为独立批次,而不是进行增量批次。大概是这样的:</p>
<pre><code>previous = 0
for m in range(30000, 180001, 30000):
modelSGD.partial_fit(X_train[previous:m], y_train[previous:m])
previous = m
# training set ranges
0 30000
30000 60000
60000 90000
90000 120000
120000 150000
150000 180000
</code></pre>
<p>还要注意的是,我使用的是<code>partial_fit</code>方法,而不是<code>fit</code>(因为我没有从零开始重新训练模型,我只做了一步,梯度下降的迭代),并且我不会每次都初始化一个新模型(我的sgd初始化不在for循环中)。完整代码应如下所示:</p>
<pre><code>my_rng = range(0 ,len(X_train), 30000)
previous = 0
modelSGD = SGDRegressor(alpha=0.00001, penalty='l1')
for m in my_rng:
modelSGD.partial_fit(X_train[previous:m], y_train[previous:m])
ypred_train = modelSGD.predict(X_train[previous:m])
ypred_test = modelSGD.predict(X_test)
mse_train = mean_squared_error(y_train[previous:m], ypred_train)
mse_test = mean_squared_error(y_test, ypred_test)
scores_train.append(mse_train)
scores_test.append(mse_test)
</code></pre>
<p>通过这种方式,您可以模拟<strong>一个历元</strong>小批量随机梯度。为了创造更多的时代,需要一个外环</p>
<p>从sklearn:</p>
<blockquote>
<p>SGD allows minibatch (online/out-of-core) learning via the partial_fit
method. For best results using the default learning rate schedule, the
data should have zero mean and unit variance.</p>
</blockquote>
<p>详情<a href="https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDRegressor.html#sklearn.linear_model.SGDRegressor.partial_fit" rel="nofollow noreferrer">here</a></p>