Используемая вами случайная комбинация неверна, поскольку y_train не соответствует x_train после перемешивания Когда вы так перемешиваете, каждый массив перемешивается в другом порядке. Вы можете использовать:
length = x_train.shape[0]
idxs = np.arange(0, length)
np.random.shuffle(idxs)
x_train = x_train[idxs]
y_train = y_train[idxs]
Выезд pyinstaller, это делает автономные исполняемые файлы (как в одном.EXE файле, и вот именно).