Image

Почему MissForest не справляется с задачами прогнозирования: ключевое ограничение, о котором следует помнить

Содержание

Почему исходный алгоритм MissForest нельзя напрямую применять для предиктивного моделирования, и как MissForestPredict решает эту проблему

Делиться

53a146b5256aac1bff3ddaf3a9161699

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

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

На практике большинство реальных наборов данных содержат пропущенные значения, что делает пропущенные данные одной из самых распространённых проблем статистического моделирования. Неправильная обработка пропущенных данных может привести к смещению оценок коэффициентов, снижению статистической мощности и, в конечном итоге, к неверным выводам (Van Buuren, 2018). В предиктивном моделировании игнорирование пропущенных данных путём проведения полного анализа случаев или исключения предикторных переменных с пропущенными значениями может ограничить применимость модели и привести к смещению или неоптимальной её эффективности.

Три механизма отсутствия данных

Чтобы решить эту проблему, статистики классифицируют пропущенные данные по трём механизмам, описывающим, как и почему значения пропадают. MCAR (Missing Completely at Random, полностью случайные пропуски) относится к случаям, когда пропуски происходят совершенно случайно и не зависят ни от наблюдаемых, ни от ненаблюдаемых переменных. MAR (Missing at Random, случайные пропуски) означает, что вероятность пропуска зависит от наблюдаемых переменных, но не от самого пропущенного значения. MNAR (Missing Not at Random, неслучайные пропуски) описывает самый сложный случай, в котором вероятность пропуска зависит от самого ненаблюдаемого значения.

Классические подходы и их ограничения при работе с отсутствующими данными

В рамках предположения MAR можно использовать информацию, содержащуюся в наблюдаемых переменных, для прогнозирования пропущенных значений. Классические подходы, основанные на этой идее, включают в себя импутацию на основе регрессии, импутацию по методу k ближайших соседей (kNN) и множественную импутацию с использованием цепных уравнений (MICE). Эти методы считаются многомерными, поскольку они явно обуславливают импутацию наблюдаемыми переменными. Эти подходы явно обуславливают импутацию наблюдаемыми данными, но имеют существенное ограничение: они плохо работают со смешанными базами данных (непрерывными и категориальными) и испытывают трудности с отражением нелинейных связей и сложных взаимодействий.

Восхождение МиссФорест реализовано на R

Именно для преодоления этих ограничений MissForest (Stekhoven & Bühlmann, 2012) зарекомендовал себя как эталонный метод. Основанный на случайных лесах, MissForest способен улавливать нелинейные взаимосвязи и сложные взаимодействия между переменными, часто превосходя традиционные методы импутации. Однако при работе над проектом, требующим обобщаемого процесса моделирования — с правильным разделением обучающей и тестовой выборок и внеочередной валидацией, — мы столкнулись со значительным ограничением. Реализация пакета missForest на языке R не сохраняет параметры модели импутации после подгонки.

Критическое ограничение MissForest в настройках прогнозирования

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

Существующие решения и их риски

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

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

Изучение этого вопроса привело нас к обсуждению на CrossValidated, где другой пользователь столкнулся с точно такой же проблемой и спросил:

«Как использовать missForest в R для импутации тестовых данных?»

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

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

# 1) Выполнить импутацию обучающего набора imp_train_X <- missForest(train_X)$ximp # 2) Построить предиктивную модель rf <- randomForest(x = imp_train_X, y = train$creditability) # 3) Объединить обучающий и тестовый наборы, затем повторно ввести train_test_X <- rbind(test_X, imp_train_X) imp_test_X <- missForest(train_test_X)$ximp[1:nrow(test_X), ]

Хотя этот подход часто может улучшить качество вменения, он страдает от того же недостатка, что и метод 1: тестовые данные косвенно участвуют в процессе обучения, что может завышать показатели эффективности модели и создавать чрезмерно оптимистичную оценку обобщения.

Эти примеры подчеркивают фундаментальную дилемму:

  • Как нам вменить пропущенные значения, не исказив оценку модели?
  • Как гарантировать, что значения, примененные к тестовому набору, соответствуют значениям, полученным на обучающем наборе?

Исследовательский вопрос и мотивация

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

Данная статья состоит из четырех основных разделов:

  • Раздел 1 знакомит с процессом выявления и характеристики отсутствующих значений, включая способы их обнаружения, количественной оценки и описания.
  • В разделе 2 обсуждается механизм MCAR (полностью случайные пропуски) и представлены методы обработки пропущенных данных в рамках этого предположения.
  • В разделе 3 основное внимание уделяется механизму MAR (Missing at Random), в котором описываются соответствующие стратегии импутации и рассматривается важный вопрос: почему реализация MissForest в R не работает в условиях прогнозирования?
  • В разделе 4 рассматривается механизм MNAR (пропущенные неслучайные данные) и изучаются стратегии работы с пропущенными данными, когда механизм зависит от самих ненаблюдаемых значений.

1. Выявление и характеристика пропущенных значений

Этот этап критически важен и должен осуществляться в тесном сотрудничестве со всеми заинтересованными сторонами: разработчиками модели, экспертами в предметной области и будущими пользователями модели. Цель — выявить все пропущенные значения и отметить их.

В Python, особенно при использовании таких библиотек, как Pandas , NumPy и Scikit-Learn , пропущенные значения представляются как NaN. Значения, отмеченные как NaN, игнорируются многими операциями, такими как sum() и count(). Вы можете отметить пропущенные значения с помощью функции replace() для соответствующего подмножества столбцов в Pandas DataFrame.

После того, как пропущенные значения отмечены, следующим шагом является оценка их распределения для каждой переменной. Функция isnull() может быть использована для определения всех значений NaN как True и в сочетании с функцией sum() подсчитывает количество пропущенных значений в каждом столбце.

Понимание распределения пропущенных значений имеет решающее значение. Обладая этой информацией, заинтересованные стороны могут оценить обоснованность закономерностей в отношении пропусков. Это также позволяет определить приемлемые пороговые значения пропусков в зависимости от характера каждой переменной. Например, вы можете решить, что для непрерывных переменных допустимо до 10% пропущенных значений, в то время как для категориальных переменных пороговое значение должно оставаться на уровне 0%.

После выбора соответствующих переменных для моделирования, включая те, которые содержат пропущенные значения, когда они важны для прогнозирования, необходимо разделить набор данных на три выборки:

  • Обучающий набор для оценки параметров и обучения моделей,
  • Тестовый набор для оценки эффективности модели на неизвестных данных,
  • Для проверки временной устойчивости модели установлен параметр Out-of-Time (OOT) .

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

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

  • Определите их механизм (MCAR, MAR, MNAR) с помощью статистических тестов,
  • Выберите подходящий метод вменения,
  • Обучите модели вменения на обучающем наборе.

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

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

2. Понимание MCAR и выбор правильных методов импутации

Проще говоря, MCAR (Missing Completely at Random) описывает ситуацию, когда факт отсутствия значения никак не связан ни с самим значением, ни с другими переменными в наборе данных. С математической точки зрения это означает, что вероятность отсутствия точки данных не зависит ни от значения самой переменной, ни от значений других переменных: отсутствие значения абсолютно случайно.

Прежде чем формально определить механизм MCAR, введем обозначения, которые будут использоваться в этом разделе и на протяжении всей статьи:

  • Рассмотрим независимую и одинаково распределенную выборку из n наблюдений:

yi = (yi1, . . ., yip)T, i = 1, 2, . . ., н

где p — количество переменных с пропущенными значениями, а n — размер выборки.

  • YR nxp представляет переменные, которые могут содержать пропущенные значения. Это набор, для которого мы хотим выполнить импутацию.
  • Мы обозначаем наблюдаемые записи и отсутствующие записи Y как Yo и Ym ,
  • XR nxq представляет собой полностью наблюдаемые переменные, то есть они не содержат пропущенных значений.
  • Чтобы указать, какие компоненты yi наблюдаются или отсутствуют, мы определяем вектор-индикатор:

ri = (ri1, . . ., rip)T, i = 1, 2, . . ., n

где rik = 1, если наблюдается yik , и 0 в противном случае.

  • Сложение этих векторов дает полную матрицу индикаторов присутствия/отсутствия:

R = (r1, . . ., rn) T

Тогда предположение MCAR определяется как:

Pr(R|Ym,Yo, X) = Pr(R). (1)

что подразумевает, что пропущенные индикаторы полностью независимы как от пропущенных данных Ym, так и от наблюдаемых данных Yo . Обратите внимание, что здесь R также независим от ковариатов X. Прежде чем представить методы обработки пропущенных значений в рамках предположения MCAR, мы сначала рассмотрим несколько простых методов оценки вероятности выполнения предположения MCAR.

2.1 Оценка предположения MCAR

В этом разделе мы проведем моделирование набора данных с 10 000 наблюдений и четырьмя переменными в рамках предположения MCAR:

  • Одна непрерывная переменная, содержащая 20% пропущенных значений, и одна категориальная переменная с двумя уровнями (0 и 1), содержащая 10% пропущенных значений.
  • Одна непрерывная переменная и одна категориальная переменная , которые полностью наблюдаются, без пропущенных значений.
  • Наконец, двоичная целевая переменная с именем target, принимающая значения 0 и 1.

import numpy as np import pandas as pd # — Воспроизводимость — np.random.seed(42) # — Параметры — n = 10000 # — Вспомогательные функции — def generate_continuous(mean, std, size, missing_rate=0.0): «»»Сгенерировать непрерывную переменную с необязательными пропусками MCAR.»»» значения = np.random.normal(loc=mean, scale=std, size=size) if missing_rate > 0: маска = np.random.rand(size) < missing_rate значения[маска] = np.nan возвращаемые значения def generate_categorical(levels, probs, size, missing_rate=0.0): """Сгенерировать категориальную переменную с необязательными пропусками MCAR.""" значения = np.random.choice(levels, size=size, p=probs).astype(float) if missing_rate > 0: mask = np.random.rand(size) < missing_rate values[mask] = np.nan return values ​​# --- Генерация переменных --- variables = { "cont_mcar": generate_continuous(mean=100, std=20, size=n, missing_rate=0.20), "cat_mcar": generate_categorical(levels=[0, 1], probs=[0.7, 0.3], size=n, missing_rate=0.10), "cont_full": generate_continuous(mean=50, std=10, size=n), "cat_full": generate_categorical(levels=[0, 1], probs=[0.6, 0.4], size=n), "target": np.random.choice([0, 1], size=n, p=[0.5, 0.5]) } # --- Построение DataFrame --- df = pd.DataFrame(variables) # --- Отобразить сводку --- print(df.head()) print("nКоличество пропущенных значений:") print(df.isnull().sum())

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

2.1.1 Подготовка обучающих и тестовых данных для анализа MCAR

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

from sklearn.model_selection import train_test_split import pandas as pd def stratified_split(df, strat_vars, test_size=0.3, random_state=None): «»» Разделить DataFrame на обучающий и тестовый наборы со стратификацией по одной или нескольким переменным. Параметры ———- df : pandas.DataFrame Входной набор данных. strat_vars : list или str Имя(-ена) столбца(-ов), используемого(-ых) для стратификации. test_size : float, default=0.3 Доля набора данных для включения в тестовое разделение. random_state : int, необязательное Случайное начальное число для воспроизводимости. Возвращает ——- train_df : pandas.DataFrame Обучающий набор. test_df : pandas.DataFrame Тестовый набор. «»» # Убедитесь, что strat_vars является списком, если isinstance(strat_vars, str): strat_vars = [strat_vars] # Создать объединенный ключ стратификации strat_key = df[strat_vars].astype(str).fillna(«MISSING»).agg(«_».join, axis=1) # Выполнить стратифицированное разделение train_df, test_df = train_test_split( df, test_size=test_size, stratify=strat_key, random_state=random_state ) return train_df, test_df # — Применение — # Стратификация по cat_mcar, cat_full и цели train_df, test_df = stratified_split(df, strat_vars=[«cat_mcar», «cat_full», «target»], test_size=0.3, random_state=42) print(f»Размер поезда: {train_df.shape[0]} ({len(train_df)/len(df):.1%})») print(f»Размер теста: {test_df.shape[0]} ({len(test_df)/len(df):.1%})»)

2.1.1 Анализ предположения MCAR для непрерывных переменных с пропущенными значениями

Первым шагом является создание бинарного индикатора R (где 1 указывает на наблюдаемое значение, а 0 указывает на отсутствующее значение) и сравнение распределений Yo, Ym и X по двум группам (наблюдаемые и отсутствующие).

Проиллюстрируем этот процесс на примере переменной cont_mcar. Сравним распределение cont_full между наблюдениями, где cont_mcar отсутствует, и наблюдениями, где она присутствует, используя как ящичную диаграмму, так и тест Колмогорова – Смирнова. Затем мы проведём аналогичный анализ для категориальной переменной cat_full, сравнив доли в двух группах с помощью столбчатой ​​диаграммы и теста хи-квадрат.

import matplotlib.pyplot as plt import seaborn as sns # — Шаг 1: Разделение на обучающую и тестовую выборки со стратификацией — train_df, test_df = stratified_split( df, strat_vars=[«cat_mcar», «cat_full», «target»], test_size=0.3, random_state=42 ) # — Шаг 2: Создание индикатора R на обучающем наборе — train_df = train_df.copy() train_df[«R_cont_mcar»] = np.where(train_df[«cont_mcar»].isnull(), 0, 1) # — Шаг 3: Подготовка данных для сравнения — df_obs = pd.DataFrame({ «cont_full»: train_df.loc[train_df[«R_cont_mcar»] == 1, «cont_full»], «Group»: «Наблюдается (R=1)» }) df_miss = pd.DataFrame({ «cont_full»: train_df.loc[train_df[«R_cont_mcar»] == 0, «cont_full»], «Group»: «Отсутствует (R=0)» }) df_all = pd.concat([df_obs, df_miss]) # — Шаг 4: Тест KS перед построением графика — from scipy.stats import ks_2samp stat, p_value = ks_2samp( train_df.loc[train_df[«R_cont_mcar»] == 1, «cont_full»], train_df.loc[train_df[«R_cont_mcar»] == 0, «cont_full»] ) # — Шаг 5: Визуализация с результатом KS — plt.figure(figsize=(8, 6)) sns.boxplot( x=»Group», y=»cont_full», data=df_all, palette=»Set2″, width=0.6, fliersize=3 ) # Добавить красные ромбы для средних значений mean = df_all.groupby(«Group»)[«cont_full»].mean() for i, m in enumerate(means): plt.scatter(i, m, color=»red», marker=»D», s=50, zorder=3, label=»Mean» if i == 0 else «») # Заголовок и результат теста KS plt.title(«Распределение cont_full по пропускам cont_mcar (Train Set)», fontsize=14, weight=»bold») # Добавить результат KS как текстовое поле textstr = f»KS Statistic = {stat:.3f}nP-value = {p_value:.3f}» plt.gca().text( 0.05, 0.95, textstr, transform=plt.gca().transAxes, fontsize=10, verticalalignment='top', bbox=dict(boxstyle=»round,pad=0.3″, facecolor=»white», alpha=0.8) ) plt.ylabel(«cont_full», fontsize=12) plt.xlabel(«») sns.despine() plt.legend() plt.show()

7e091375ba5223dcf991e2d64c93af7f

import seaborn as sns import matplotlib.pyplot as plt from scipy.stats import chi2_contingency # — Шаг 1: Построение таблицы сопряженности для набора TRAIN — contingency_table = pd.crosstab(train_df[«R_cont_mcar»], train_df[«cat_full»]) chi2, p_value, dof, expected = chi2_contingency(contingency_table) # — Шаг 2: Вычисление пропорций для каждой группы — # — Пересчитайте пропорции, но переверните оси — props = contingency_table.div(contingency_table.sum(axis=1), axis=0) # Преобразование для построения графика: Группа (R) на оси X, Категория как оттенок df_props = props.reset_index().melt( id_vars=»R_cont_mcar», var_name=»Category», value_name=»Proportion» ) # Сопоставить значения R с четкими метками df_props[«Group»] = df_props[«R_cont_mcar»].map({1: «Observed (R=1)», 0: «Missing (R=0)»}) # — График: Группа на оси X, столбцы показывают пропорции каждой категории — sns.set_theme(style=»whitegrid») plt.figure(figsize=(8,6)) sns.barplot( x=»Group», y=»Proportion», hue=»Category», data=df_props, palette=»Set2″ ) # Заголовок и результат критерия Хи² plt.title(«Доля cat_full по наблюдаемому/отсутствующему статусу cont_mcar (набор поездов)», fontsize=14, weight=»bold») # Добавить результат критерия Хи² в виде текстового поля textstr = f»Хи² = {хи²:.3f}, p = {p_value:.3f}» plt.gca().text( 0.05, 0.95, textstr, transform=plt.gca().transAxes, fontsize=10, verticalalignment='top', bbox=dict(boxstyle=»round,pad=0.3″, facecolor=»white», alpha=0.8) ) plt.xlabel(«Наблюдаемая / Отсутствующая группа (R)») plt.ylabel(«Пропорция») plt.legend(title=»cat_full Категория») sns.despine() plt.show()

d853557acf91102379ee3cc0011688d7

Два рисунка выше показывают, что в рамках предположения MCAR распределение 𝑌​, 𝑌ₘ​ и 𝑋 остаётся неизменным независимо от значения R (1 = наблюдаемое, 0 = отсутствующее). Эти результаты также подтверждаются тестами Колмогорова–Смирнова и критерием хи-квадрат, которые подтверждают отсутствие значимых различий между наблюдаемыми и отсутствующими группами.

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

2.1.3 Многомерный анализ предположения MCAR

Насколько мне известно, для оценки предположения MCAR на уровне набора данных широко используется только один многомерный статистический тест: критерий хи-квадрат Литтла для проверки предположения MCAR, называемый mcartest. Этот тест, разработанный на языке R, сравнивает распределения наблюдаемых переменных по различным шаблонам пропущенных данных и вычисляет глобальную статистику, которая следует распределению хи-квадрат.

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

2.2 Методы работы с пропущенными данными в рамках MCAR.

В предположении MCAR индикаторы пропусков R не зависят от Yo, Ym и X. Поскольку пропуски данных совершенно случайны, исключение неполных наблюдений не приводит к смещению. Однако этот подход становится неэффективным при высокой доле пропущенных значений.

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

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

Чтобы ввести пропущенные значения в предположении MCAR для целей прогнозирования, выполните следующие действия:

  1. Изучите значения вменения только из обучающего набора, используя среднее значение для непрерывных переменных и наиболее частотную категорию для категориальных переменных.
  2. Примените эти значения для замены отсутствующих данных как в обучающем, так и в тестовом наборах.
  3. Оцените модель на тестовом наборе, убедившись, что никакая информация из тестового набора не использовалась в процессе импутации.

import pandas as pd def compute_impute_values(df, cont_vars, cat_vars): «»» Вычислить значения вменения (среднее для непрерывных, мода для категориальных) только из обучающего набора. «»» impute_values ​​= {} for col in cont_vars: impute_values[col] = df[col].mean() for col in cat_vars: impute_values[col] = df[col].mode().iloc[0] return impute_values ​​def apply_imputation(train_df, test_df, impute_values, vars_to_impute): «»» Применить полученные значения вменения к обучающему и тестовому наборам. «»» train_df[vars_to_impute] = train_df[vars_to_impute].fillna(value=impute_values) test_df[vars_to_impute] = test_df[vars_to_impute].fillna(value=impute_values) return train_df, test_df # — Пример использования — train_df, test_df = stratified_split( df, strat_vars=[«cat_mcar», «cat_full», «target»], test_size=0.3, random_state=42 ) # Переменные для вычисления cont_vars = [«cont_mcar»] cat_vars = [«cat_mcar»] vars_to_impute = cont_vars + cat_vars # 1. Изучите значения вычисления для TRAIN impute_values ​​= compute_impute_values(train_df, cont_vars, cat_vars) print(«Значения вычисления, полученные из train:», impute_values) # 2. Примените их последовательно к TRAIN и TEST train_df, test_df = apply_imputation(train_df, test_df, impute_values, vars_to_impute) # 3. Проверка print(«Оставшиеся пропущенные значения в train:n», train_df[vars_to_impute].isnull().sum()) print(«Оставшиеся пропущенные значения в test:n», test_df[vars_to_impute].isnull().sum())

В этом разделе, посвященном пониманию MCAR и выбору подходящего метода вменения, представлена ​​четкая основа для подхода к аналогичным стратегиям в рамках предположения MAR.

3. Понимание MAR и выбор правильных методов расчета

Предположение MAR определяется как:

Pr(R|Ym ,Yo, X) = Pr(R|Yo, X) (2)

Другими словами, распределение пропущенных показателей зависит только от наблюдаемых данных. Даже в случае, когда R зависит только от ковариатов X,

Pr(R|Ym,Yo, X) = Pr(R|X) (3)

Это по-прежнему соответствует предположению MAR.

3.1 Анализ допущения MAR для переменных с пропущенными значениями

В предположении MAR индикаторы пропусков 𝑅 зависят только от наблюдаемых переменных Yo и X, но не от пропущенных данных 𝑌.
Для косвенной оценки правдоподобности этого предположения можно использовать распространенные статистические тесты (t-критерий Стьюдента, Колмогорова–Смирнова, хи-квадрат и т. д.) путем сравнения распределений наблюдаемых переменных между группами с пропущенными значениями и без них.

Для многомерного анализа можно также использовать mcartest , реализованный в R, который расширяет тест Литтла MCAR для оценки предположения (3), а именно Pr(R|Ym ,Yo, X) = Pr(R|X) , при условии многомерной нормальности переменных.

Если этот тест не отвергнут, то механизм пропущенных данных можно обоснованно считать MAR (предположение 3) с учетом вспомогательных переменных X.

Теперь мы можем перейти к вопросу о том, как восполнить этот тип недостающих данных.

3.2 Методы работы с пропущенными данными в рамках MAR.

В предположении MAR вероятность пропуска R зависит только от наблюдаемых переменных Yo и ковариатов X. В этом случае переменные Yk с пропущенными значениями можно объяснить с помощью других доступных переменных Yo и X, что мотивирует использование расширенных методов импутации, основанных на контролируемом обучении.

Эти подходы предполагают построение прогностической модели, в которой неполная переменная Yk служит целевой, а другие наблюдаемые переменные Yo и X — предикторами. Модель обучается на полных случаях ([Yk]o для Y), а затем применяется для оценки пропущенных значений [Yk​]m для Yk.

Наиболее часто используемые в литературе методы вменения включают:

  • k-ближайших соседей (KNNimpute, Троянская и др., 2001) , в основном применяется к непрерывным данным;
  • насыщенная мультиномиальная модель (Schafer, 1997) , разработанная для категориальных данных;
  • многомерное вменение с помощью цепочечных уравнений (MICE, Van Buuren & Oudshoorn, 1999) , подходящее для смешанных наборов данных, но зависящее от параметров настройки и спецификации параметрической модели.

Все эти подходы основаны на предположениях о распределении базовых данных или на способности выбранной модели адекватно фиксировать взаимосвязи между переменными.

Совсем недавно MissForest (Stekhoven & Bühlmann, 2012) появился как непараметрическая альтернатива, основанная на случайных лесах, хорошо подходящая для смешанных типов данных и устойчивая как к взаимодействиям, так и к нелинейным связям.

Алгоритм MissForest использует случайный лес (СЛ) для вычисления пропущенных значений. Авторы предлагают следующую процедуру:

d844c0ce32ae229a7d7056ef5ea36450

Согласно определению, алгоритм MissForest не может быть использован напрямую для прогнозирования. Для каждой переменной между шагами 6 и 7 модель случайного леса Ms , используемая для прогнозирования ymis(s) на основе xmis(s), не сохраняется. Следовательно, для специалистов маловероятно и нежелательно использовать MissForest в качестве предиктивной модели в производственной среде.

Отсутствие сохраненных моделей Ms или параметров импутации (здесь, в обучающем наборе) затрудняет оценку эффективности обобщения на новых данных. Хотя некоторые пытались обойти эту проблему, следуя подходу Лиама Моргана, задача остаётся нерешённой.

Более того, это ограничение увеличивает алгоритмическую сложность и вычислительные затраты, поскольку весь алгоритм необходимо перезапускать с нуля для каждого нового набора данных (например, при работе с отдельными обучающими и тестовыми наборами).

Что делать? Стоит ли продолжать использовать алгоритм MissForest?

Если цель состоит в разработке модели для классификации или анализа исключительно на основе имеющегося набора данных без намерения применять ее к новым данным, то настоятельно рекомендуется использовать MissForest, поскольку он обеспечивает высокую точность и надежность.

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

К счастью, теперь существует адаптированная версия: MissForestPredict , доступная с 2024 года как на R, так и на Python, специально разработанная для задач прогнозирования. Подробнее см. в работе Albu, Elena, et al. (2024) .

Использование алгоритма MissForestPredict для прогнозирования заключается в применении стандартной процедуры MissForest к обучающим данным. Однако, в отличие от оригинального MissForest, эта версия возвращает и сохраняет индивидуальные модели M, связанные с каждой переменной, что позволяет повторно использовать их для заполнения пропущенных значений в новых наборах данных.

33d2270559f2d83dc0b03b2539d4036a

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

f0dcb62d98e9f5b5ca9ef49819849bcc

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

4. Понимание МНАР

Пропуски неслучайных значений (MNAR) возникают, когда механизм пропущенных данных напрямую зависит от самих ненаблюдаемых значений. Другими словами, если переменная Y содержит пропущенные значения, то индикаторная переменная R (где R=1, если Y наблюдается, и R=0 в противном случае) зависит только от пропущенного компонента Ym.

Универсального статистического метода для работы с подобными механизмами не существует, поскольку информация, необходимая для моделирования зависимости, как раз и отсутствует. В таких случаях рекомендуется обратиться к экспертным знаниям в данной области, чтобы понять причины отсутствия ответа и определить контекстно-зависимые стратегии анализа и устранения пропущенных значений.

Однако важно подчеркнуть, что MAR и MNAR, как правило, невозможно различить эмпирически, основываясь только на наблюдаемых данных.

Заключение

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

Наш анализ показывает, что в рамках MCAR простые методы импутации, как правило, предпочтительны, поскольку они обеспечивают значительную экономию времени без внесения систематических ошибок. Однако на практике механизмы, использующие пропущенные данные, чаще всего основаны на MAR. В таких условиях особенно эффективны продвинутые методы импутации, такие как MissForest, основанные на моделях машинного обучения.

Тем не менее, когда целью является построение предиктивных моделей, крайне важно использовать методы, которые сохраняют параметры импутации или модели, полученные на основе обучающих данных, а затем воспроизводят их согласованно на тестовых, вневременных или прикладных наборах данных. Именно в этом и заключается вклад MissForestPredict (представленного в 2024 году и доступного как на R, так и на Python), который устраняет ограничения оригинального метода MissForest (2012), изначально не предназначенного для предиктивных задач.

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

Ссылки

[1] Одижье, В., Уайт, И.Р., Джолани, С., Дебрей, Т.П., Куартаньо, М., Карпентер, Дж., … и Реше-Ригон, М. (2018). Множественное вменение для многоуровневых данных с непрерывными и бинарными переменными.

[2] Стеховен, Д. Дж. и Бюльманн, П. (2012). MissForest — непараметрическое определение пропущенных значений для данных смешанного типа. Биоинформатика, 28(1), 112–118.

[3] Ли, Ч. (2013). Тест Литтла на совершенно случайные пропуски. The Stata Journal, 13(4), 795-809.

[4] Альбу, Э., Гао, С., Винантс, Л. и Ван Калстер, Б. (2024). missForestPredict – Ввод отсутствующих данных для настроек прогнозирования. Препринт arXiv arXiv:2407.03379.

Кредиты изображений

Все изображения и визуализации в этой статье были созданы автором с использованием Python (pandas, matplotlib, seaborn и plotly) и Excel, если не указано иное.

Отказ от ответственности

Я пишу, чтобы учиться, поэтому ошибки — это нормально, хотя я и стараюсь изо всех сил. Пожалуйста, если заметите их, сообщите мне. Я также буду рад предложениям по новым темам!

Источник: towardsdatascience.com

✅ Найденные теги: новости, Почему
Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Фото сгенерированных лиц: исследование показывает, что люди не могут отличить настоящие лица от сгенерированных
Нейросети построили капитализм за трое суток: 100 агентов Claude заперли…
Скетч: цифровой осьминог и виртуальный мир внутри компьютера с человечком.
Сцена с жестами пальцами, где один жест символизирует "VPN", а другой "KHP".
‼️Paramount купила Warner Bros. Discovery — сумма сделки составила безумные…
Скриншот репозитория GitHub "Claude Scientific Skills" AI для научных исследований.
Структура эффективного запроса Claude с элементами задачи, контекста и референса.
Эскиз и готовая веб-страница платформы для AI-дизайна в современном темном режиме.
ideipro logotyp
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

Учёные из Университета штата Северная Каролина представили композит нового поколения, способный самостоятельно восстанавливаться после серьёзных повреждений.  Речь идёт о модифицированном армированном волокном полимере (FRP), который не просто сохраняет прочность при малом весе, но и способен «залечивать» внутренние…

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых