Я использую следующий код для создания векторного представления для категориальной переменной (кодировка сущности):
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, сохранил порядок категорий?