为啥我的 SGD 与我的线性回归模型相差甚远?
Posted
技术标签:
【中文标题】为啥我的 SGD 与我的线性回归模型相差甚远?【英文标题】:Why my SGD is far off than my linear regression model?为什么我的 SGD 与我的线性回归模型相差甚远? 【发布时间】:2015-10-03 08:25:58 【问题描述】:我正在尝试将线性回归(正态方程)与 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
几乎与线性数据相同。
【问题讨论】:
【参考方案1】:当我尝试运行此代码时,出现溢出错误。我怀疑你有同样的问题,但由于某种原因,它没有抛出错误。
如果您缩小功能,一切都会按预期工作。使用scipy.stats.linregress
:
>>> x = np.random.random(1000) * 10
>>> 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 -2.22044604925e-15
使用linear_model.SGDRegressor
:
>>> clf.fit(x[:,None], y)
SGDRegressor(alpha=0.0001, epsilon=0.1, eta0=0.01, fit_intercept=True,
l1_ratio=0.15, learning_rate='invscaling', loss='squared_loss',
n_iter=5, penalty='l2', power_t=0.25, random_state=None,
shuffle=False, verbose=0, warm_start=False)
>>> print("slope is %f and intercept is %s" % (clf.coef_, clf.intercept_[0]))
slope is 0.099763 and intercept is 0.00163353754797
slope
的值稍低,但我猜这是因为正则化。
【讨论】:
我想知道为什么np.random.randint(100, size=1000)
不能作为 x 工作?因为那是我打算使用的数据。这是客户可能为一顿饭支付的总账单金额。
@toy,在使用 ML 技术之前,数据几乎总是需要缩放到 [-1,1] 或 [0,1]。请参阅 SGD 文档的 Practial Tips 部分。此外,您将需要 5 次以上的迭代,而只有 1000 个示例。请参阅同一部分。以上是关于为啥我的 SGD 与我的线性回归模型相差甚远?的主要内容,如果未能解决你的问题,请参考以下文章