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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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