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

Полиномы

В старших классах учащиеся получают довольно точное представление о том, что такое многочлены; однако давайте вспомним их основные характеристики и поведение:

  • Знак старшего коэффициента многочлена показывает его конечное поведение.
  • Степень полиномиальной функции предоставляет информацию о форме, поворотных точках и нулях графика.
  • Максимальное количество поворотных точек можно определить, вычитая 1 из степени нашего многочлена.
  • Y-отрезок определяется постоянным членом.
  • Чем больше степень, тем быстрее растут ее значения.

Большинство многочленов следуют следующему шаблону:

Линейное уравнение — это многочлен степени 1; следовательно, оно имеет такое уравнение:

Or:

Линейная регрессия в действии

Хорошо, теперь у нас есть четкое представление о полиномах, так что давайте займемся ML (машинным обучением). В этом уроке мы будем использовать один из самых интуитивно понятных и простых полиномов:

По сути, этот полином означает, что «y» (выход) будет в 2 раза больше, чем « (вход), плюс 1 для всех действительных чисел. Например, если x = 3:

Однако на реальных данных точки не такие идеальные, поэтому я создал образец графика рассеяния, где точки немного отклоняются от фактического уравнения:

Итак, давайте посмотрим, как создать простую модель TensorFlow и Keras для представления этого простого уравнения и наших данных. Прежде всего, мы должны определить архитектуру нашей модели: количество скрытых слоев и нейронов, которые мы будем использовать. Для этого мы будем использовать модель, которая имеет только 1 нейрон и отсутствует скрытые слои. Мы видим, что линейная регрессия подходит, поскольку в уравнении 1.1 всего 2 переменные: наклон (+2) и константа (+1). Наклон соответствует весу модели, а константа — смещению. Таким образом, мы можем ожидать, что получим это уравнение из нашей модели:

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

Зная уравнения 1.2 и 1.3, мы можем представить фактический результат в терминах веса, смещения и ошибки:

Итак, давайте создадим нашу модель линейной регрессии.

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

import numpy as np
x = np.arange(30)/30
y = 2*x +1 + 0.6*(np.random.rand(30)-0.5)

Это данные, которые я создал:

Теперь давайте создадим последовательнуюмодель с одним нейроном. Мы также скомпилируем модель с помощью Adam Optimizer и воспользуемся среднеквадратичной ошибкой (MSE). Наконец, мы обучим нашу модель на 10 000 эпох. Это выглядит огромным числом; тем не менее, мы не должны бояться, потому что мы не будем перенастраивать такую ​​простую модель, и у нас есть небольшое количество значений для обучения.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D, InputLayer

model = Sequential([
               InputLayer((1,)),
               Dense(1) ])
model.compile(optimizer='adam',
              loss=tf.keras.losses.mean_squared_error,
              metrics=[])
history = model.fit(
              x,
              y,
              epochs=10000)

После тренировки я лично получил убыток 0,0426, что нормально для режима, зная, что у нас было всего 30 баллов с шумом. Теперь мы готовы построить наши данные и уравнение, которое наша модель нашла для нас:

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 4))
plt.scatter(x, y, label='x vs y', c='blue')
plt.plot(x, model.predict(x), label='x vs y', c='green')
plt.show()

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