В этом уроке вы узнаете две вещи:

  1. Реализовать линейную регрессию с нуля
  2. Используйте модель для прогнозирования цен на подержанные автомобили.

Интуиция

Основная идея линейной регрессии состоит в том, чтобы найти «лучшую» линию (с одним параметром), плоскость (с двумя параметрами) или гиперплоскость (с более чем двумя параметрами).

Вот пример подогнанной строки:

Как линейная регрессия делает прогноз?

Линейная регрессия использует веса и параметры для прогнозирования.

Например, предположим, что линейная регрессия пытается предсказать вашу зарплату после выпуска и принимает в качестве входных данных ваш средний балл, университет и цвет волос. В этом сценарии модель может узнать, что ваш средний балл в два раза важнее, чем университет, в котором вы учились, и узнать, что ваш цвет волос вообще не влияет на вашу зарплату. Таким образом, примерные веса будут такими: средний балл = 30 000, университет = 15 000, цвет волос = 0.

Итак, если ваш средний балл равен 4, ваш университет (после одного горячего кодирования) имеет значение 1, а цвет волос (после одного горячего кодирования) также имеет значение 1, то линейная регрессия сделает прогноз о вашей зарплате следующим образом:

4*30000 + 1*15000 + 0*1 = 135000

В математической записи прогноз вычисляется следующим образом:

Где x и w — векторы параметров и весов соответственно.

Мы знаем параметры, но как нам найти веса?

Градиентный спуск

Мы могли бы найти «лучшие» веса, используя градиентный спуск. Градиентный спуск — это алгоритм оптимизации.

Мы будем использовать градиентный спуск для оптимизации среднеквадратичной ошибки:

Существует реализация функции стоимости в Python:

def compute_cost(X, weights, y):
total_cost = 0
  for i in range(X.shape[0]):
    prediction = np.dot(X[i],weights)
    error = y[i][0] - prediction
    total_cost = total_cost + np.power(error,2)
  cost = total_cost/(2*X.shape[0])
  return(cost)

Нам нужно будет использовать производную функции стоимости, чтобы обновить веса и найти лучшие веса. Веса можно обновить таким образом, потому что производная функции стоимости показывает направление наискорейшего спуска:

Если мы обозначим j-й вес как theta_j, скорость обучения как альфа, общее количество точек данных как m,фактическое значение прогноза как y, количество параметров равно n, тогда веса можно обновить следующим образом:

Примечание: мы должны обновить все веса одновременно (все theta_j, для j=0,1,2,…,n).

В python реализована реализация обновлений весов:

def update_weights(X, weights, learning_rate, weights_past, cost_past, y):
  assert weights.shape[0] ==   X.shape[1], "Unequal shapes"
  suma = np.zeros(X.shape[1])
  for i in range(X.shape[0]):
    for j in range(len(suma)):
      suma[j] = suma[j] + (np.dot(X[i],weights)-y[i][0]) *X[i][j]
  for i in range(weights.shape[0]):
    weights[i] = weights[i] - learning_rate/X.shape[1]*suma[i]
  return(weights)

Использование на практике

Теперь, когда мы реализовали градиентный спуск, мы можем использовать нашу модель в реальном случае!

Взгляните на этот блокнот Kaggle, чтобы узнать, как предсказать цену подержанных автомобилей.

Спасибо за чтение!