Всем привет, это моя первая публикация на Medium. Для начала я подумал, что было бы лучше опубликовать довольно простой пост. Я решил реализовать линейную регрессию с градиентным спуском без использования какой-либо доступной библиотеки ML, потому что большинство библиотек помогают нам выполнять линейную регрессию, не раскрывая нам внутреннюю работу алгоритма.

Линейная регрессия - это базовая модель, которая учится отображать линейные входы на линейные выходы. Например, мы можем построить модель линейной регрессии, которая предсказывает вес с учетом роста человека. Чтобы прогнозировать вес человека на основе роста, мы выбираем данные из совокупности, беря вес каждого человека вместе с его ростом. Под выборкой данных из населения я имел в виду, что мы случайным образом подходим к нескольким людям и измеряем их вес и рост.

После сбора данных наша задача - спрогнозировать вес человека с учетом его роста. Мы можем использовать модель линейной регрессии для моделирования линейной зависимости между весом и ростом человека. Нелинейная зависимость между весом и ростом человека также возможна, но более разумно предположить, что вес зависит от роста линейно, потому что чем выше человек, тем больше он весит.

Чтобы познакомить вас с терминами, используемыми в машинном обучении, вес в приведенном выше примере называется зависимой переменной, поскольку это переменная, которую мы прогнозируем, а высота называется независимой переменной, потому что это переменная, которую мы используем в качестве входных данных для модели. Чтобы быть более общим, я буду использовать термины независимая переменная и зависимая переменная.

Для простоты я рассматриваю одну независимую функцию и одну зависимую функцию. Мы можем смоделировать линейную связь между зависимой переменной и независимой переменной следующим образом:

На приведенной выше диаграмме «m» представляет значение увеличения y при увеличении x на единицу. Например, если y увеличивается на 2, когда мы увеличиваем x на 1, «m» становится 2. Другой пример: если y увеличивается на 10, когда мы увеличиваем x на 2, то «m» становится 5, что составляет 10/2. Здесь мы должны учитывать, насколько увеличивается y при увеличении x на 1. «b» представляет собой точку пересечения, которая равна значению y, когда x = 0.

Нам просто нужны две точки, чтобы вычислить a и b с помощью следующих формул. Предполагая (x1, y1) и (x2, y2) как две точки на плоскости,

m= (y2–y1)/(x2-x1)

b = y1 — x1*(y2-y1)/(x2-x1)

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

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

Мы используем что-то, называемое MSE, которое представляет собой среднеквадратичную ошибку, чтобы помочь нам найти оптимальную линию, которая может проходить через набор точек, подобных тем, которые присутствуют на приведенном выше графике. Мы рассчитываем MSE по следующей формуле:

Наша задача - найти оптимальные значения «m» и «b», при которых указанная погрешность минимальна. Ошибка иногда также называется стоимостью. Вы могли правильно предсказать это, поскольку мы говорим о минимуме, можно использовать итерационные алгоритмы для поиска параметров, которые минимизируют функцию. Вот где пригодится алгоритм градиентного спуска. Алгоритм градиентного спуска обновляет «m» и «b» таким образом, что каждый приближается к минимальному значению при итерации по данным. Мы начинаем с вычисления наклона функции стоимости, описанной выше, и с небольшим шагом продвигаемся в обратном направлении. Вы можете найти визуальное представление алгоритма градиентного спуска ниже.

Мы обновляем веса следующим образом:

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

Обновления для уклона «m» и «b» следующие:

Теперь давайте перейдем к коду. Вы можете найти блокнот jupyter со всем кодом, доступным по адресу 01_Linear Regression with Gradient Descent from Scratch по ссылке ниже,

Https://github.com/kkchaitu27/Tutorials/

Я использую scikit-learn для создания набора данных с одной зависимой переменной и одной независимой переменной следующим образом:

X, y = make_regression (n_samples = 100, n_features = 1, n_informative = 1, noise = 15, random_state = 2021)

Если мы используем scikit-learn, чтобы подогнать линейную регрессию к приведенным выше данным, мы получим следующие значения для m и b соответственно.

m = 71,79063475 и b = 0,6807397854798136

Для обновления m и b на каждом этапе градиентного спуска мы используем следующие строки кода:

y_pred = X * m + b
y_diff = (y.reshape (-1,1) - y_pred)
dm = -2 * (np.sum (y_diff * X) /X.shape [0 ])
db = -2 * (np.sum (y_diff) /X.shape [0])
m = m - alpha * dm
b = b - alpha * db

Мы используем следующие настройки для алгоритма градиентного спуска,

m = 0 # наклон
b = 0 # интервал
alpha = 0.005 # скорость обучения
iter_num = 1000 # количество итераций

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

Надеюсь, вам понравился этот урок. Поделитесь этим со своими знакомыми, если вы найдете этот урок информативным.