Как построить нейронную сеть со слоем внедрения на структурированных данных в керасе, тензорном потоке и в pytorch - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть структурированный фрейм данных - около 30 миллионов строк и 10 000 столбцов. Это похоже на хороший набор данных для нейронных сетей, учитывая размер. Поскольку имеется много функций и около 20% из них являются категориальными, я хочу использовать вложения функций, чтобы уменьшить размер этого набора данных. Если я подойду к этому типу проблемы с помощью однократного кодирования, mean_encoding или частотного кодирования категорий, у меня все равно будет по крайней мере 10000 функций. Одно горячее кодирование явно отсутствует ... и даже одно горячее кодирование некоторых категорий с низкой кардинальностью кажется излишним, если мы можем решить эту проблему с помощью встроенных функций. Среднее кодирование, вероятно, хорошая идея, если я не хочу уменьшать размер набора функций. Я также могу использовать уменьшение размерности (PCA, LDA и т. Д. c ...), но даже если это может сработать, технически PCA предназначен для использования с непрерывными переменными, а не категориями. Из того, что я читал в Интернете, кажется, что встраивание функций может распространяться не только на текстовые проблемы, но и лучше на уменьшение размеров структурированных наборов данных. Я полагаю, это был бы просто кодировщик? Кто-нибудь экспериментировал с этим?

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

Я хочу, чтобы решение было обобщенным для всех структурированных наборов данных (задач классификации или регрессии), где все, что мне нужно изменить, - это параметры и гиперпараметры. Я также хотел бы знать, как это сделать как в керасах, так и в питорах. Я думаю, что этот код должен выглядеть примерно так:

main_input = Input(shape=X_train_scaled.shape, dtype='int32', name='main_input')

reduced_feature_size = 500 # I want to reduce the feature set size from 10,000 down to 500

# x = Embedding(output_dim=reduced_feature_size, input_dim=X_train_scaled.shape[1], input_length=X_train_scaled.shape[0])(main_input) # This is wrong
x = Embedding(output_dim=32, input_dim=X_train_scaled.shape[1], input_length=X_train_scaled.shape)(main_input)


# Could Embedding be some autoencoder, or maybe even word2vec or Glove?

x = Dense(units=16, activation='relu')(x) # or model = Dense, or RNN etc... fails though

model = Model(inputs = ?, outputs = ?)(x)

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train_scaled, y_train)


...