Как обрабатывать отсутствующие значения (NaN) в категориальных данных при использовании scikit-learn OneHotEncoder? - PullRequest
1 голос
/ 16 июня 2020

Недавно я начал изучать python, чтобы разрабатывать прогнозную модель для исследовательского проекта с использованием методов машинного обучения. У меня есть большой набор данных, состоящий как из числовых, так и категориальных данных. В наборе данных много пропущенных значений. В настоящее время я пытаюсь кодировать категориальные функции с помощью OneHotEncoder. Когда я читал об OneHotEncoder, я понял, что для отсутствующего значения (NaN) OneHotEncoder присвоит 0 всем категориям функции, как таковые:

0     Male 
1     Female
2     NaN

После применения OneHotEncoder:

0     10 
1     01
2     00

Однако при выполнении следующего кода:

    # Encoding categorical data
    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import OneHotEncoder


    ct = ColumnTransformer([('encoder', OneHotEncoder(handle_unknown='ignore'), [1])],
                           remainder='passthrough')
    obj_df = np.array(ct.fit_transform(obj_df))
    print(obj_df)

я получаю сообщение об ошибке ValueError: Input содержит NaN

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

Я нашел этот вопрос , который похож, но ответ не предлагает достаточно подробного решения о том, как работать со значениями NaN.

Сообщите мне, какой у вас мысли есть, спасибо.

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Вам нужно будет предварительно вменить недостающие значения. Вы можете определить Pipeline с шагом вменения, используя SimpleImputer, установив, например, стратегию most_frequent до кодирования OneHot:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('encoder', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('cat', categorical_transformer, [0])
    ])

df = pd.DataFrame(['Male', 'Female', np.nan])
preprocessor.fit_transform(df)
array([[0., 1.],
       [1., 0.],
       [1., 0.]])
1 голос
/ 16 июня 2020
  1. Измените значения NaN на «Others» .
  2. Затем перейдите к горячему кодированию
  3. Затем вы можете удалить столбец «Others».
...