Nano Hash - криптовалюты, майнинг, программирование

Сопоставление вложений сущностей с исходными категориальными значениями

Я использую слои внедрения Keras для создания вложений сущностей, ставших популярными в магазине Kaggle Rossmann Store Sales Запись, занявшая 3-е место. Однако я не уверен, как вернуть вложения обратно к фактическим категориальным значениям. Давайте посмотрим на очень простой пример:

В приведенном ниже коде я создаю набор данных с двумя числовыми и одной категориальной характеристикой.

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from keras.models import Model
from keras.layers import Input, Dense, Concatenate, Reshape, Dropout
from keras.layers.embeddings import Embedding

# create some fake data
data, labels = make_classification(n_classes=2, class_sep=2, n_informative=2,
                                   n_redundant=0, flip_y=0, n_features=2,
                                   n_clusters_per_class=1, n_samples=100,
                                   random_state=10)

cat_col = np.random.choice(a=[0,1,2,3,4], size=100)

data = pd.DataFrame(data)
data[2] = cat_col
embed_cols = [2]

# converting data to list of lists, as the network expects to
# see the data in this format
def preproc(df):
    data_list = []

    # convert cols to list of lists
    for c in embed_cols:
        vals = np.unique(df[c])
        val_map = {}
        for i in range(len(vals)):
            val_map[vals[i]] = vals[i]
        data_list.append(df[c].map(val_map).values)

    # the rest of the columns
    other_cols = [c for c in df.columns if (not c in embed_cols)]
    data_list.append(df[other_cols].values)
    return data_list

data = preproc(data)

У категориального столбца есть 5 уникальных значений:

print("Unique Values: ", np.unique(data[0]))
Out[01]: array([0, 1, 2, 3, 4])

которые затем загружаются в модель Keras со слоем встраивания:

inputs = []
embeddings = []

input_cat_col = Input(shape=(1,))
embedding = Embedding(5, 3, input_length=1, name='cat_col')(input_cat_col)
embedding = Reshape(target_shape=(3,))(embedding)
inputs.append(input_cat_col)
embeddings.append(embedding)


# add the remaining two numeric columns from the 'data array' to the network
input_numeric = Input(shape=(2,))
embedding_numeric = Dense(8)(input_numeric)
inputs.append(input_numeric)
embeddings.append(embedding_numeric)

x = Concatenate()(embeddings)
output = Dense(1, activation='sigmoid')(x)

model = Model(inputs, output)
model.compile(loss='binary_crossentropy', optimizer='adam')

history = model.fit(data, labels,
                    epochs=10,
                    batch_size=32,
                    verbose=1,
                    validation_split=0.2)

Я могу получить фактические вложения, получив вес для слоя встраивания:

embeddings = model.get_layer('cat_col').get_weights()[0]
print("Unique Values: ", np.unique(data[0]))
print("3 Dimensional Embedding: \n", embeddings)

Unique Values:  [0 1 2 3 4]
3 Dimensional Embedding: 
 [[ 0.02749949  0.04238378  0.0080842 ]
 [-0.00083209  0.01848664  0.0130044 ]
 [-0.02784528 -0.00713446 -0.01167112]
 [ 0.00265562  0.03886909  0.0138318 ]
 [-0.01526615  0.01284053 -0.0403452 ]]

Однако я не уверен, как их сопоставить. Можно ли предположить, что веса заказаны? Например, 0=[ 0.02749949 0.04238378 0.0080842 ]?


Ответы:


1

Да, веса слоя встраивания соответствуют слову, проиндексированному целым числом в порядке, т. Е. Массив весов 0 в слое встраивания соответствует слову с индексом 0 и так далее. Вы можете представить встраиваемый слой как таблицу поиска, где n-я строка таблицы соответствует вектору слов n-е слово (но встраивание слоев - это обучаемый слой, а не просто статическая таблица поиска)

inputs = Input(shape=(1,))
embedding = Embedding(5, 3, input_length=1, name='cat_col')(inputs)
model = Model(inputs, embedding)

x = np.array([0,1,2,3,4]).reshape(5,1)
labels = np.zeros((5,1,3))

print (model.predict(x))
print (model.get_layer('cat_col').get_weights()[0])

assert np.array_equal(model.predict(x).reshape(-1), model.get_layer('cat_col').get_weights()[0].reshape(-1))

model.predict (x):

[[[-0.01862894,  0.0021644 ,  0.04706952]],
 [[-0.03891206,  0.01743075, -0.03666048]],
 [[-0.01799501,  0.01427511, -0.00056203]],
 [[ 0.03703432, -0.01952349,  0.04562894]],
 [[-0.02806044, -0.04623617, -0.01702447]]]

model.get_layer ('cat_col'). get_weights () [0]

[[-0.01862894,  0.0021644 ,  0.04706952],
 [-0.03891206,  0.01743075, -0.03666048],
 [-0.01799501,  0.01427511, -0.00056203],
 [ 0.03703432, -0.01952349,  0.04562894],
 [-0.02806044, -0.04623617, -0.01702447]]
25.03.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..