Python 线性回归-均方误差过大

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, '

我有一个房屋销售数据集,在此基础上,我应用线性回归。在得到斜率和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, '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