Как повысить точность проверки для определенного набора данных? - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь тренировать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...