我试图比较线性回归(正常方程)与SGD,但看起来SGD是遥远的。我做错什么了吗?
这是我的代码
x = np.random.randint(100, size=1000)
y = x * 0.10
slope, intercept, r_value, p_value, std_err = stats.linregress(x=x, y=y)
print("slope is %f and intercept is %s" % (slope,intercept))
#slope is 0.100000 and intercept is 1.61435309565e-11
这是我的新币
x = x.reshape(1000,1)
clf = linear_model.SGDRegressor()
clf.fit(x, y, coef_init=0, intercept_init=0)
print(clf.intercept_)
print(clf.coef_)
#[ 1.46746270e+10]
#[ 3.14999003e+10]
我本以为coef
和intercept
几乎相同,因为数据是线性的。
2条答案
按热度按时间093gszye1#
当我试图运行这段代码时,我得到了一个溢出错误。我怀疑你有同样的问题,但由于某种原因,它没有抛出错误。
如果您缩小功能,一切都按预期工作。使用
scipy.stats.linregress
:使用
linear_model.SGDRegressor
:slope
的值稍低,但我猜这是因为正则化的原因。oyxsuwqo2#
我在参数上使用了
GridSearchCV()
,发现除了微调超参数之外,主要问题是loss
参数,默认情况下是'squared_error'
,所以只需在SGD模型/管道中将其设置为'huber'
,如下所示:SGDRegressor(loss='huber')
基于documentation的可能解释如下:
...'squared_error'是指普通最小二乘拟合。'huber'修改了'squared_error',通过从平方损失切换到线性损失超过epsilon的距离来减少对异常值正确性的关注。...
PS I使用
GridSearchCV
如下: