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

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

Часть 1: Библиотеки и данные

import pandas as pd

med_data = pd.read_csv("expenses.csv"
med_data.head()

med_data.info()

Данные состоят из 1834 записей без нулевых значений и 7 столбцов:

  1. Возраст = возраст клиента
  2. Пол = пол клиента
  3. ИМТ = индекс массы тела клиента
  4. дети = количество детей у потребителя
  5. курильщик = курит потребитель или нет
  6. регион = регион, где проживает клиент
  7. сборы = выплата по медицинской страховке

Столбец «Сборы» будет зависимым, а другие переменные будут факторами, определяющими сумму выплаты по медицинскому страхованию.

Часть 2. Исследовательский анализ данных

sns.histplot(med_data['charges'])

Распределение зависимой переменной показывает, что большинство расходов ниже 15 000, а есть некоторые выбросы, превышающие 50 000.

plt.figure(figsize=(12,6))
sns.countplot(data=med_data, x='age', palette='flare')

Число потребителей в возрасте 18 и 19 лет в два раза превышает количество потребителей других возрастов, где потребители других возрастов насчитывают всего около 20–30 человек каждого возраста.

plt.figure(figsize=(12,8))
plt.subplot(1,2,1)
sns.countplot(data=med_data, x='children')
plt.subplot(1,2,2)
sns.boxplot(data=med_data, x='children', y='charges')

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

plt.figure(figsize=(10,6))
plt.subplot(1,2,1)
sns.countplot(data=med_data, x='sex')
plt.subplot(1,2,2)
sns.boxplot(data=med_data, x='sex', y='charges')

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

plt.figure(figsize=(10,6))
plt.subplot(1,2,1)
sns.countplot(data=med_data, x='smoker')
plt.subplot(1,2,2)
sns.boxplot(data=med_data, x='smoker', y='charges')

Число клиентов-некурящих превышает количество клиентов-курящих (в 3 раза), а клиенты-некурящие имеют более низкие тарифы по сравнению с курильщиками.

plt.figure(figsize=(10,6))
plt.subplot(1,2,1)
sns.countplot(data=med_data, x='region', palette='crest')
plt.subplot(1,2,2)
sns.boxplot(data=med_data, x='region', y='charges', palette='crest')

Большинство потребителей приезжают из Юго-Восточного региона, хотя разница не далека от других регионов. Самые высокие сборы наблюдаются в северо-восточном регионе, а самый большой диапазон - в северо-восточном регионе.

plt.figure(figsize=(10,6))
plt.subplot(1,2,1)
sns.boxplot(data=med_data, y='bmi')
sns.jointplot(data=med_data, x='bmi', y='charges')

Распределение данных ИМТ вполне нормальное, в данных есть некоторые резкие отклонения. График зависимости ИМТ от расходов показывает некоторую линейность: при высоком ИМТ расходы тоже высоки!

Часть 3: Предварительная обработка

Перед моделированием данные сначала корректируются, чтобы их можно было обработать моделью. Модели линейной регрессии могут обрабатывать только числовые данные, поэтому для преобразования данных категории в числовые данные необходимо использовать кодировщик. Кроме того, модель линейной регрессии очень чувствительна к выбросам, поэтому мы будем масштабировать данные ИМТ, содержащие значения выбросов, с помощью надежного масштабатора. Для этого мы будем использовать ColumnTransformer от Sklearn.

from sklearn.preprocessing import OneHotEncoder, RobustScaler
from sklearn.compose import ColumnTransformer

cat_columns = med_data.select_dtypes(exclude='number').columns.to_list()
scale_col = ['bmi']

preprocessing = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(handle_unknown='ignore'), cat_columns),
        ('num', RobustScaler(), scale_col)
    ], remainder='passthrough', sparse_threshold=0
)

Часть 4: Моделирование

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

from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split

y = med_data['charges']
x = med_data.drop(['charges'], axis=1)

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=24)

model = Pipeline([
    ('preprocessing', preprocessing),
    ('linear_regression', LinearRegression())
])

model.fit(X_train, y_train)

Часть 5: Прогнозирование и оценка

После подбора модели следующим шагом будет вычисление прогнозируемого значения для X_test под именем переменной «prediction». Затем сравните его с y_test, используя матричную оценку. В этой модели я использую r2_score для расчета производительности модели. Значение R-квадрата показывает, насколько хорошо модель прогнозирует результат зависимой переменной. Значения R-квадрата варьируются от 0 до 1. Значение R-квадрата, равное 1, означает, что модель объясняет или предсказывает 100% взаимосвязей между зависимыми и независимыми переменными.

#Predict y values for X_test
prediction = model.predict(X_test)

#Library for scoring
from sklearn.metrics import r2_score

#Calculate 
r2 = r2_score(y_true=y_test, y_pred=prediction)
print(f"The R2 score for Multivariate Regression Model is {r2:.3f}")

Оценка модели R2 составляет 77,7%, что означает, что модель может предсказать 77,7% взаимосвязей между зависимыми и независимыми переменными.

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