Я реализовал многослойную нейронную сеть персептрона в Torch / lua и применил ее к несбалансированному набору данных (33 функции, около 300 элементов, из которых приблизительно 70% отрицательных и 30% положительных элементов).
Я перепробовал несколько моделей и несколько настроек.С текущей моделью я могу получить довольно высокую истинную отрицательную ставку (около 0,7), но довольно низкую истинную положительную ставку (около 0,3). Я действительно хочу улучшить свою истинную положительную ставку, но как?
Я делю набор данных на обучающий набор, набор проверки и набор тестов и использую набор проверки, чтобы найти наибольшее количество скрытых слоев и скрытых единиц.В настоящее время я использую скорость обучения = 0,1 и итераций = 1000. Функция активации - Sigmoid.Я попробовал несколько приемов нейронной сети (импульс, выпадение, инициализация Xavier), но они не привели к каким-либо улучшениям.
В прошлом я работал с другими несбалансированными наборами данных и всегда мог получать хорошие показатели даже наменьший класс.Но не в этот раз ...
Удивительно, что моя нейронная сеть неплохо справляется во время обучения, потому что я вижу среднеквадратическую ошибку, которая очень быстро падает.Так что я ожидаю хороших результатов и на тестовом наборе, но этого не происходит.
Что я могу сделать, чтобы улучшить свой истинный положительный показатель?
Вот моймодель:
perceptron = nn.Sequential()
perceptron:add(nn.Linear(this_input_number, this_hidden_units))
perceptron:add(nn.Sigmoid())
for w=1,this_hidden_layers do
perceptron:add(nn.Linear(this_hidden_units, this_hidden_units))
perceptron:add(nn.Sigmoid())
end
perceptron:add(nn.Linear(this_hidden_units, this_output_number))
А вот, например, ошибка MSE во время обучения второй модели:
$$$ hidden_units = 25 hidden_layers = 1 $$$
completion: 10% (epoch=100)(element=194) loss = 0.04 error progress = 3.56623%
completion: 20% (epoch=200)(element=194) loss = 0.004 error progress = 2.2678%
completion: 30% (epoch=300)(element=194) loss = 0 error progress = 1.56329%
completion: 40% (epoch=400)(element=194) loss = 0.001 error progress = 1.2053%
completion: 50% (epoch=500)(element=194) loss = 0.003 error progress = 0.98677%
completion: 60% (epoch=600)(element=194) loss = 0.004 error progress = 0.84489%
completion: 70% (epoch=700)(element=194) loss = 0 error progress = 0.74345%
completion: 80% (epoch=800)(element=194) loss = 0 error progress = 0.67081%
completion: 90% (epoch=900)(element=194) loss = 0.021 error progress = 0.69629%
completion: 100% (epoch=1000)(element=194) loss = 0.001 error progress = 0.67999%
Как видите, ошибка быстро обнуляется.
Вы можете найти мой полный рабочий код факела здесь , с включенным набором данных.Вы можете протестировать мой код на своем компьютере и попробовать некоторые дополнительные варианты метода.
Есть ли у вас какие-либо предложения о том, как увеличить истинный положительный показатель?Спасибо!