В этом уроке вы узнаете две вещи:
- Реализовать линейную регрессию с нуля
- Используйте модель для прогнозирования цен на подержанные автомобили.
Интуиция
Основная идея линейной регрессии состоит в том, чтобы найти «лучшую» линию (с одним параметром), плоскость (с двумя параметрами) или гиперплоскость (с более чем двумя параметрами).
Вот пример подогнанной строки:
Как линейная регрессия делает прогноз?
Линейная регрессия использует веса и параметры для прогнозирования.
Например, предположим, что линейная регрессия пытается предсказать вашу зарплату после выпуска и принимает в качестве входных данных ваш средний балл, университет и цвет волос. В этом сценарии модель может узнать, что ваш средний балл в два раза важнее, чем университет, в котором вы учились, и узнать, что ваш цвет волос вообще не влияет на вашу зарплату. Таким образом, примерные веса будут такими: средний балл = 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, чтобы узнать, как предсказать цену подержанных автомобилей.
Спасибо за чтение!