Укажите форму для столбцов категориальных объектов? - PullRequest
0 голосов
/ 12 октября 2018

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

Например, если мой словарь ["ON", "OFF", "UNKNOWN"]:
"OFF" -> [0, 1, 0]

categorical_column = tf.feature_column.categorical_column_with_identity('column_name', num_buckets=3)
feature_column = tf.feature_column.indicator_column(categorical_column))

Однако у меня фактически есть одномерный массив категориальных признаков.Я хотел бы превратить это в 2-мерную серию одноактных функций:

["OFF", "ON", "OFF", "UNKNOWN", "ON"]
->
[[0, 1, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0]]

В отличие от любого другого столбца объектов,Похоже, что в categorical_column_with_identity есть атрибут shape, и я не нашел никакой помощи через Google или документы.

Нужно ли мне отказываться от categorical_column_with_identity и создавать 2D?Массив себя через numerical_column?

Ответы [ 3 ]

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

Пара вариантов двоичного кодирования

import tensorflow as tf
test = ["OFF", "ON", "OFF", "UNKNOWN", "ON"]
encoding = {x:idx for idx, x in enumerate(sorted(set(test)))}
test = [encoding[x] for x in test]
print(tf.keras.utils.to_categorical(test, num_classes=len(encoding)))

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

Или из scikit, как указано в другом ответе

from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer()
transfomed_label = encoder.fit_transform(["OFF", "ON", "OFF", "UNKNOWN", "ON"])
print(transfomed_label)

>>>[[1 0 0]
    [0 1 0]
    [1 0 0]
    [0 0 1]
    [0 1 0]]
0 голосов
/ 26 октября 2018

Вы можете использовать dict как карту:

categorical_features = ["OFF", "ON", "OFF", "UNKNOWN", "ON"]
one_hot_features = []

map = {"ON": [1, 0, 0], "OFF": [0, 1, 0], "UNKNOWN": [0, 0, 1]}

for val in categorical_features:
    one_hot_features.append(map[val])

или с пониманием списка: categoryorical_features = ["OFF", "ON", "OFF", "UNKNOWN", "ON"]

map = {"ON": [1, 0, 0], "OFF": [0, 1, 0], "UNKNOWN": [0, 0, 1]}
one_hot_features = [map[f] for f in categorical_features]

Это должно дать вам то, что вы хотите.

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

Что касается комментариев, я не уверен, что эта функциональность возможна с tensorflow.Но с Pandas у вас есть тривиальное решение через pd.get_dummies:

import pandas as pd

L = ['OFF', 'ON', 'OFF', 'UNKNOWN', 'ON']

res = pd.get_dummies(L)

print(res)

   OFF  ON  UNKNOWN
0    1   0        0
1    0   1        0
2    1   0        0
3    0   0        1
4    0   1        0

Для производительности или если вам нужен только массив NumPy, вы можете использовать LabelBinarizer из sklearn.preprocessing:

from sklearn.preprocessing import LabelBinarizer

LB = LabelBinarizer()

res = LB.fit_transform(L)

print(res)

array([[1, 0, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 1],
       [0, 1, 0]])
...