Понимание линейной регрессии и применение различных модулей Python для ее реализации.

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

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

1- Numpy: для массивов, матриц, многомерных матриц и всех операций, связанных с ними.

2- Keras: высокоуровневый интерфейс для TensorFlow. Он используется для поддержки и реализации моделей глубокого обучения, а также поверхностных моделей. Он был разработан инженером Google.

3- PyTorch: более быстрый модуль для глубокого обучения на основе Torch. Он был разработан Facebook.

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

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

Линейная регрессия

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

Y = W*X + B

Это уравнение записывается в матричной форме. Y — выходная матрица, X — входная матрица, W — матрица весов, а B — вектор смещения. Веса и смещения являются параметрами линейной регрессии. Иногда веса и смещения называются наклонами и отрезками по оси Y соответственно.

Модель пытается оценить эти параметры, сначала случайным образом инициализируя их. Затем он использует полученные данные для расчета выходных данных. Расчетный выходной сигнал сравнивается с фактическим выходным сигналом путем измерения ошибки, и параметры обновляются соответствующим образом. Ошибка называется L2-нормой (сумма квадратов ошибок) и определяется как:

Это функция потерь, и она может иметь разные формулы. i — количество выборок данных, y — прогнозируемый результат, аt является истинной целью. Параметры обновляются на основе правила градиентного спуска, заданного в следующих уравнениях:

Здесь 𝜂 (греческая буква, называемая эта) — это скорость обучения, которая определяет шаг обновления параметров (скорость обновления). 𝛿 (греческая буква, называемая дельта) — это просто разница между прогнозируемым и истинным выходными данными. iпредставляет итерацию (так называемую эпоху). 𝛻 L(W) — это градиент (производная) функции потерь по отношению к весу.Одно замечание, касающееся значения скорости обучения. Меньшие значения могут привести к более медленному обучению, в то время как большие значения могут привести к колебаниям вокруг локальных минимумов или расхождению (невозможности достижения локальных минимумов функции потерь).На рисунке 2 обобщается все вышеперечисленное. .

Теперь давайте погрузимся в практическую часть (часть кодирования) для каждого модуля. У нас будут реализации трех модулей в отдельных разделах.

Реализация Numpy

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

Для упрощения реализации мы будем рассматривать линейную зависимость с одним признаком и смещением (y = w1*x1 + b).

Начнем с импорта модуля Numpy для реализации модели линейной регрессии и Matplotlib для визуализации.

Нам нужны данные для работы. Данные состоят из одной функции и одного вывода. Для генерации признаков мы создадим 1000 выборок, взятых из случайного равномерного распределения.

Чтобы сгенерировать вывод (цель), мы будем использовать следующее соотношение:

Y = 13 * X + 2 + шум

Это то, что мы попытаемся оценить с помощью модели линейной регрессии. Вес имеет значение 13, а смещение равно 2. Переменная шума используется для добавления некоторой случайности.

Давайте построим сгенерированные данные.

Рисунок 3 показывает эту линейную зависимость:

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

[[-0.02509198]]
[0.09014286]

Мы также устанавливаем скорость обучения для нашего обучения. Мы выбрали значение 0,02. Вы можете изучить производительность, попробовав разные значения. Теперь у нас есть данные, мы инициализировали параметры и установили скорость обучения. Мы готовы начать тренировочный процесс. Мы перебираем данные, устанавливая эпохи равными 100. В каждой эпохе мы используем начальные параметры для расчета новых выходных данных и сравнения их с фактическими выходными данными. Функция потерь используется для обновления параметров в соответствии с упомянутым ранее правилом градиентного спуска. Недавно обновленные параметры используются в следующей итерации. Этот процесс повторяется до тех пор, пока не будет достигнуто количество эпох. Могут быть и другие критерии для прекращения обучения, но они выходят за рамки.

Мы можем наблюдать потери при обучении в каждую эпоху.

Как видно из Рис. 4, потери уменьшаются в каждую эпоху. Это означает, что модель становится все ближе и ближе к истинным значениям параметров. Через несколько эпох потери существенно не меняются. Это означает, что модель сошлась и параметры больше не обновляются (или обновляются очень и очень мало).

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

