Циклический L oop между OneHotEncoder и KNNImpute в Scikit-learn - PullRequest
1 голос
/ 13 июля 2020

Я работаю с очень простым набором данных. У него есть некоторые пропущенные значения, как в категориальных, так и в числовых функциях c. Из-за этого я пытаюсь использовать sklearn.preprocessing.KNNImpute, чтобы получить максимально точное вменение. Однако, когда я запускаю следующий код:

imputer = KNNImputer(n_neighbors=120)

imputer.fit_transform(x_train)

, я получаю сообщение об ошибке: ValueError: could not convert string to float: 'Private'

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

encoder = OneHotEncoder(drop="first")

encoder.fit_transform(x_train[categorical_features])

, выдается ошибка: ValueError: Input contains NaN

Я бы предпочел использовать KNNImpute даже с категориальными данными, как мне кажется Я бы потерял некоторую точность, если бы просто использовал ColumnTransform и вменял числовые c и категориальные данные отдельно. Есть ли способ заставить OneHotEncoder игнорировать эти пропущенные значения? Если нет, может ли использовать ColumnTransform или более простой импьютер для решения этой проблемы?

Заранее спасибо

1 Ответ

1 голос
/ 16 июля 2020

Существуют открытые проблемы / PR для обработки недостающих значений на OneHotEncoder, но пока не ясно, какие будут варианты. А пока предлагаем подход вручную.

  • Заполните категориальные пропущенные символы pandas или SimpleImputer со строкой «отсутствует».
  • Затем используйте OneHotEncoder.
  • Используйте get_feature_names быстрого кодировщика, чтобы идентифицировать столбцы, соответствующие каждой исходной характеристике, и, в частности, индикатору «отсутствует».
  • Для каждой строки и каждой исходной категориальной функции, когда 1 находится в столбце «отсутствует», замените 0 на np.nan; затем удалите столбец отсутствующего индикатора.
  • Теперь все должно быть настроено для запуска KNNImputer.
  • Наконец, при желании, постобработка столбцов условного категориального кодирования. (Простое округление может дать вам строку со всеми нулями для категориальной функции, но я не думаю, что с KNNImputer вы можете получить более одной единицы подряд. Вместо этого вы можете argmax вернуть ровно одну единицу.)
...