Правильно Inverse_transform категориальные метки, которые использовались для создания уровня Embedding (кодирование объекта) - PullRequest
0 голосов
/ 05 марта 2020

Я использую следующий код для создания векторного представления для категориальной переменной (кодировка сущности):

import pandas as pd
from keras.layers import Dense
from keras.layers import Embedding
from keras.layers import Flatten
from keras.layers import Input
from keras.models import Model
from numpy import unique
from sklearn.preprocessing import LabelEncoder

d = {'cat_var_to_embed': ['a','b','b','b','a','a','a','a','c'],
     'target_var': [3,4,3,4,3,4,3,4,3]}
x = pd.DataFrame(data=d)

le = LabelEncoder()
le.fit(x[['cat_var_to_embed']])
x_enc = le.transform(x['cat_var_to_embed'])

in_layers = list()
em_layers = list()
n_labels = len(unique(x_enc))

in_layer = Input(shape=(1,))

em_layer = Embedding(n_labels, 10)(in_layer)
for_dense=Flatten()(em_layer)

dense = Dense(10, activation='sigmoid', kernel_initializer='he_normal')(for_dense)
output = Dense(1, activation='linear')(dense)
model = Model(inputs=in_layer, outputs=output)

model.compile(loss='mean_squared_error', optimizer='sgd')

model.fit(x_enc, x['target_var'].values, epochs=1, batch_size=1, verbose=2)

weights_final = model.layers[1].get_weights()[0]
final_df = pd.DataFrame(weights_final)
final_df=final_df.reset_index()
final_df['original_cat']=list(le.inverse_transform(final_df['index'].values))

Моя основная проблема заключается в том, что при восстановлении используется inverse_transform из LabelEncoder категории не сохранили правильный порядок, и каждая original_cat ошибочно связана с отдельным вектором.

Как я могу узнать, что процесс встраивания, следующего за inverse_transform, сохранил порядок категорий?

...