Будет создан график, показанный на Рис. 5. Мы даже можем распечатать значения параметров после последней эпохи. Понятно, что обновленные параметры настолько близки к реальным.

[[13.09844702]] [1.73587336]

Поздравляем! Теперь вы знаете, как реализовать модель линейной регрессии с помощью Numpy. Следующий раздел посвящен реализации Keras. Взволнованный? запрыгивай.

Реализация Keras

Как обычно, начинаем с импорта необходимых модулей. TensorFlow — сердце этой реализации. Это необходимо для построения модели. Keras — это абстракция TensorFlow для более простого использования.

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

Теперь самое интересное — построение модели линейной регрессии. В Keras есть класс под названием Sequential. Он используется для укладки слоев, создающих модель. Поскольку у нас есть только одна функция и выходные данные, у нас будет только один слой, который называется Dense. Этот слой отвечает за линейное преобразование (W*X+B), которое мы и хотим для нашей модели. Слой имеет одну вычислительную единицу, называемую нейроном, для расчета выходных данных, поскольку это регрессионная модель. Для инициализации ядра (веса) и смещения мы применили равномерное случайное распределение в заданном диапазоне (такое же, как в Numpy, но указанное внутри слоя).

Для обучения модели существует метод fit, который делает всю работу за вас. Итак, мы сначала загружаем данные, указываем признаки и метки, а также устанавливаем эпохи. Прежде чем мы обучим модель, мы настроим модель, выбрав правильный оптимизатор и функцию потерь. это то, что делает compile. Мы использовали стохастический градиентный спуск со скоростью обучения 0,02 (такой же, как и раньше), а потеря представляет собой среднеквадратичную ошибку.

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

(array([1.9999999], dtype=float32), array([[13.1]], dtype=float32))

Удивительный! Теперь вы знаете, как реализовать модель линейной регрессии с помощью TensorFlow, давайте перейдем к нашей последней части. Но перед этим следует упомянуть один момент. TensorFlow может сэкономить вам много усилий и строк кода при создании сложных моделей с тысячами параметров и различными слоями. Здесь это неясно, так как модель слишком проста.

Реализация PyTorch

Чтобы начать реализацию, мы импортируем Torch. Факел обязателен, так как он будет использоваться для создания модели.

Часть генерации данных не показана, потому что она такая же, как и раньше. Но есть дополнительные строки, которые нужно добавить в код. Факел работает только с тензорами. Тензоры — это всего лишь способ выражения многомерных матриц. Здесь как массивы признаков, так и целевые массивы преобразуются в тензоры. Наконец, из этих двух тензоров создается тензорный набор данных.

(tensor([9.0143]), tensor([119.2695]))

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

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

1- Модель и партия должны быть на одном устройстве (ЦП или ГП).

2- Модель должна быть переведена в режим обучения.

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

OrderedDict([('0.weight', tensor([[13.0287]], device='cuda:0')), ('0.bias', tensor([2.0096], device='cuda:0'))])

В качестве последнего шага мы можем построить график потерь при обучении по эпохам, чтобы наблюдать за производительностью модели. Это показано на Рис. 6.

Фантастика. Реализация сделана. Давайте подытожим то, что мы узнали до сих пор.

Заключение

Линейная регрессия считается одной из самых простых моделей машинного обучения для реализации и интерпретации. Вы можете быть шокированы, если узнаете, что эта простая модель хорошо работает для некоторых типов задач. В этой статье мы реализовали линейную регрессию, используя три разных популярных модуля в Python. Есть и другие модули, которые можно использовать для создания. Например, Scikit Learn. Все коды вы найдете в этом репозитории GitHub.

Ссылки

[1] Мубайед, Абдалла и Инджадат, Мохаммаднор и Нассиф, Али и Лутфия, Ханан и Шами, Абдалла. (2018). Электронное обучение: проблемы и исследовательские возможности с использованием машинного обучения и анализа данных. IEEE-доступ. ПП. 1–1. 10.1109/ДОСТУП.2018.2851790.