代码之家  ›  专栏  ›  技术社区  ›  Fackelmann

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

  •  1
  • Fackelmann  · 技术社区  · 8 年前

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

    运行线性回归后,我运行了山脊(带凹陷)。我希望它能迅速收敛,并返回与求解正常方程的计算结果完全相同的预测结果。

    但每次运行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 回复  |  直到 8 年前
        1
  •  1
  •   Fackelmann    8 年前

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

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

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

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

    重复此操作直到收敛,并且在相同的迭代次数后,给定相同的起始权重,始终会得到相同的结果。

    在随机梯度下降中,在每次迭代中都会执行此操作:

    stochastic gradient descent

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

    因此,我认为有几个因素促成了我所问的行为:

    (编辑请参见下面的回复)

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

    (编辑)(这可以通过使用 random\u状态 调用fit方法时)

    1. 我还意识到,算法运行的迭代次数在10到15之间变化(无论我设置的max\u限制如何)。我在scikit中找不到收敛的标准,但我的猜测是,如果我能收紧它(即运行更多迭代),我会得到更接近线性回归方法的答案。

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

        2
  •  0
  •   nsaura    8 年前

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

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

    还要注意这样一个事实 OLS 如果只看输出差异(预期与预测),则会惩罚L2范数 Ridge 算法还考虑了输入匹配或不匹配