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

时间:2018-03-17 21:46:12

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

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

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

但是每次运行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]]

2 个答案:

答案 0 :(得分:1)

谢谢大家的回答!在阅读了@sascha回复后,我对随机平均梯度下降有了更多的了解,我想我已经找到了这种差异的原因,事实上它似乎是由于"随机&#34 34;算法的一部分。

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

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

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

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

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

stochastic gradient descent

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

所以我认为有几件事情会引起我所问的行为:

(编辑见下面的回复)

  1. 每次重新运行fit函数时,用于计算每次迭代的渐变的点都会发生变化。这就是为什么我不能每次都获得相同的结果。
  2. (编辑)(在调用fit方法时,可以通过 random_state 使其成为确定性的)

    1. 我也意识到算法运行的迭代次数在10到15之间变化(无论我设置的是max_limit)。我无法找到收敛的标准在scikit中的任何地方,但我的猜测是,如果我可以收紧它(即运行更多的迭代),我得到的答案将更接近LinearRegression方法。
    2. (EDIT)(收敛标准取决于 tol (解决方案的精度)。通过修改此参数(我将其设置为1e-100),我能够获得与该解决方案相同的解决方案由LinearRegression报道)

答案 1 :(得分:0)

两种不同输出之间的差异可能来自您只为Ridge回归进行的预处理:scaler=preprocessing.StandardScaler().fit(x_train)

通过执行此类规范化,您可以更改数据的表示形式,这可能会导致不同的结果。

另请注意,通过执行OLS,您只需考虑输出差异(预期与预测),同时Ridge算法也会考虑输入匹配,从而惩罚L2范数或不匹配