我有一个包含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
在常规梯度下降法中,我们在每次迭代时根据以下公式更新权重:
其中求和的第二项是成本函数的梯度乘以学习率mu。
重复此过程直到收敛,在相同起始权重和相同迭代次数下,它总是给出相同的结果。
在随机梯度下降法中,每次迭代执行以下操作:
其中求和的第二部分是单个样本的梯度(乘以学习率mu)。所有样本在开始时被随机化,然后算法在每次迭代中循环通过这些样本。
所以我认为有几个因素导致了我所提到的行为:
(已编辑,请参见下面的回复)
- 每次重新运行fit函数时,用于计算梯度的点每次都会变化。这就是为什么我每次得到的结果都不一样。
(编辑)(通过在调用fit方法时使用random_state可以使其具有确定性)
- 我还意识到算法运行的迭代次数在10到15之间变化(无论我设置的max_limit是多少)。我找不到scikit中收敛标准的任何信息,但我的猜测是,如果我能使其更严格(即运行更多次迭代),我得到的答案会更接近LinearRegression方法的结果。
(编辑)(收敛标准取决于tol(解的精度)。通过修改此参数(我将其设置为1e-100),我能够得到与LinearRegression报告的相同解)