Основы науки о данных

Объяснение линейной регрессии

Узнайте, как работает этот алгоритм машинного обучения с учителем

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

Мы увидим несколько примеров кода, написанных на Python, однако читатель может усвоить концептуальные знания, не зная Python.

Обзор 📜

Линейная регрессия - это алгоритм машинного обучения для прогнозирования непрерывной цели.

Уравнение линейной регрессии представлено следующим образом:

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

Тренировка линейной регрессии 🔧

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

Ошибки возводятся в квадрат, так что положительные и отрицательные ошибки не отменяют друг друга. Есть два способа найти лучший набор параметров:
◼ Используя обычное уравнение
◼ Используя алгоритм оптимизации

📍 Используя нормальное уравнение

Нам нужно будет знать основы транспонирования матриц, умножения матриц и инверсии матриц, чтобы следовать следующему примеру с нормальным уравнением. Прежде чем мы углубимся, давайте быстро освежим эти темы.

Транспонирование матрицы. Вот формула транспонирования матрицы 2x2:

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

Умножение матриц. Вот формула умножения двух матриц 2x2:

Вот пример:

Обратная матрица. Чтобы матрица имела обратную матрицу, она должна быть квадратной матрицей (т. е. количество строк = количество столбцов). Вот формула для нахождения обратной матрицы матрицы 2x2:

Матрица не будет иметь обратной, если ее определитель (т.е. ad-bc) равен нулю. Такая матрица называется сингулярной матрицей.

Вот пример поиска обратной матрицы:

Теперь мы готовы познакомиться с нормальным уравнением:

Давайте перепишем наше линейное уравнение так, чтобы точка пересечения была специальным коэффициентом, в котором соответствующая функция x0 принимает постоянное значение 1:

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

Снизу мы видим X, матрицу 5x2 для функций. Первый столбец показывает x0, а второй столбец показывает x1 для 5 обучающих примеров. Сначала мы умножим X^T на X:

Теперь давайте найдем обратное:

Далее мы умножим его на X_T:

Наконец, мы умножим его на фактические целевые значения, чтобы найти лучшие параметры:

Вот и все! Мы находим, что точка пересечения составляет 0,3588, а коэффициент - 0,2647. Мы также можем выполнить тот же расчет в Python для расчета параметров:

import numpy as np
import pandas as pd
pd.options.display.precision = 4
from sklearn.linear_model import LinearRegression
# Create sample data
train = pd.DataFrame({'x1': [8, 15, 6, 16, 20], 
                      'y': [4, 3, 1, 5, 6]})
train

# Add x0=[1, 1, .., 1] for the intercept such that X is 5x2 matrix
x0 = np.ones(train.shape[0])[:, np.newaxis]
X = np.concatenate((x0, train.drop(columns='y')), axis=1)
# Reshape y from 1D to 2D such that Y is 5x1 matrix
Y = train['y'].values.reshape(-1,1)
# Find best parameters for the model
theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)
print(f"Intercept: {theta[0][0]:.4f}")
print(f"Coefficient for x1: {theta[1][0]:.4f}")
# Predict
train['y_hat_manual'] = X.dot(theta)
train['residual'] = train['y'] - train['y_hat_manual']
train

Давайте быстро сверим это с выводом Scikit-learn:

# Check parameters against sklearn
model = LinearRegression()
model.fit(train[['x1']], train['y'])
print(f"Intercept: {model.intercept_:.4f}")
print(f"Coefficient for x1: {model.coef_[0]:.4f}")
# Check predictions against sklearn
train['y_hat_sklearn'] = model.predict(train[['x1']])
train

Отлично, результаты совпадают!

Следует отметить, что бывают случаи, когда нормальное уравнение не работает, если X^T ⋅ X сингулярно (т.е. определитель равен нулю).

📍 Использование алгоритма оптимизации

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

Интерпретация параметров линейной регрессии🔎

Перехват сообщает нам ожидаемое целевое значение, когда все функции равны 0.

В нашем примере предполагается, что цель будет 0,2647, когда функция x1 равна нулю:

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

Когда характеристика x1 увеличивается на одну единицу, ожидается, что цель увеличится на 0,3588:

Это было для этого поста! Надеюсь, вам понравилось углублять свои знания о линейной регрессии. Мы также обновили базовую линейную алгебру (например, умножение матриц и обратную матрицу) по пути. Наконец, возможность объяснить, как интерпретировать результаты линейной регрессии, полезна при объяснении движущих сил модели другим. Если вы хотите узнать больше, ознакомьтесь с этим ресурсом по предположениям линейной регрессии.

Спасибо, что прочитали мою статью. Если вам интересно, вот ссылки на некоторые из моих других сообщений:

◼️️ Объяснение K-ближайших соседей
◼️️ Сравнение случайного леса и повышения градиента
◼️️ Как строятся деревья решений?
◼️️ Объяснение Pipeline, ColumnTransformer и FeatureUnion
◼️️ FeatureUnion, ColumnTransformer и конвейер для предварительной обработки текстовых данных

Пока пока 🏃 💨

Ссылки 📁

  • Аурелиен Джерон, Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow, 2017 г. - Глава 4