Линейная регрессия - среднеквадратическая ошибка слишком велика - PullRequest
0 голосов
/ 04 октября 2018

У меня есть набор данных о продажах домов, и я применяю линейную регрессию.После получения уклона и 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 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)

И вывод приведенного выше фрагмента:

enter image description here

Итак, мои вопросы:

1.Это правильный способ построить прямую линию на графике x против y?

2.Почему значение стоимости слишком велико, и возможно ли иметь значение стоимости, чтобы быть таким большим, даже если параметры хорошо соответствуют данным.

Редактировать 1

m в выражении print является значением наклона, а не размером X, то есть len (X)

Ответы [ 2 ]

0 голосов
/ 23 августа 2019

Величина ошибки велика из-за ненормализованных входных данных.Согласно вашему коду, x варьируется от 0 до 250к.В этом случае я бы посоветовал вам нормализовать x в [0, 1].При этом я ожидаю, что потери будут небольшими, как и изученные параметры (наклон и перехват).

0 голосов
/ 04 октября 2018

1. Ваш путь к графику кажется правильным, вы, вероятно, можете упростить

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

до

abline_values = slope * X + yIntercept

2. СделаноВы установили m=0.85 в своем примере?Вроде так, но не могу сказать, так как вы не предоставили вызов функции стоимости.Разве это не должен быть размер образца?Если вы сложите все квадратичные ошибки и разделите их на 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
...