В настоящее время я работаю над проектом, который имеет все категориальные данные в качестве входных данных и двоичный вывод (1 = Да 0 = Нет).
Немного о данных.Есть 3127854 строк.Каждый признак колонки носит категориальный характер.Ниже приведено количество уникальных значений в каждом столбце.
attribute_1 - 87
attribute_2 - 2
attribute_3 - 202
attribute_4 - 3
attribute_5 - 3
attribute_6 - 367
Я продолжаю сталкиваться с проблемами, касающимися хэширования / встраивания столбцов таким образом, который позволяет мне вводить их в RNN.В идеале я хотел бы хэшировать столбцы, вставлять, проходить через слой LSTM, конкатывать, выравнивать, плотный слой, а затем выводить двоичный прогноз.
извините, если код немного неаккуратный / повторяющийся, какя сейчас возился.
import numpy as np
import pandas as pd
import tensorflow as tf
data = pd.read_csv(".....")
#Creating hash buckets for categorical data
attribute_1_hashed = tf.feature_column.categorical_column_with_hash_bucket("attribute_1", len(auction_clean["attribute_1"].unique()))
attribute_2_hashed = tf.feature_column.categorical_column_with_hash_bucket("app_attribute_2", len(auction_clean["app_attribute_2"].unique()))
attribute_3_hashed = tf.feature_column.categorical_column_with_hash_bucket("attribute_3", len(auction_clean["attribute_3"].unique()))
attribute_4_hashed = tf.feature_column.categorical_column_with_hash_bucket("attribute_4",len(auction_clean["attribute_4"].unique()))
attribute_5_hashed = tf.feature_column.categorical_column_with_hash_bucket("attribute_5",len(auction_clean["attribute_5"].unique()))
attribute_6_hashed = tf.feature_column.categorical_column_with_hash_bucket("attribute_6", len(auction_clean["attribute_6"].unique()))
#Input layer
attribute_1_input = tf.keras.Input(shape=(1,), name='attribute_1')
attribute_2_input = tf.keras.Input(shape=(1,), name='attribute_2')
attribute_3_input = tf.keras.Input(shape=(1,), name='attribute_3')
attribute_4_input = tf.keras.Input(shape=(1,), name='attribute_4')
attribute_5_input = tf.keras.Input(shape=(1,), name='attribute_5')
attribute_6_input = tf.keras.Input(shape=(1,), name='attribute_6')
#Embedding Layer
longest_string = {}
for column in col_names:
longest_string[column] = auction_clean[column].map(lambda x: len(x)).max()
embed_size = 10
attribute_1_embedded = tf.keras.layers.Embedding(len(data.attribute_1)+1, embed_size,
input_length=1, name='attribute_1_embedding')(attribute_1_input)
attribute_2_embedded = tf.keras.layers.Embedding(len(data.app_attribute_2)+1, embed_size,
input_length=1, name='attribute_2_embedding')(attribute_2_input)
attribute_3_embedded = tf.keras.layers.Embedding(longest_string['attribute_3']+1, embed_size,
input_length=1, name='attribute_3_embedding')(attribute_3_input)
attribute_4_embedded = tf.keras.layers.Embedding(longest_string['attribute_4']+1, embed_size,
input_length=1, name='attribute_4_embedding')(attribute_4_input)
attribute_5_embedded = tf.keras.layers.Embedding(longest_string['attribute_5']+1, embed_size,
input_length=1, name='attribute_5_embedding')(attribute_5_input)
attribute_6_embedded = tf.keras.layers.Embedding(data.attribute_6.max()+1, embed_size,
input_length=1, name='attribute_6_embedding')(attribute_6_input)
#LSTM Layer
num_units = 64
attribute_1_lstm = tf.keras.layers.LSTM(units=num_units)(attribute_1_embedded)
attribute_2_lstm = tf.keras.layers.LSTM(units=num_units)(attribute_2_embedded)
attribute_3_lstm = tf.keras.layers.LSTM(units=num_units)(attribute_3_embedded)
attribute_4_lstm = tf.keras.layers.LSTM(units=num_units)(attribute_4_embedded)
attribute_5_lstm = tf.keras.layers.LSTM(units=num_units)(attribute_5_embedded)
attribute_6_lstm = tf.keras.layers.LSTM(units=num_units)(attribute_6_embedded)
#Concatenate LSTM's output
concatenated = tf.keras.layers.Concatenate()([attribute_1_lstm,
attribute_2_lstm,
attribute_3_lstm,
attribute_4_lstm,
attribute_5_lstm,
attribute_6_lstm])
flatten = tf.keras.layers.Flatten()(concatenated)
#Dense layer
dense = tf.keras.layers.Dense(num_units, activation='relu')(concatenated)
#Output Layer
out = tf.keras.layers.Dense(1, activation="sigmoid", name="main_output")(dense)
model = tf.keras.Model(
inputs = [attribute_1_input,attribute_2_input,attribute_3_input,attribute_4_input,attribute_5_input,attribute_6_input],
outputs = out,
)
model.compile(
tf.train.AdamOptimizer(0.1),
loss='categorical_crossentropy',
metrics=['accuracy'],
)
history = model.fit(
[attribute_1_hashed, attribute_2_hashed,attribute_3_hashed,attribute_4_hashed,attribute_5_hashed,attribute_6_hashed],
data.y,
batch_size=10,
epochs=1,
steps_per_epoch = 1,
verbose=0
)
В этот момент происходит то, что вызов model.fit не работает, говоря:
ValueError: Входные массивы должны иметь одинаковое числообразцы в качестве целевых массивов.Найдено 3 входных и 3127854 целевых образцов.
Любые входные данные или рекомендации будут полезны, и, как всегда, пожалуйста, дайте мне знать, если требуется какое-либо разъяснение.
Заранее спасибо!