Я получаю сообщение об ошибке 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? У меня есть несколько разных способов, но этот кажется ошибкой в правильном направлении.
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) элегантности:
ColumnTransformer
для выбора соответствующих столбцов. Используйте passthrough
для других столбцов, если вам не нужно выполнять для них предварительную обработку.... но подумайте, подходит ли порядковое кодирование: если ваши данные не упорядочены естественным образом, вы добавляете к своим данным ложные отношения. См., например. этот пост на DS.SE.
«Кодировка меток» (по крайней мере, в sklearn) аналогична порядковой кодировке, но предназначена для кодирования переменных, зависящих от мультикласса. Горячее кодирование — самый простой и понятный подход. См. datascience.stackexchange.com/questions/tagged/… для обсуждения альтернатив.
Спасибо, на данный момент наименее элегантный вариант сработал. Я также переключился на кодировку меток, я не уверен, какой другой вариант у меня есть. Я новичок в ML, не могли бы вы что-нибудь посоветовать?