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

В этом руководстве мы реализуем самый простой алгоритм машинного обучения под названием «Линейная регрессия». Если бы мы описали линейную регрессию одной строкой, это было бы примерно так:

«Построение прямой линии через точки данных»

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

Это руководство будет состоять из 3 основных частей:

· Понимание и поэтапная реализация алгоритма.

· Применение построенного алгоритма к 2-мерным данным (для лучшей визуализации).

· Применение алгоритма к n-мерным данным.

** Весь код, используемый в этом руководстве, можно найти в следующем репозитории GitHub **.

Давайте начнем.

Пошаговая реализация

Базовое понимание

Как мы уже обсуждали ранее, линейная регрессия так же проста, как подгонка прямой линии к нашим данным, поэтому для базового понимания нам нужно вернуться к некоторым основам математики и взглянуть на уравнение для прямой линии.

В приведенном выше уравнении X и Y - это точки данных, а m и c - наклон и пересечение по оси Y соответственно. Нам нужны соответствующие значения для «m» и «c», чтобы построить подходящую прямую линию.

Допустим, у нас есть несколько значений «X», против которых у нас есть одно «Y», тогда мы можно изменить приведенное выше уравнение, чтобы создать более общее уравнение следующим образом:

Теперь вместо «m» и «c» нам нужно найти «c» и все коэффициенты X от a_0 до a_n, и это полная концепция многомерной линейной регрессии.

Реализация

Нам понадобятся следующие библиотеки для основных математических функций и визуализации.

Во-первых, мы определяем функцию, которая будет возвращать нам предсказанные значения y (обычно называемые Y-hat) из некоторых заданных значений c и a.

Затем нам нужно вычислить, насколько далеко мы были от исходных значений Y. В терминах машинного обучения это называется вычислением стоимости. Определено несколько различных функций стоимости, но в нашем случае мы будем использовать старую добрую «ошибку среднего квадрата». Функция для MSE:

Давайте закодируем это:

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

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

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

Окончательные уравнения для обновления значений наших параметров приведены ниже:

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

Давайте закодируем эти уравнения обновления в общем виде, так что число n параметров может быть обновлено.

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

Тестирование

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

Мы нормализуем данные, используя метод минимального-максимального масштабирования. Давайте определим функцию для минимального и максимального масштабирования. (Есть несколько библиотек, которые могут сделать это за вас, но кодировать гораздо интереснее)

data_scaled = min_max_scaler(data_train)

Закончив нормализацию, мы можем приступить к подгонке данных к нашей модели.

X_train = data_scaled["x"].values.reshape(-1,1)
y_train = data_scaled["y"].values.reshape(-1,1)
coeff, intercept, preds = fit(X_train, y_train, iterr = 3000)

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

Мы видим, что наша модель довольно точно подходит для обучающей выборки и достаточно хорошо для тестовой. Результаты могут улучшиться, если модель обучить большему количеству итераций. (Эксперименты на ваше усмотрение 😀)

Еще одна хорошая мера для проверки нашей модели - это «Значение квадрата R», также известное как «степень соответствия». Для этого воспользуемся библиотекой sklearn (потому что иногда кодить устаешь😅).

from sklearn.metrics import r2_score  
print("R_square Score:",r2_score(data_test["y"],y_pred))

Приведенная выше оценка показывает, что 92,6% соответствия - это неплохой показатель.

Тестирование n-мерных данных

Теперь проверим, действительно ли наш алгоритм работает с n-мерными данными. Для этого мы использовали набор данных о ценах на жилье. (Исходный набор данных имеет множество функций, но мы выбрали только некоторые из них для целей этого теста)

Поскольку большинство функций были типами строковыми, мы преобразовываем их в числовые метки.

Мы нормализуем набор данных, как и раньше, и настраиваем его на обучение на 2000 эпох.

weights, biases, y_predicted = fit(X_train,y_train, iterr = 2000)

Окончательная стоимость снова довольно низкая, как и следовало ожидать. Теперь давайте проверим «Квадратное значение R».

from sklearn.metrics import r2_score
print(r2_score(y_test,predicted))

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

Заключение

Мы успешно реализовали алгоритм линейной регрессии с использованием Python и достигли достаточно хорошего соответствия нашему исходному набору данных. Мы не получили очень хорошую оценку по нашему второму набору данных (с несколькими переменными), потому что для такого сложного набора данных очень сложно следовать линейному тренду. Для таких наборов данных существуют такие алгоритмы, как «Полиномиальная регрессия» или SVM. Эти алгоритмы немного сложнее, но они дают гораздо лучшие результаты.