线性回归-均方误差太大

时间:2018-10-04 08:58:42

标签: python machine-learning linear-regression

我有一个房屋销售数据集,在那上面,我正在应用线性回归。得到斜率和y截距后,我绘制图形并计算成本,得到的结果对我来说有点奇怪,因为

  1. 参数行非常适合数据
  2. 但是相同参数的成本价值巨大

这是绘制直线的代码

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与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)

以上代码段的输出为

enter image description here

所以,我的问题是:

1。这是在x与y上绘制直线的正确方法吗?

2。为什么成本值太大,并且即使参数很好地拟合了数据,成本值也可能这么大。

编辑1

打印语句中的m是斜率值而不是X的大小,即len(X)

2 个答案:

答案 0 :(得分:2)

1。。您的绘制方式似乎正确,您可以简化

abline_values = [slope * i + yIntercept for i in X]

abline_values = slope * X + yIntercept

2。。您是否在示例中设置了m=0.85?看起来是这样,但由于您未提供对cost函数的调用,因此我无法确定。不应该是样本的大小吗?如果将所有平方误差相加并除以2 * 0.85,则误差的大小取决于样本量。而且由于这不是相对误差,而且值很大,因此所有这些误差可能加起来就是这个巨大的数字。尝试将m设置为样本的大小。 另外,假设值的计算符号中有误差,应该为+。否则,您将具有负斜率,这也说明了较大的误差。

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 :(得分:0)

由于输入数据未标准化,因此错误值很大。根据您的代码,x从0到250k不等。在这种情况下,建议您将x标准化为[0,1]。这样,我希望损失很小,学习的参数(斜率和截距)也很小。