Проектирование нейронной сети, чтобы найти входы с наибольшей вероятностью класса - PullRequest
0 голосов
/ 25 апреля 2019

Я проектирую нейронную сеть для классификации с целью найти входы с наибольшей вероятностью того, что они принадлежат одному из двух классов.

Существует два класса: класс A и класс B.У меня есть набор данных, из которого я хочу найти входы, которые с наибольшей вероятностью принадлежат классу B.

. Это отличается от обычной классификации тем, что меня не интересует правильноемаркировка всех входов.Меня интересует только правильная маркировка входов, которые с высокой вероятностью помечены как принадлежащие к классу B.

Так что точность сети можно рассчитать так:

  • Обучение нейронной сети
  • Подача данных проверки в сеть
  • Сортировка полученных результатов вместе с известными целями по возвращаемой вероятности для класса B
  • Возьмите верхние N выборки, например, верхние 1% (теперь у нас есть выходы с наибольшей вероятностью для класса B)
  • Подсчитайте, сколько из взятых выборок было фактически класса B
  • Точность - это число фактически подсчитанных экземпляров класса B, деленное на количество взятых выборок N

Скажем, у нас есть простая сеть, подобная этой:

        model = keras.Sequential([
            keras.layers.Dense(7,
                               input_dim=len(inputs_training[0]),
                               activation=tf.nn.relu,
                               kernel_regularizer=keras.regularizers.l2(0.0)),
            keras.layers.Dense(7, activation=tf.nn.relu, kernel_regularizer=keras.regularizers.l2(0.000001)),
            keras.layers.Dense(7, activation=tf.nn.relu, kernel_regularizer=keras.regularizers.l2(0.000001)),
            keras.layers.Dense(1, activation=tf.nn.sigmoid, kernel_regularizer=keras.regularizers.l2(0.00000))
        ])
        model.compile(optimizer='adam', loss=binary_crossentropy, metrics=['accuracy'])
        model.fit(
            np.array(inputs_training),
            np.array(targets_training),
            epochs=15,
            verbose=0,
            class_weight={0: 1, 1: 4}
        )

Проблема в том, что чем больше функций (входных данных) я добавляю, тем менее точным становится прогноз - даже если каждая функция работает сама по себе.Например, я могу использовать одну функцию, которая дает мне 40% точности в верхних 1%.Если я добавлю еще две функции, которые выполняют аналогичные функции самостоятельно, точность падает, скажем, до 25-30%.Класс B составляет около 15% данных.

Вторая проблема заключается в том, что точность в верхнем 1% сильно колеблется.

Я пробовал:

  • Изменение количества слоев / нейронов, эпох
  • Изменение весов классов
  • Изменение параметров регуляризации, в том числе с использованием l1
  • Попытка различных функций потерь

Я предполагаю, что ничего из этого не работает, потому что нейронная сеть оптимизирует классификацию всех входных данных, а не оптимизирует для получения максимальной точности в верхнем 1%.

Есть ли способ, какЯ могу перемешать нейронную сеть, чтобы оптимизировать ее так, чтобы наиболее вероятные результаты были правильными, но оставшиеся 99% могут быть неправильно помечены?

Демонстрационный код: https://pastebin.com/CnDpCjdp

...