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

我有一个包含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]]

回答:

感谢大家的回答!在阅读了@sascha的回应后,我又多了解了一些关于随机平均梯度下降的内容,我认为我已经找到了这种差异的原因,实际上似乎是由于算法中的“随机”部分所致。

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

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

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

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

在随机梯度下降法中,每次迭代执行以下操作:

stochastic gradient descent

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

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

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

  1. 每次重新运行fit函数时,用于计算梯度的点每次都会变化。这就是为什么我每次得到的结果都不一样。

(编辑)(通过在调用fit方法时使用random_state可以使其具有确定性)

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

(编辑)(收敛标准取决于tol(解的精度)。通过修改此参数(我将其设置为1e-100),我能够得到与LinearRegression报告的相同解)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注