В этой статье я объясню, как выполнить одиночную линейную регрессию в Python с использованием Keras и TensorFlow.
Полиномы
В старших классах учащиеся получают довольно точное представление о том, что такое многочлены; однако давайте вспомним их основные характеристики и поведение:
- Знак старшего коэффициента многочлена показывает его конечное поведение.
- Степень полиномиальной функции предоставляет информацию о форме, поворотных точках и нулях графика.
- Максимальное количество поворотных точек можно определить, вычитая 1 из степени нашего многочлена.
- Y-отрезок определяется постоянным членом.
- Чем больше степень, тем быстрее растут ее значения.
Большинство многочленов следуют следующему шаблону:
Линейное уравнение — это многочлен степени 1; следовательно, оно имеет такое уравнение:
Or:
Линейная регрессия в действии
Хорошо, теперь у нас есть четкое представление о полиномах, так что давайте займемся ML (машинным обучением). В этом уроке мы будем использовать один из самых интуитивно понятных и простых полиномов:
По сути, этот полином означает, что «y» (выход) будет в 2 раза больше, чем «x» (вход), плюс 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()
В конце концов, мы получили довольно хорошую линию наилучшего соответствия; конечно, чем больше точек и меньше шума, тем лучше регрессия. Я призываю вас поиграть с количеством точек, шумом, масштабированием и уравнениями. Если вы хотите, вы также можете попробовать некоторые настройки этой модели для ввода нескольких значений. Не забудьте поделиться своими результатами в комментариях! 😉😉