Python 线性回归-均方误差过大
我有一个房屋销售数据集,在此基础上,我应用线性回归。在得到斜率和y截距后,我绘制了图并计算了成本,我得到的结果对我来说有点奇怪,因为Python 线性回归-均方误差过大,python,machine-learning,linear-regression,Python,Machine Learning,Linear Regression,我有一个房屋销售数据集,在此基础上,我应用线性回归。在得到斜率和y截距后,我绘制了图并计算了成本,我得到的结果对我来说有点奇怪,因为 来自参数的线很好地拟合了数据 但同一参数的成本价值是巨大的 这是绘制直线的代码 def plotLine(slope, yIntercept, X, y): abline_values = [slope * i + yIntercept for i in X] plt.scatter(X, y) plt.plot(X, abline_values, '
def plotLine(slope, yIntercept, X, y):
abline_values = [slope * i + yIntercept for i in X]
plt.scatter(X, y)
plt.plot(X, abline_values, 'black')
plt.title(slope)
plt.show()
下面是计算成本的函数
def computeCost(m, parameters, x, y):
[yIntercept, slope] = parameters
hypothesis = yIntercept - np.dot(x, slope)
loss = hypothesis - y
cost = np.sum(loss ** 2) / (2 * m)
return cost
下面几行代码给出了x vs y图,其中包含计算参数(为了简化这个问题,我已经手动设置了参数)和成本值
yIntercept = -70000
slope = 0.85
print("Starting gradient descent at b = %d, m = %f, error = %f" % (yIntercept, slope, computeCost(m, parameters, X, y)))
plotLine(slope, yIntercept, X, y)
上面代码段的输出是
因此,我的问题是:
1。这是绘制x与y平面上直线的正确方法吗?
2。为什么成本值太大,即使参数很好地拟合数据,成本值也可能如此大。
编辑1
print语句中的m是斜率值,而不是X的大小,即len(X)1。您的绘图方式似乎正确,您可能可以简化
abline_values = [slope * i + yIntercept for i in X]
到
2.您在示例中是否设置了m=0.85
?似乎是这样,但我无法判断,因为您没有提供对成本函数的调用。不应该是样本的大小吗?如果将所有平方误差相加并除以2*0.85,则误差大小取决于样本大小。由于这不是一个相对误差,而且数值相当大,所以所有这些误差加起来可能会导致这个巨大的数字。试着将m设置为样本的大小。
此外,假设值的计算符号存在错误,应为a+。否则你会有一个负斜率,这也解释了很大的误差
def computeCost(parameters, x, y):
[yIntercept, slope] = parameters
hypothesis = yIntercept + np.dot(x, slope)
loss = hypothesis - y
cost = np.sum(loss ** 2) / (2 * len(x))
return cost
1.您的绘图方式似乎正确,您可能可以简化
abline_values = [slope * i + yIntercept for i in X]
到
2.您在示例中是否设置了m=0.85
?似乎是这样,但我无法判断,因为您没有提供对成本函数的调用。不应该是样本的大小吗?如果将所有平方误差相加并除以2*0.85,则误差大小取决于样本大小。由于这不是一个相对误差,而且数值相当大,所以所有这些误差加起来可能会导致这个巨大的数字。试着将m设置为样本的大小。
此外,假设值的计算符号存在错误,应为a+。否则你会有一个负斜率,这也解释了很大的误差
def computeCost(parameters, x, y):
[yIntercept, slope] = parameters
hypothesis = yIntercept + np.dot(x, slope)
loss = hypothesis - y
cost = np.sum(loss ** 2) / (2 * len(x))
return cost
由于输入数据不规范,错误值较大。根据您的代码,
x
从0到250k不等。在这种情况下,我建议将x
标准化为[0,1]。因此,我认为损失很小,学习的参数(斜率和截距)也很小。由于输入数据不规范,误差值很大。根据您的代码,x
从0到250k不等。在这种情况下,我建议将x
标准化为[0,1]。因此,我希望损失很小,学习的参数(斜率和截距)也很小。实际上,我调用的是成本函数,它在打印行中。第一个参数是m,是len(X),所以我已经在做你建议的了,我猜好了,这有点混乱,因为你把斜率值打印成m。调用在那里,但不是m的值。你应该在你的问题中,在你的成本函数中加上它,不是吗?假设=yIntercept-np.dot(x,slope)
,因此假设=yIntercept+np.dot(x,slope)
?是的,你是对的。我在代码中修正了它,但成本值仍然是5295011870.385715实际上,我在调用成本函数,它在打印行中。第一个参数是m,是len(X),所以我已经在做你建议的了,我猜好了,这有点混乱,因为你把斜率值打印成m。调用在那里,但不是m的值。你应该在你的问题中,在你的成本函数中加上它,不是吗?假设=yIntercept-np.dot(x,slope)
,因此假设=yIntercept+np.dot(x,slope)
?是的,你是对的。我在代码中修复了它,但成本值仍然是5295011870.385715