Я проектирую нейронную сеть для классификации с целью найти входы с наибольшей вероятностью того, что они принадлежат одному из двух классов.
Существует два класса: класс 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