ValueError при обратном преобразовании с использованием OrdinalEncoder с sklearn

Я получаю сообщение об ошибке inverse_transform после fit_transform. Я пытаюсь inverse_transform float64 вернуться к исходному типу данных, который является строкой.

получение данных:

df = pd.read_csv("pris.csv", usecols=['judge', 'plea_orcs', 'prior_cases', 'race', 'pris_yrs'])

преобразование строковых столбцов в csv:

oe = OrdinalEncoder()
df[['plea_orcs']] = oe.fit_transform(df[['plea_orcs']])
df[['judge']] = oe.fit_transform(df[['judge']])
df[['race']] = oe.fit_transform(df[['race']])

X и y для sklearn:

X = df[['plea_orcs', 'judge', 'race', 'prior_cases', 'pris_yrs']]
y = df[['to_prison']]

это вызывает ошибку:

print(oe.inverse_transform(X.plea_orcs[0].reshape(-1,1)))

ошибка:

IndexError                                Traceback (most recent call last)
<ipython-input-291-11e4763a5a03> in <module>
----> 1 print(oe.inverse_transform(X.plea_orcs[0].reshape(-1,1)))

~\AppData\Local\Programs\Python\Python39\lib\site-packages\sklearn\preprocessing\_encoders.py in inverse_transform(self, X)
    733         for i in range(n_features):
    734             labels = X[:, i].astype('int64', copy=False)
--> 735             X_tr[:, i] = self.categories_[i][labels]
    736 
    737         return X_tr

IndexError: index 68 is out of bounds for axis 0 with size 5

Должен ли я не использовать OrdinalEncoding? У меня есть несколько разных способов, но этот кажется ошибкой в ​​​​правильном направлении.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
877
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема

oe = OrdinalEncoder()
df[['plea_orcs']] = oe.fit_transform(df[['plea_orcs']])
df[['judge']] = oe.fit_transform(df[['judge']])
df[['race']] = oe.fit_transform(df[['race']])

Во второй строке вы fit указываете свой порядковый номер в столбце 'plea_orcs'. Затем вы можете transform эти данные (как вы делаете с удобством fit_transform и inverse_transform результатом.

Но затем в третьей строке вы переfit порядковый номер столбца 'judge'. При этом теряется вся информация о plea_orcs, и вы больше не сможете преобразовывать тестовые данные или выполнять обратное преобразование.

Некоторые решения

В порядке возрастания (IMO) элегантности:

  1. Создайте отдельные порядковые кодировщики для каждой функции.
  2. Используйте только один порядковый кодировщик и подгоните и трансформируйте все три столбца одновременно.
  3. Используйте только один порядковый кодировщик вместе с ColumnTransformer для выбора соответствующих столбцов. Используйте passthrough для других столбцов, если вам не нужно выполнять для них предварительную обработку.

Не по теме...

... но подумайте, подходит ли порядковое кодирование: если ваши данные не упорядочены естественным образом, вы добавляете к своим данным ложные отношения. См., например. этот пост на DS.SE.

Спасибо, на данный момент наименее элегантный вариант сработал. Я также переключился на кодировку меток, я не уверен, какой другой вариант у меня есть. Я новичок в ML, не могли бы вы что-нибудь посоветовать?

user9273085 27.12.2020 02:47

«Кодировка меток» (по крайней мере, в sklearn) аналогична порядковой кодировке, но предназначена для кодирования переменных, зависящих от мультикласса. Горячее кодирование — самый простой и понятный подход. См. datascience.stackexchange.com/questions/tagged/… для обсуждения альтернатив.

Ben Reiniger 27.12.2020 03:18

Другие вопросы по теме