NaN предоставляя ValueError в OneHotEncoder в scikit-learn - PullRequest
0 голосов
/ 03 октября 2019

Вот мой код

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

train = pd.DataFrame({
        'users':['John Johnson','John Smith','Mary Williams']
})
test = pd.DataFrame({
        'users':[None,np.nan,'John Smith','Mary Williams']
})

ohe = OneHotEncoder(sparse=False,handle_unknown='ignore')
ohe.fit(train)
train_transformed = ohe.fit_transform(train)

test_transformed = ohe.transform(test)
print(test_transformed)

Я ожидал, что OneHotEncoder сможет обрабатывать np.nan в тестовом наборе данных, поскольку

handle_unknown='ignore'

Но он дает ValueError. Хотя он может обрабатывать значение None. Почему происходит сбой? И как мне обойти это (кроме Imputer)?

Из документации (https://scikit -learn.org / stable / modules / generate / sklearn.preprocessing.OneHotEncoder. html ) казалось, что для этого предназначен handle_unknown.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Я не знаю назначения функции, но выполнение кода и просмотр результата говорит мне следующее:

Получаемое вами значение ValueError говорит вам, что функция ожидает числовые данные, а неstrings.

Также обратите внимание, что флаг handle_unknown не означает, что функция принимает значения None или nan, а скорее управляет обработкой категорий в тестовых данных, которых не было в обучающих данных (см. примерниже).

Работает следующий код, включающий неизвестные категории:

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

train = pd.DataFrame({
        'users':[1,2,3,4],'users2':[1,2,3,4]
})
test = pd.DataFrame({
        'users':[0,1,3,4,10],'users3':[1,2,3,4,5]
})

ohe = OneHotEncoder(sparse=False,handle_unknown='ignore')
ohe.fit(train)
train_transformed = ohe.fit_transform(train)

test_transformed = ohe.transform(test)
print(test_transformed)

Надеюсь, это поможет. Замена отсутствующих данных работает аналогично тому, что было предложено в предыдущем ответе.

0 голосов
/ 03 октября 2019

Вы должны сначала пропустить пропущенные значения. handle_unknown='ignore' не соответствует значениям NaN, но новые категории не включены в ohe.

Вы можете рассматривать NaN как отдельную категорию следующим образом:

train = train.fillna("NaN")
test = test.fillna("NaN")
...