Scikit-learn LabelEncoder: IndexError: массивы, используемые в качестве индексов, должны иметь целочисленный (или логический) тип - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь предварительно обработать данные для взрослых, чтобы сделать классификацию.Я занимаюсь категориальными атрибутами с помощью scikit-learn.

from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
X[:,0] = labelencoder.fit_transform(X[:,0])
labelencoder.classes_

вывод:

array(['Federal-gov', 'Local-gov', 'Private', 'Self-emp-inc',
       'Self-emp-not-inc', 'State-gov', 'Without-pay'], dtype=object)

новый контент:

X[:3]
array([[5, 'Bachelors', 'Under-Graduate', 'Never-married',
        'Adm-clerical', 'Not-in-family', 'White', 'Male',
        'United-States', 39.0, 77516.0, 13.0, 2174.0, 0.0, 40.0],
       [4, 'Bachelors', 'Under-Graduate', 'Married-civ-spouse',
        'Exec-managerial', 'Husband', 'White', 'Male', 'United-States',
        50.0, 83311.0, 13.0, 0.0, 0.0, 13.0],
       [2, 'HS-grad', 'HS-grad', 'Divorced', 'Handlers-cleaners',
        'Not-in-family', 'White', 'Male', 'United-States', 38.0,
        215646.0, 9.0, 0.0, 0.0, 40.0]], dtype=object)

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

original = labelencoder.inverse_transform(X[:,0])

Я получил эту ошибку:

IndexError                                Traceback (most recent call last)
<ipython-input-78-f8cf404b255a> in <module>
----> 1 original = labelencoder.inverse_transform(X[:,0])

D:\Anaconda\lib\site-packages\sklearn\preprocessing\label.py in inverse_transform(self, y)
    281                     "y contains previously unseen labels: %s" % str(diff))
    282         y = np.asarray(y)
--> 283         return self.classes_[y]
    284 
    285 

IndexError: arrays used as indices must be of integer (or boolean) type

1 Ответ

1 голос
/ 19 июля 2019

Ошибка возникает из-за того, что ваш массив имеет тип "объект" . И даже если вы извлекаете первый столбец, тип остается «объектом» (отметьте X[:,0].dtype). Кроме того, inverse_transform требует типа int. Поэтому, чтобы использовать inverse_transform, вам нужно привести ваш вектор к int следующим образом:

original = labelencoder.inverse_transform(X[:,0].astype(int))

Выход:

array(['a', 'b', 'c'], dtype=object)
...