Scikit-learn Расширенная настраиваемая матрица с горячим кодированием - не построенная на основе набора данных - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь построить матрицу с горячим кодированием, которая представляет дополнительные категории, которых нет в моем примере.

При использовании следующего кода:

s = np.array(['man', 'man', 'woman', 'woman', 'son', 'son', 'son', 'son', 'son'])
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(s)
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
Y = onehot_encoder.fit_transform(integer_encoded)
print(Y)

Результат это:

[[1. 0. 0.]
 [1. 0. 0.]
 [0. 0. 1.]
 [0. 0. 1.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]]

Но на самом деле у меня есть следующие категории, некоторые из которых отсутствуют в моем наборе данных, но мне нужно их учитывать:

categories = np.array(['man', 'woman', 'son', 'daughter', 'boy', 'girl', 'king', 'queen', 'baby', 'child'])

Итак, что я необходимо следующее:

[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]

Таким образом, я пытаюсь выяснить, как реализовать OneHotEncoder (sparse = False, Categories = Categories) в этом коде:

categories = np.array(['man', 'woman', 'son', 'daughter', 'boy', 'girl', 'king', 'queen', 'baby', 'child'])
s = np.array(['man', 'man', 'woman', 'woman', 'son', 'son', 'son', 'son', 'son'])
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(s)
onehot_encoder = OneHotEncoder(sparse=False, categories=categories)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
Y = onehot_encoder.fit_transform(integer_encoded)
print(Y)

Но это дает следующая ошибка:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

И если я изменю:

integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)

to

integer_encoded = integer_encoded.reshape(len(integer_encoded), 1).all()

, я получаю следующую ошибку:

Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

Может кто-нибудь помочь мне разобраться в этом?

1 Ответ

0 голосов
/ 17 июня 2020

Проблема здесь в параметре categories для OneHotEncoder
Ваша categories переменная ndarray, и она увеличивает ValueError.
Попробуйте использовать обычный отсортированный list.
И ТАКЖЕ, вам не нужно использовать LabelEncoder в вашем случае.

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np

categories = [sorted(['man', 'woman', 'son',
                      'daughter', 'boy', 'girl',
                      'king', 'queen', 'baby', 'child'])]
print(f'sorted categories: {categories}')

s = np.array(['man', 'man', 'woman', 'woman',
              'son', 'son', 'son', 'son', 'son']).reshape(-1, 1)
onehot_encoder = OneHotEncoder(sparse=False, categories=categories)
Y = onehot_encoder.fit_transform(s)
print(Y)
sorted categories: [['baby', 'boy', 'child', 'daughter', 'girl', 'king', 'man', 'queen', 'son', 'woman']]
[[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...