Python Scikit - LinearRegression 和 Ridge 返回不同的结果

标签 python machine-learning scikit-learn linear-regression

我有一个包含 47 个样本的小数据集。我正在运行具有 2 个特征的线性回归。

运行 LinearRegression 后,我运行了 Ridge(带有下垂)。我希望它能够快速收敛,并返回与计算求解正规方程完全相同的预测。

但是每次运行 Ridge 时,我都会得到不同的结果,接近 LinearRegression 提供的结果,但并不完全相同。我运行多少次迭代并不重要。这是预期的吗?为什么?过去我自己实现了常规梯度下降,它很快就收敛到这个数据集中。

ols = sklearn.linear_model.LinearRegression()
model = ols.fit(x_train, y_train)
print(model.predict([[1650,3]]))
 %[[ 293081.4643349]]

scaler=preprocessing.StandardScaler().fit(x_train)
ols = sklearn.linear_model.Ridge(alpha=0,solver="sag",max_iter=99999999,normalize=False)
model = ols.fit(x_scaled, y_train)
x_test=scaler.transform([[1650,3]])
print(model.predict(x_test))
 %[[ 293057.69986594]]

最佳答案

谢谢大家的回答!在阅读了 @sascha 的回复后,我又阅读了一些关于随机平均梯度下降的内容,我想我已经找到了这种差异的原因,而且事实上它似乎是由于算法的“随机”部分造成的。

请查看维基百科页面: https://en.wikipedia.org/wiki/Stochastic_gradient_descent

在常规梯度下降中,我们根据以下公式更新每次迭代的权重: gradient descent

总和的第二项是成本函数的梯度乘以学习率 mu。

重复此操作直到收敛,并且在给定相同的起始权重的情况下,经过相同次数的迭代后,它总是给出相同的结果。

在随机梯度下降中,这是在每次迭代中完成的:

stochastic gradient descent

总和的第二部分是单个样本的梯度(乘以学习率 mu)。所有样本在开始时都是随机的,然后算法在每次迭代时循环使用它们。

所以我认为有几个因素导致了我所询问的行为:

(已编辑,请参阅下面的回复)

  1. 每次重新运行拟合函数时,用于计算每次迭代梯度的点都会发生变化。这就是为什么我每次都没有得到相同的结果。

(编辑)(这可以通过调用 fit 方法时使用 random_state 来确定)

  1. 我还意识到算法运行的迭代次数在 10 到 15 之间变化(无论我设置的 max_limit 是多少)。我在 scikit 中找不到任何收敛标准,但我的猜测是,如果我可以收紧它(即运行更多迭代),我得到的答案将更接近 LinearRegression 方法。

(编辑)(收敛标准取决于tol(解决方案的精度)。通过修改此参数(我将其设置为 1e-100),我能够获得与该解决方案相同的解决方案由线性回归报告)

关于Python Scikit - LinearRegression 和 Ridge 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342218/

相关文章:

python - 如何在子标题下正确显示图像

python - Beautiful Soup 4 findall() 不匹配 <img> 标签中的元素

machine-learning - Cifar10中的粗标签和细标签是什么?

python - 我可以将多个不同的图像作为 channel 吗?

python - word2vec 嵌入上的 PCA

python - 运行 Tornado 的多个实例会出现 ioloop is already running 错误

python - 使用子字符串进行列表切片

python - sklearn [python]的roc曲线

python-2.7 - sklearn 和导入 CSV 时出现不可哈希类型错误

python - scikit-learn 或 statsmodels 中线性回归调整参数的限制范围