I am trying to build a recommender predicting products. The inputs are one-hot encoded product IDs, and so is the output. (0, 0, 1, 0) to (1, 0, 0, 0) There are 83 unique IDs in the first category and 32 in the second. I imagined that the model should easily learn these combinations because the dataset only contains product combination, which occur 10 times or more.
The problem is that the accuracy is not getting better than 25% at the test-data. I have tried to evaluate the predictions using the training-data, so the accuracy should be very high because the model is predicting already seen data. Am I wrong with this assumption?
Is it even possible to predict one-hot-vectors with that many categories?
Here is my code:
# Parameters Batch_Size = 64 Learning_Rate = 0.001 Epochs = 100 def import_data(url): dataframe = pd.read_csv(url) return dataframe def prepare_df(data): data['Shirts'] = data["Shirt"].astype('category').cat.codes data['Pants'] = data['Pant'].astype('category').cat.codes return data def create_model(): my_model = Sequential() my_model.add(Dense(83, input_dim=83, activation="relu")) my_model.add(Dense(200, activation="relu")) my_model.add(Dense(200, activation="relu")) my_model.add(Dense(200, activation="relu")) my_model.add(Dense(32, activation="softmax")) return my_model if __name__ == '__main__': data = import_data('data/data_cropped.csv') data = prepare_df(data) print(data.Shirts.nunique()) X = to_categorical(data['Shirts'].values) y = data['Pants'].values optimizer = Adam(learning_rate=Learning_Rate) model = create_model() model.compile( loss="sparse_categorical_crossentropy", metrics=["sparse_categorical_accuracy"], optimizer=optimizer, ) print("Fit model on training data") history = model.fit( x=X, y=y, epochs=Epochs, batch_size=Batch_Size, verbose=1, validation_data=(X, y))
I would appreciate if you could help me on this matter.