Я пытаюсь тренировать DNN с керасом. У меня есть набор данных с 4000 строками данных, каждая из которых принадлежит программисту.
Возможности: навыки, время обучения, сертификаты, количество сотрудников, ... и есть столбец зарплаты, который является моей целью.
Я пытался обучить несколько DNN, и точность в большинстве случаев приближается к 95 и выше, но точность проверки является проблемой. Точность проверки никогда не превышает ~ 40%, и я считаю, что это проблема для точности моего проекта.
Чтобы повысить точность проверки и уменьшить перепроизводство, я попытался уменьшить размер ввода, обрезав некоторые ненужные функции (от 400 до ~ 50). Кроме того, я обучил немного DNN с выпадающими слоями. Эти действия немного повысили точность проверки (максимум: 47%), но я не удовлетворен результатом.
Входные данные являются массивом numpy и выглядят так:
array([4, 1, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0])
первые пять индексов: «возраст», «рабочее состояние», «образование», «совместные рабочие», «опыт», и это закодированные данные.
остальное: 'project_language', 'work_field', 'workplace_type', и они имеют несколько значений, поэтому я их так закодировал. (горячая точка категорична?)
Целевая форма - «(4000, 8)», и это вектор категории «одна горячая»:
array([0, 0, 0, 0, 1, 0, 0, 0])
Итак, я обучил около 144 DNN, и лучший результат - точность проверки на 47%:
activation_list = ['relu', 'tanh']
loss_list = ['categorical_crossentropy']
optimizer_list = ['rmsprop', 'adam']
drop_list = [None, 0.25, 0.5]
nn_arc_list = [
(32, 16),
(128, 64),
(256, 64),
(128, 32, 16),
(1024, 256, 64),
(1024, 256, 64, 16),
(1024, 512, 128, 64),
(2048, 1024, 512, 256, 128, 64, 32, 16),
(4096, 1024, 256, 128, 64, 32, 16, 8),
(128, 64, 32, 32, 16, 16, 8),
(1024, 1024, 512, 512, 64, 64),
(128, 128, 64, 64, 64, 64),
]
что я могу сделать, чтобы повысить точность проверки?
мой код train.py:
# load training and test data
with open('./ml_dataset.pickle', 'rb') as my_file:
(train_x, train_y), (test_x, test_y) = pickle.load(my_file)
def create_nn(neurons_architecture, activation, optimizer, loss, dropout):
model = Sequential()
input_shape = train_x.shape[1:]
# add first layer. this layer is added separately because we want to define
# input shape in it
model.add(Dense(neurons_architecture[0],
activation=activation,
input_shape=input_shape))
if dropout is not None:
model.add(Dropout(dropout))
# add the rest of layers
for neurons in neurons_architecture[1:]:
model.add(Dense(neurons, activation=activation))
if dropout is not None:
model.add(Dropout(dropout))
# add the last layer and compile
model.add(Dense(8, activation='softmax'))
model.compile(optimizer=optimizer,
loss=loss,
metrics=['accuracy'])
return model
activation_list = ['relu', 'tanh']
loss_list = ['categorical_crossentropy']
optimizer_list = ['rmsprop', 'adam']
drop_list = [None, 0.25, 0.5]
nn_arc_list = [
(32, 16),
(128, 64),
(256, 64),
(128, 32, 16),
(1024, 256, 64),
(1024, 256, 64, 16),
(1024, 512, 128, 64),
(2048, 1024, 512, 256, 128, 64, 32, 16),
(4096, 1024, 256, 128, 64, 32, 16, 8),
(128, 64, 32, 32, 16, 16, 8),
(1024, 1024, 512, 512, 64, 64),
(128, 128, 64, 64, 64, 64),
]
all_states = product(nn_arc_list, activation_list, loss_list, optimizer_list, drop_list)
for state in all_states:
neuron_arc, activation, loss = state[0], state[1], state[2]
optimizer, dropout = state[3], state[4]
model = create_nn(neuron_arc, activation, optimizer, loss, dropout)
history = model.fit(train_x, train_y, epochs=number_of_epochs,
batch_size=256, validation_split=0.2,
shuffle=True, verbose=False)
# I removed the code the generates file_name to reduce the code size
with open(file_name, 'wb') as my_file:
pickle.dump(history, my_file)