Многомерная регрессия — это алгоритм машинного обучения, который используется для прогнозирования зависимой переменной на основе нескольких независимых переменных. Это расширение простой линейной регрессии, в которой используется только одна независимая переменная. Многомерную регрессию можно использовать для моделирования более сложных взаимосвязей между переменными, и ее часто используют в таких областях, как финансы, экономика и маркетинг.
В этой статье я буду применять многомерную линейную модель для прогнозирования выплат по медицинскому страхованию. Набор данных создан компанией Jovian для программы изучения машинного обучения.
Часть 1: Библиотеки и данные
import pandas as pd med_data = pd.read_csv("expenses.csv" med_data.head()
med_data.info()
Данные состоят из 1834 записей без нулевых значений и 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, но эту модель линейной регрессии можно использовать в качестве сравнения для создания другой регрессии. моделей, поскольку не существует лучшей модели, которую можно было бы использовать во всех случаях, каждый случай уникален.