Научитесь создавать и кодировать регрессионную модель с нуля, чтобы прогнозировать/предсказывать результаты.
Регрессионный анализ можно описать как статистический метод, используемый для предсказания/прогноза значений зависимой переменной (отклика) при заданных значениях одной или нескольких независимых переменных (предикторов или признаков). Регрессия считается формой контролируемого машинного обучения; это алгоритм, который строит математическую модель для определения взаимосвязи между входными данными и желаемыми выходными данными. Существует множество моделей регрессии, которые можно создать, поэтому давайте сначала рассмотрим математику регрессии, а затем перейдем к трем распространенным моделям.
Математика регрессии
Прежде чем мы рассмотрим какой-либо код, мы должны немного разобраться в математике, лежащей в основе регрессионной модели. Как уже упоминалось, модели регрессии могут иметь несколько входных переменных или функций, но в этой статье для простоты мы будем использовать одну функцию. Регрессионный анализ включает в себя предположение о том, какой тип функции лучше всего подходит для вашего набора данных, будь то линия, полином n-й степени, логарифмическая функция и т. д. Модели регрессии предполагают, что набор данных имеет следующую форму:
Здесь x и y — это наша функция и ответ при наблюдении i, а e — ошибка. Цель регрессионной модели — оценить функцию f так, чтобы она наиболее точно соответствовала набору данных (без учета ошибки). Функция f — это наше предположение о том, какой тип функции лучше всего подходит для нашего набора данных. Это станет более ясно, когда мы перейдем к примерам. Чтобы оценить функцию, нам нужно оценить коэффициенты β. Наиболее распространенным методом является обычный метод наименьших квадратов, который минимизирует сумму квадратов ошибок между нашим набором данных и нашей функцией f.
Минимизация квадратов ошибок приведет к оценке наших коэффициентов β, помеченных как β-шляпа. Оценку можно получить, используя нормальные уравнения, которые являются результатом обычного метода наименьших квадратов:
В свою очередь, мы можем использовать эти оценочные коэффициенты β, чтобы создать оценку для нашей переменной ответа, y.
Значение y-hat здесь представляет собой предсказанные или предсказанные значения для наблюдения, i. Прогноз создается с использованием наших оценочных коэффициентов β и значения признака x.
Чтобы определить, насколько хорошо работает наша регрессионная модель, мы можем рассчитать коэффициент R-квадрат. Этот коэффициент оценивает разброс набора данных вокруг прогноза регрессионной модели. Другими словами, это то, насколько хорошо регрессионная модель соответствует исходному набору данных. Как правило, чем ближе значение к 1,0, тем лучше соответствие.
Чтобы правильно оценить вашу регрессионную модель, вы должны сравнить значения R-квадрата для нескольких моделей (функция, f), прежде чем выбрать, какую из них использовать для прогнозирования будущих значений. Давайте начнем программировать, чтобы лучше понять концепции регрессионных моделей.
Импорт библиотек
Для этих примеров нам понадобятся следующие библиотеки и пакеты:
- NumPy используется для создания числовых массивов (определяется как np для простоты вызова).
- random из NumPy используется для создания шума в функции для имитации реального набора данных.
- pyplotиз matplotlib используется для отображения наших данных и линий тренда.
# Importing Libraries and Packages import numpy as np from numpy import random import matplotlib.pyplot as plt
Создание и отображение набора тестовых данных
Чтобы создать набор данных, мы можем создать массив x
, который будет нашей функцией, и массив y
, который будет нашим ответом. Массив y
представляет собой произвольную экспоненциальную функцию. С помощью пакета random мы добавим шум в наши данные, чтобы имитировать какие-то реальные данные.
# Creating Data x = np.linspace(0, 4, 500) # n = 500 observations random.seed(10) # For consistent results run-to-run noise = np.random.normal(0, 1, x.shape) y = 0.25 * np.exp(x) + noise # Displaying Data fig = plt.figure() plt.scatter(x, y, s=3) plt.title("Test Data") plt.xlabel("x") plt.ylabel("y") plt.show()
Вот набор данных, к которому мы применяем регрессионный анализ:
Давайте на секунду посмотрим на этот сюжет. Мы знаем, что для создания этих данных использовалось экспоненциальное уравнение, но если бы мы не знали этой информации (чего вы не знали бы, выполняя регрессионный анализ), мы могли бы посмотреть на эти данные и решить, что полином 2-й степени подходит для набор данных лучший. Однако рекомендуется оценить несколько разных моделей, чтобы определить, какая из них работает лучше всего. Затем вы будете использовать лучшую модель для создания своих прогнозов. Теперь давайте рассмотрим пару регрессионных моделей по отдельности и посмотрим, как сравниваются их результаты.
Линейная регрессия
Как упоминалось в разделе математики, для регрессионного анализа вы угадываете модель или функцию. Для линейной модели наша функция f принимает следующий вид:
Следующим шагом является создание матриц для нормальных уравнений (в разделе математики), которые оценивают наши коэффициенты β. Они должны выглядеть следующим образом:
Используя наш набор данных, наши оценочные коэффициенты β и, следовательно, модель линейной регрессии будут:
# Linear Regression X = np.array([np.ones(x.shape), x]).T X = np.reshape(X, [500, 2]) # Normal Equation: Beta coefficient estimate b = np.linalg.inv(X.T @ X) @ X.T @ np.array(y) print(b) # Predicted y values and R-squared y_pred = b[0] + b[1] * x r2 = 1 - sum((y - y_pred) ** 2)/sum((y - np.mean(y)) ** 2) # Displaying Data fig = plt.figure() plt.scatter(x, y, s=3) plt.plot(x, y_pred, c='red') plt.title("Linear Model (R$^2$ = " + str(r2) + ")") plt.xlabel("x") plt.ylabel("y") plt.legend(["Data", "Predicted"]) plt.show()
Результирующая регрессионная модель показана ниже:
Как видно из названия графика, модель линейной регрессии имеет значение R-квадрата около 0,75. Это означает, что линейная модель хорошо соответствует данным, но если бы мы собирали больше данных, мы, вероятно, увидели бы существенное уменьшение значения R-квадрата.
Полиномиальная регрессия
Общая форма полиномиальной регрессии выглядит следующим образом:
В этой статье показана форма функции f в виде многочлена второго порядка. Вы можете добавить другие полиномиальные термины аналогичным образом в соответствии с вашими потребностями; однако будьте осторожны с переоснащением.
Создание матриц для нормальных уравнений дает следующее:
Используя эти матрицы, оценочные коэффициенты β и модель полиномиальной регрессии будут следующими:
# Polynomial Regression X = np.array([np.ones(x.shape), x, x ** 2]).T X = np.reshape(X, [500, 3]) # Normal Equation: Beta coefficient estimate b = np.linalg.inv(X.T @ X) @ X.T @ np.array(y) print(b) # Predicted y values and R-squared y_pred = b[0] + b[1] * x + b[2] * x ** 2 r2 = 1 - sum((y - y_pred) ** 2)/sum((y - np.mean(y)) ** 2) # Displaying Data fig = plt.figure() plt.scatter(x, y, s=3) plt.plot(x, y_pred, c='red') plt.title("2$^{nd}$ Degree Poly. Model (R$^2$ = " + str(r2) + ")") plt.xlabel("x") plt.ylabel("y") plt.legend(["Data", "Predicted"]) plt.show()
Получившийся сюжет:
Обратите внимание, что полином 2-й степени гораздо лучше справляется с сопоставлением набора данных и достигает значения R-квадрата около 0,91. Однако, если мы посмотрим на конец набора данных, мы заметим, что модель недооценивает эти точки данных. Это должно подтолкнуть нас к изучению других моделей.
Экспоненциальная регрессия
Если бы мы отказались от полиномиальной модели, нашим следующим выбором могла бы стать экспоненциальная модель вида:
Опять же, создание матриц для нормальных уравнений дает следующее:
Теперь, с оценочными коэффициентами β, регрессионная модель будет выглядеть так:
Обратите внимание, что старший коэффициент экспоненциального члена точно соответствует старшему коэффициенту смоделированных данных.
# Exponential Regression X = np.array([np.ones(x.shape), np.exp(x)]).T X = np.reshape(X, [500, 2]) # Normal Equation: Beta coefficient estimate b = np.linalg.inv(X.T @ X) @ X.T @ np.array(y) print(b) # Predicted y values and R-squared y_pred = b[0] + b[1]*np.exp(x) r2 = 1 - sum((y - y_pred) ** 2)/sum((y - np.mean(y)) ** 2) # Displaying Data fig = plt.figure() plt.scatter(x, y, s=3) plt.plot(x, y_pred, c='red') plt.title("Exponential Model (R$^2$ = " + str(r2) + ")") plt.xlabel("x") plt.ylabel("y") plt.legend(["Data", "Predicted"]) plt.show()
Получившаяся цифра:
Обратите внимание на улучшение значения R-квадрата по сравнению с полиномиальной моделью 2-й степени. Еще более многообещающим является то, что конец набора данных соответствует этой модели лучше, чем полином 2-й степени. Учитывая эту информацию, мы должны использовать экспоненциальную модель для прогнозирования будущих значений y для максимально точного результата.
На этом статья заканчивается. Надеюсь, это даст вам представление о том, как можно выполнять регрессионный анализ в Python и как правильно его использовать в реальных сценариях. Если вы что-то узнали, подпишитесь на меня и ознакомьтесь с другими моими статьями о космосе, математике и Python! Спасибо!