Машинное обучение: как легко понять множественную линейную регрессию

Начните с множественной линейной регрессии и как ее реализовать с помощью Python

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

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

Как на самом деле работает множественная линейная регрессия?

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

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

цена= 100 + 50(частота процессора) + 20(экран) + 15(оперативная память) — 15(вес ноутбука)

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

Если вес функции выше (положительный или отрицательный), мы можем предположить, что эта функция очень важна, влияя на цену ноутбука. Однако что, если вес равен 0? Функция с весом 0 указывает на то, что эта функция не имеет отношения к цене ноутбука [1].

Выше мы сделали простое описание того, как работает множественная линейная регрессия. В общем, множественная линейная регрессия имеет следующее уравнение:

В этом уравнении:

  • y — прогнозируемое значение или зависимая переменная.
  • x – это признаки или независимая переменная.
  • α – смещение
  • β – это вес каждой функции.

Уравнение множественной линейной регрессии фактически совпадает с уравнением простой линейной регрессии. Просто множественная линейная регрессия использует вес для каждой функции.

Важная заметка!

Base & Wolf (2014) [2] объясняют, что при выполнении регрессионного анализа существует несколько важных допущений. Вот некоторые из предположений, которые вы должны подтвердить:

  • Линейность. Связь между зависимой и независимой переменными должна быть линейной. То есть каждое единичное изменение значения независимой переменной приводит к такому же изменению зависимой переменной.

  • Гомоскедастичность. Это предположение связано с распределением ошибок/остатков модели. Гомоскедастичность означает, что должна поддерживаться постоянная (равная) дисперсия ошибок.

  • Многомерная нормальность. Стандартная модель регрессии предполагает, что остатки/ошибки должны распределяться нормально. Это означает, что остаточные значения должны быть сосредоточены вокруг среднего значения, равного нулю.
  • Отсутствие мультиколлинеарности. Это означает, что в данных отсутствует мультиколлинеарность. Мультиколлинеарность относится к ситуации, когда одна независимая переменная имеет сильную корреляцию с другой независимой переменной.

Кроме того, вы должны убедиться, что не используете слишком много функций. Использование слишком большого количества функций только приведет к неточности регрессионной модели. Более того, признаки не имеют существенной корреляции или влияния на зависимую переменную. Однако выбор подходящих функций для модели может привести к удовлетворительному уровню производительности [3].

Как выполнить множественную линейную регрессию с помощью Python?

После понимания множественной линейной регрессии следующим шагом будет ее применение. Здесь я буду использовать набор данных о ценах на жилье в Калифорнии. Вы можете загрузить набор данных на Kaggle.

Импортировать необходимую библиотеку

Существует несколько широко используемых библиотек, таких как Numpy, Pandas, Matplotlib, Seaborn и Scikit-learn.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
  • Pandas используется для управления фреймом данных.
  • Matplotlib и Seaborn используются для создания визуализаций данных.
  • Scikit-learn используется для создания и оценки моделей.

Загрузить и прочитать данные

После загрузки набора данных следующим шагом будет его загрузка с помощью функции pd.read_csv(). Мы также увидим обзор особенностей набора данных.

df = pd.read_csv("housing.csv")
df.head()

Вот информация о каждой из этих функций:

  1. longitude: Мера того, насколько далеко на запад находится дом. Более высокое значение означает, что это дальше на запад
  2. latitude: Мера того, как далеко на севере находится дом. Более высокие значения означают севернее
  3. housing_median_age: Средний возраст домов в квартале. Меньшие числа указывают на более новые здания.
  4. total_rooms: Общее количество комнат в блоке
  5. total_bedrooms: Общее количество спален в блоке
  6. population: Общее количество людей, проживающих в блоке
  7. households: Общее количество домохозяйств или групп людей, проживающих в единице жилья.
  8. median_income: средний доход домохозяйства в жилом квартале (измеряется в десятках тысяч долларов США).
  9. median_house_value: Средняя стоимость дома для домохозяйств в квартале (измеряется в долларах США).
  10. ocean_proximity: Расположение дома к океану/морю
df.info()

Итак, наш набор данных имеет в общей сложности 20640 строк и 10 столбцов (9 признаков являются входными признаками, а median_house_value — зависимой переменной). Все функции имеют числовой тип, за исключением функции ocean_proximity, которая относится к объектному типу.

Исследование данных

Мы углубимся в набор данных. Сначала мы рассмотрим функции, относящиеся к типу категории (ocean_proximity).

sns.countplot(data=df, x="ocean_proximity")

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

