sklearn LabelEncoder inverse_transform TypeError: в скалярный индекс могут быть преобразованы только целочисленные скалярные массивы - PullRequest
0 голосов
/ 10 октября 2018

Я получаю следующую ошибку при вызове inverse_transform LabelEncoder:

Traceback (most recent call last):
  File "Test.py", line 31, in <module>
    inverted = label_encoder.inverse_transform(integer_encoded['DEST'])
  File "...\Python\Python36\lib\site-packages\sklearn\preprocessing\label.py", line 283, in inverse_transform
    return self.classes_[y]
TypeError: only integer scalar arrays can be converted to a scalar index

Код, который генерирует эту ошибку, следующий:

import pandas as pd
import numpy as np
from collections import defaultdict
from sklearn import preprocessing
import bisect
data_cat = {'ORG': ['A', 'B', 'C', 'D'],
            'DEST': ['A', 'E', 'F', 'G'],
            'OP': ['F1', 'F1', 'F1', 'F2']}
data_cat = pd.DataFrame(data_cat)

#retain all columns LabelEncoder as dictionary.
label_encoder_dict = defaultdict(preprocessing.LabelEncoder) 
integer_encoded = data_cat.apply(lambda x: label_encoder_dict[x.name].fit_transform(x))
print("Integer encoded: ")
print(integer_encoded)

#add a UNK class that will be used for the unseen values from the test dataset
for key, le in label_encoder_dict.items():
    le_classes = np.array(le.classes_).tolist()
    bisect.insort_left(le_classes, 'UNK')
    le.classes_ = le_classes

label_encoder = label_encoder_dict['DEST']
print(label_encoder.classes_)
print(integer_encoded['DEST'])
print(type (integer_encoded['DEST']))
inverted = label_encoder.inverse_transform(integer_encoded['DEST'])
print(inverted)

Если я удаляю цикл forэто добавляет класс UNK к каждому LabelEncoder, все работает нормально.Я не понимаю, почему добавление нового класса влияет на вызов inverse_transform.

Спасибо за любую помощь или руководство.

1 Ответ

0 голосов
/ 10 октября 2018

LabelEncoder.inverse_transform на самом деле довольно просто.Объект LabelEncoder хранит массив исходных значений в атрибуте classes_, а закодированное целое число является индексом этого значения в classes_.Обычно classes_ - это тип np.array, который поддерживает передачу списка индексов для получения значений этих индексов.Однако в цикле for вы преобразовали его в обычный старый список Python, который не поддерживает такое поведение.

Если вы измените цикл for, чтобы оставить le.classes_ в качестве ndarray, он должен работать:

for key, le in label_encoder_dict.items():
    le_classes = np.array(le.classes_).tolist()
    bisect.insort_left(le_classes, 'UNK')
    le.classes_ = np.asarray(le_classes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...