Я пытался написать простой классификатор спама с помощью библиотеки FANN.Для этого я собрал количество писем со спамом и ветчиной и собрал словарь наиболее употребляемых английских слов.Я создал нейронную сеть с одним скрытым слоем со следующим кодом:
num_input = get_input_size(dictionary_size)
num_output = 1
ann.create_standard_array((num_input, num_neurons_hidden, num_output))
ann.set_activation_function_hidden(libfann.SIGMOID_SYMMETRIC)
ann.set_activation_function_output(libfann.SIGMOID_SYMMETRIC)
ann.set_training_algorithm(libfann.TRAIN_INCREMENTAL)
Вывод равен 1, когда буква является ветчиной, и -1, когда она является спамом.Каждый из входных нейронов представляет, было ли конкретное слово в электронном письме или нет (1 - слово было в почтовом сообщении. 0 - не было)
Для обучения нейронной сети я использую следующий код.(Для каждого письма электронной почты в обучающем наборе)
# Create input from train e-mail letter
input = get_input(train_res, train_file, dictionary)
ann.train(input, (train_res,))
Чтобы проверить, является ли электронная почта из тестового набора спамом или нет, я использую следующий код: (Для каждого письма внабор тестов)
input = get_input(SPAM, test_spam, dictionary)
res = ann.run(input)[0]
Но независимо от того, какой размер словаря я использую (я пробовал от 1000 слов до 40000 слов) или количество нейронов в скрытом слое (от 20 до 640) после обучения моей сетиэто предполагает, что почти все электронные письма являются спамом или ветчиной.Например, я получаю либо такие результаты:
Dictionary size: 10000
Hidden layer size: 80
Correctly classified hams: 596
Incorrectly classified hams: 3845
Correctly classified spams: 436
Incorrectly classified spams: 62
, где почти все спам классифицированы правильно, но все радиолюбители ошибочно классифицированы, либо такие результаты:
Dictionary size: 20000
Hidden layer size: 20
Correctly classified hams: 4124
Incorrectly classified hams: 397
Correctly classified spams: 116
Incorrectly classified spams: 385
, которые являются опозентнымиЯ пытался использовать больше тренировочных данных.Я начал с примерно 1000 электронных писем в обучающем наборе (соотношение спама и ветчины составляет почти 50:50), а сейчас я тестирую его примерно с 4000 электронными письмами (спам: ветчина примерно 50:50), но результатТо же самое.
В чем проблема?Заранее спасибо.