corr = df.corr()
corr["median_house_value"].sort_values(ascending=False).to_frame()

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

Поскольку у нас есть функции longitude и latitude, их легче анализировать, если мы визуализируем их.

df.plot(kind="scatter", x="longitude", y="latitude", alpha=0.5,
        s= df["population"]/100, label="population", figsize=(10,7),
        c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True)
plt.legend()

Визуализация помогает нам узнать местоположение конкретного дома. Мы видим, что цена дома тем выше, чем ближе он к пляжу. Для сравнения вы также можете посмотреть на карту Калифорнии.

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

df.isna().sum().to_frame()

Функция total_bedrooms имеет в общей сложности 207 отсутствующих значений или около 1% от общего числа строк. поскольку это небольшое число, мы можем отбросить строки с пропущенными значениями. Затем мы должны проверить наличие выбросов в наборе данных.

num_col = ['longitude', 'latitude', 'housing_median_age', 'total_rooms',
           'total_bedrooms', 'population', 'households', 'median_income',
           'median_house_value']

# visualize the outlier
plt.figure(figsize=(15, 10))
n = 1
for col in num_col:
    plt.subplot(4, 3, n)
    sns.boxplot(data=df, x=col)
    plt.title("Outlier in " + col, fontsize=16)
    n += 1
plt.tight_layout()

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

Предварительная обработка данных

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

df.dropna(inplace=True)

Машина может только считывать данные категории типа. Функция ocean_proximity имеет значение категории типа. Мы преобразуем его в числовой тип, используя метод горячего кодирования.

cat = pd.get_dummies(df["ocean_proximity"])
df = pd.concat([df, cat], axis=1)
df.drop("ocean_proximity", axis=1, inplace=True)

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

X = df.drop("median_house_value", axis=1)
y = df["median_house_value"]
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size = 0.25, 
                                                    random_state = 0)

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

scaler_X = RobustScaler()
X_train_scaled = scaler_X.fit_transform(X_train)
X_test_scaled = scaler_X.transform(X_test)

Моделирование и оценка

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

model = LinearRegression()
model.fit(X_train_scaled, y_train)

Мы также можем увидеть вес каждой функции, используя model.coef_. Чтобы увидеть смещение, мы можем использовать model.intercept_.

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

модель= смещение + коэф.₁*функция₁ + коэф.₂*функция₂ + … + коэф.ₙ*функцияₙ

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

модель= 245227,1868829204 -104584,66322722(долгота) -99374,66096139(широта) + … -31674,11792617(около океана)

Чтобы увидеть производительность регрессионной модели, мы можем оценить ее с помощью метрики R-квадрата (R²). Значение R² показывает, насколько хорошо модель соответствует данным. Значение находится в диапазоне от 0 до 1, чем больше значение, тем лучше производительность модели.

y_pred = model.predict(X_test_scaled)
r_squared = r2_score(y_test, y_pred)
print(f'R-squared: {r_squared}')

# output
R-squared: 0.6472382266013552

Мы получаем значение R² около 65%, что означает, что 65% дисперсии зависимой переменной можно объяснить независимой переменной/признаком. Это показывает, что наша модель линейной регрессии плохо обобщает данные. Другими словами, наша модель не соответствует требованиям. Это может быть связано со следующими двумя причинами:

  • Функции в наборе данных имеют плохую корреляцию с зависимой переменной.
  • Используемая модель слишком проста.

Краткое содержание

Множественная линейная регрессия находит линейную связь между зависимой переменной (y) и несколькими независимыми переменными (x). Он работает так же, как простая линейная регрессия, за исключением того, что множественная линейная регрессия имеет веса для каждого признака. В большинстве случаев прогнозирования множественная линейная регрессия работает лучше, чем простая линейная регрессия. Чтобы поддержать успех линейного регрессионного анализа, необходимо соблюдать несколько допущений, таких как линейность, гомоскедастичность, многомерная нормальность и отсутствие мультиколлинеарности. Одной из часто используемых метрик для измерения соответствия модели данным является R-квадрат (R²).

Использованная литература:

[1] Серрано, Л. (2021). Машинное обучение Grokking. Публикации Мэннинга.

[2] Бест, Х. и Вольф, К. (2014). Справочник SAGE по регрессионному анализу и анализу причин. SAGE Publications Ltd.

[3] Ильсевен, Э., и Гол, М. (2019). Сравнительное исследование повышения точности среднесрочного прогноза спроса на основе выбора характеристик. IEEE Milan PowerTech, 2019 г.

Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate