Внесение пропущенных значений с использованием класса sklearn IterativeImputer для MICE

Я пытаюсь узнать, как реализовать MICE для вменения пропущенных значений для моих наборов данных. Я слышал о MICE от fancyimpute, но я также читал, что класс IterativeImputer sklearn может давать аналогичные результаты. Из документации sklearn:

Наша реализация IterativeImputer была вдохновлена ​​пакетом R MICE (Multivariate Imputation by Chained Equations) [1], но отличается от него тем, что возвращает одно вменение вместо нескольких вменений. Однако IterativeImputer также можно использовать для множественного импутации, многократно применяя его к одному и тому же набору данных с разными случайными начальными числами, когда sample_posterior = True.

Я видел «семена», используемые в разных конвейерах, но я никогда не понимал их достаточно хорошо, чтобы реализовать их в моем собственном коде. Мне было интересно, может ли кто-нибудь объяснить и предоставить пример того, как реализовать начальные значения для вменения MICE с использованием IterativeImputer sklearn? Спасибо!


person Glenn G.    schedule 29.10.2019    source источник


Ответы (1)


IterativeImputer поведение может меняться в зависимости от случайного состояния. Случайное состояние, которое может быть установлено, также называется «семенем».

Как указано в документации, мы можем получить несколько вменений при установке sample_posterior на True и изменении случайных начальных чисел, то есть параметра random_state.

Вот пример того, как его использовать:

import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

X_train = [[1, 2],
           [3, 6],
           [4, 8],
           [np.nan, 3],
           [7, np.nan]]
X_test = [[np.nan, 2],
          [np.nan, np.nan],
          [np.nan, 6]]

for i in range(3):
    imp = IterativeImputer(max_iter=10, random_state=i, sample_posterior=True)
    imp.fit(X_train)
    print(f"imputation {i}:")
    print(np.round(imp.transform(X_test)))

Он выводит:

imputation 0:
[[ 1.  2.]
 [ 5. 10.]
 [ 3.  6.]]
imputation 1:
[[1. 2.]
 [0. 1.]
 [3. 6.]]
imputation 2:
[[1. 2.]
 [1. 2.]
 [3. 6.]]

Мы можем наблюдать три разных вменения.

person Stanislas Morbieu    schedule 29.10.2019
comment
Было бы правильно объединить три импутации в один набор? Если да, то как бы вы этого добились? Я, вероятно, неправильно понимаю ваше объяснение, но похоже, что я создам 3 разных набора данных, каждый из которых представляет собой разные начальные значения вменения. - person Glenn G.; 30.10.2019
comment
Он действительно создает 3 разных набора данных. Как его использовать, зависит от вашей конечной задачи (классификация, регрессия и т. Д. Или просто вывести недостающие значения ваших функций?). Я бы посоветовал задать другой вопрос, и он, вероятно, лучше на перекрестной проверке, чем на переполнении стека. - person Stanislas Morbieu; 30.10.2019
comment
@GlennG. Удалось ли вам понять, как объединить наборы данных в единый набор данных? Я также в настоящее время нахожусь в той же должности и хотел бы заполнить недостающие значения в моих функциях. - person Vandan Revanur; 01.02.2020