Сравнение производительности модели со средней производительностью

Вопрос или проблема

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

  1. Является ли метрика R-квадрат хорошим индикатором для определения того, выполняет ли моя модель лучше, чем среднее значение возраста?
  2. Если я хочу рассчитать среднюю абсолютную ошибку для среднего значения возраста, должен ли я относиться к этому как к модели? Должен ли я рассчитывать среднее значение, используя тренировочные данные, а затем рассчитывать его MAE-оценку с тестовыми данными, или мне следует использовать весь набор данных для расчета среднего?
  3. Как мне реализовать пункт №2 на Python? Создать список средних значений, как [age_target_data.mean() for _ in age_target_list], и вставить его в scikit-learn mean_absolute_error(age_target_list, age_mean_list)?

1. R-квадрат определенно является одним из способов взглянуть на то, как разные атрибуты способствуют вариативности результата. Я использовал корреляционную матрицу, но другие методы тоже подходят.

corr_matrix = train_set.corr()
corr_matrix["Survived"].sort_values(ascending=False)`
  1. Вы можете рассчитать среднее только с тренировочными данными, а затем заполнить любые отсутствующие значения в тестовых данных во время инференса. Или вы можете создать первую модель только для определения возраста пассажиров, проводя регрессию по всем другим переменным для прогнозирования возраста пассажиров, а затем использовать вывод этой модели как вход для второй модели, чтобы определить выживание. Компромисс может быть чем-то средним, например, использование среднего или медианного значения некоторых входных данных для вычисления лучшего предположения о возрасте.

  2. Что-то вроде следующего:

    train_set['Age'] = train_set['Age'].fillna(train_set.groupby(["Sex", "Pclass"])['Age'].transform('median'))
    test_set['Age'] = test_set['Age'].fillna(train_set.groupby(["Sex", "Pclass"])['Age'].transform('median'))
    

Ответ или решение

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

1. R-квадрат как метрика

R-квадрат (коэффициент детерминации) — это действительно полезная метрика для оценки того, насколько хорошо ваша модель объясняет вариацию целевой переменной. Значение R-квадрат показывает, какую долю изменения зависимой переменной (возраст пассажиров) может объяснить ваша модель, по сравнению с константной моделью (средним значением).

Если ваш R-квадрат значительно выше, чем R-квадрат, полученный с использованием только среднего значения, то это свидетельствует о том, что ваша модель лучше в плане объяснения вариации. Однако, важно учитывать и другие метрики, такие как средняя абсолютная ошибка (MAE) или среднеквадратичная ошибка (RMSE), чтобы получить полное представление о производительности вашей модели.

2. Расчет MAE для среднего значения

Чтобы корректно рассчитать среднюю абсолютную ошибку (MAE) для среднего значения, вы должны рассматривать среднее значение как модель. Рекомендуется вычислять среднее возрастное значение на обучающей выборке и затем использовать его для оценки MAE с тестовой выборки. Это позволит вам избежать утечки данных и даст более достоверную оценку производительности.

Следовательно, правильная процедура будет следующей:

  1. Вычислить среднее значение возраста на обучающей выборке.
  2. Использовать это среднее значение для предсказания возраста на тестовой выборке.
  3. Рассчитать MAE между предсказанными значениями и фактическими значениями возраста.

3. Реализация в Python

Вот пример реализации, который выполняет вышеописанные шаги. Предполагается, что у вас есть доступ к pandas и sklearn:

import pandas as pd
from sklearn.metrics import mean_absolute_error

# Загрузка данных
train_set = pd.read_csv('train.csv')  # Используйте ваш путь к данным
test_set = pd.read_csv('test.csv')     # Используйте ваш путь к данным

# Шаг 1: Рассчитать среднее значение возраста на обучающей выборке
mean_age = train_set['Age'].mean()

# Шаг 2: Создать список предсказанных значений возраста на тестовой выборке
# Используем среднее значение для заполнения пропусков в тестовой выборке
test_set['Age_Predicted'] = mean_age

# Шаг 3: Рассчитать MAE
mae = mean_absolute_error(test_set['Age'].dropna(), test_set.loc[test_set['Age'].notnull(), 'Age_Predicted'])
print(f'Mean Absolute Error (MAE) для среднего значения: {mae}')

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

Заключение

Сравнение производительности модели с производительностью на основе среднего значения является важной частью анализа моделей. Использование R-квадрат и MAE может дать вам четкое понимание, насколько ваша модель эффективнее простого сильного среднегеометрического подхода.

Оцените материал
Добавить комментарий

Капча загружается...