Конвейер OrdinalEncoder ValueError Найдены неизвестные категории - PullRequest
0 голосов
/ 23 февраля 2019

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

Цель: заставить конвейер работать с OrdinalEncoder.

Проблема: код не запускается с вызовом OrdinalEncoder.Это работает без OrdinalEncoder.Насколько я могу судить, я могу передать два аргумента: категории и dtype .Ни одна помощь.

Я передаю публичные данные о диабете , установленные для модели.Это проблема?IOW, передача функций высокой мощности в OrdinalEncoder вызывает проблему между данными поезда / теста после построения модели, т.е. тестовое разделение имеет значение, которое не имеет набор поездов?

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder
from sklearn.ensemble import RandomForestClassifier

pipe = Pipeline([
    ('imputer', SimpleImputer()),
    ('ordinal_encoder', OrdinalEncoder()),
    ('classifier', RandomForestClassifier(criterion='gini', n_estimators=100))])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Construct model
model = pipe.fit(X_train, y_train)

# Show results
print("Hold-out AUC score: %.3f" %roc_auc_score(model.predict_proba(X_test),y_test))

Вот ошибка, которую я получаю:

ValueError: Found unknown categories [17.0] in column 0 during transform

Что я делаю не так?

Настройка:

The scikit-learn version is 0.20.2.
3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) 
[Clang 6.0 (clang-600.0.57)]
sys.version_info(major=3, minor=7, micro=2, releaselevel='final', serial=0)

Ответы [ 2 ]

0 голосов
/ 14 июля 2019

Я получил ту же ошибку во время операции ColumnTransformer() с 'OneHoteEncoder ()' Я подозреваю, что это потому, что кодировщик требует ввода двумерного массива в кодировщик.

Вы можете попробовать .apply(lambda x: [x]) или некоторую функцию, аналогичную вашим порядковым значениям, чтобы увеличить их обусловленность.

0 голосов
/ 23 февраля 2019

Я не думаю, что OrdinalEncoder является правильным выбором в этой ситуации.Набор данных о диабете состоит из непрерывных, а не категориальных признаков.Как указано в документации для OrdinalEncoder:

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

При этом без дополнительного вывода данных трассировки или вашей настройки я не могу однозначно сказать, почему вы получаете ошибку, которую сделали.Мне удалось успешно разбить и выполнить приведенный выше код, используя данные, загруженные с помощью функции load_diabetes.Я предполагаю, что в вашем случае вы как-то пропустили подгонку кодировщика к категории «17.0», но опять же я бы не рекомендовал использовать в этом случае категориальный кодировщик.

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