Линейная регрессия - один из первых алгоритмов, которые вы изучите, когда начнете свое путешествие в области науки о данных и машинного обучения. В этом блоге мы не только поймем, что такое линейная регрессия, но и реализуем алгоритм с нуля.
Теперь, прежде чем мы погрузимся в это, давайте сначала разберемся, что такое регрессия.
Проще говоря, регрессия - это метод, используемый для определения взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. Это позволяет вам понимать закономерности в данных.
Независимые переменные также известны как функции, а зависимая переменная также известна как цель.
Линейная регрессия - это базовый алгоритм обучения с учителем, который предполагает линейную связь между независимыми переменными и зависимой переменной. Если существует только одна независимая переменная, это называется простой линейной регрессией, а если существует более одной независимой переменной, мы называем это множественной линейной регрессией.
Здесь y - зависимая переменная, theta1 - точка пересечения, theta2 - наклон, а x - независимая переменная. . Оба theta1 и theta2 являются коэффициентами регрессии.
На рисунке выше, чтобы понять тенденцию в данных, нам нужно найти линию, которая наилучшим образом соответствует нашим данным. Для этого мы должны определить значения коэффициентов theta1 и theta2. Но как нам это сделать?
Их можно найти двумя способами. Обычный метод наименьших квадратов, а второй называется Подход градиентного спуска.
Здесь мы будем реализовывать подход градиентного спуска с нуля!
Но что такое подход градиентного спуска?
Градиентный спуск - это итерационный алгоритм оптимизации первого порядка для поиска локального минимума дифференцируемой функции.
В нашем случае эта дифференцируемая функция является функцией стоимости, которая представляет собой ошибку в вычисленных нами значениях коэффициентов theta1 и theta2. Функция стоимости известна как функция потерь, когда учитывается весь обучающий набор.
Наша цель - минимизировать эту функцию стоимости, чтобы мы могли получить наиболее точные значения theta1 и theta2.
Теперь, когда мы знакомы с основами, перейдем к кодированию !!
Не волнуйтесь, шаг за шагом.
Начнем с импорта необходимых библиотек.
import pandas as pd import numpy as np import matplotlib.pyplot as plt
Мы будем использовать очень простой набор данных, чтобы получить четкое представление о части реализации.
Вы можете получить набор данных здесь:
Вот как выглядят наши данные. Довольно просто, правда? В реальных данных нет ничего подобного 😛.
Это изменение заработной платы сотрудника в зависимости от количества лет опыта работы.
Замена имен столбцов на X и Y для удобства:
data=data.rename(columns={data.columns[0]:'X',data.columns[1]:'y'})
Разделение наших данных на обучение и тестирование с помощью train_test_split:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(data.X, data.y, test_size=0.20, random_state=42)
Визуализация данных обучения
plt.xlabel('Years of Experience') plt.ylabel('Salary') plt.title('Salary vs Experience (Training Set)') plt.scatter(X_train,y_train) plt.show()
Как видите, это очень хорошо выглядит как линейная зависимость.
Определение нашей функции стоимости:
def cost(y,ypred): return (1/len(y))*sum(y-ypred)**2
Инициализация параметров:
#Initialize parameters n = float(len(X_train)) alpha=0.001 #learning rate b1=0 #slope b2=0 #intercept
Теперь самое интересное - обучение данных.
epochs=20000 for itr in range(epochs): y_pred = b1*X_train + b2 # The current predicted value of y D1 = (-2/n) * sum(X_train * (y_train - y_pred)) #Derivative wrt b1 D2 = (-2/n) * sum(y_train - y_pred) # Derivative wrt b2 b1 = b1 - alpha * D1 # Update b1 b2 = b2 - alpha * D2 # Update b2 error=cost(y_train,y_pred) print("MSE: ",error,'\n') print (b1,b2)
Посмотрите, какие значения мы получили после обучения данных за 20000 итераций!
Визуализация наших результатов !!
Поздравляю! Мы смогли спрогнозировать наиболее подходящую линию для данных и минимизировать функцию затрат.
Прогнозирование для конкретного тестового случая:
def predict(x): return b2+b1*x predict(1.7)
Результат:
И, глядя на наши данные, есть смысл получить этот ответ.
Итак, мы закончили с нашей реализацией градиентного спуска, и уравнение наиболее подходящей линии, которое мы получили, выглядит следующим образом:
Вот и все. Мы сделали это!!
Надеюсь, эта статья была для вас полезной. Сообщите мне, если вы обнаружите какие-либо ошибки. Не стесняйтесь обращаться ко мне по любым вопросам. Удачного обучения !! 😊
Вы можете найти код в моем профиле Github:
Некоторые полезные ресурсы:
- Https://www.youtube.com/watch?v=sDv4f4s2SB8 (Градиентный спуск от StatQuest)
- Https://towardsdatascience.com/understanding-the-mat Mathematics-behind-gradient-descent-dde5dc9be06e
- Https://mubaris.com/posts/linear-regression/
- Https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931
- Https://www.coursera.org/learn/machine-learning (курс машинного обучения, автор Эндрю Нг)
Свяжитесь со мной:
LinkedIn: https://www.linkedin.com/in/somya22/
Почта: [email protected]