Странное поведение FANN в задаче классификации спама - PullRequest
2 голосов
/ 25 января 2012

Я пытался написать простой классификатор спама с помощью библиотеки 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), но результатТо же самое.

В чем проблема?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 26 января 2012

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

Если вы используете «настоящие» спам-письма, многие спамеры используют что-то, известное как Байесовское отравление , где они содержат много «законного» текста, чтобы сбить с толку фильтры спама. Поскольку вы просто фильтруете содержание обычного слова, а не слова, статистически общие для спама / ветчины, ваш подход будет очень чувствителен к отравлению байесовским эффектом.

0 голосов
/ 26 января 2012

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

Кроме этого, существует довольно много разных способов решить, следует ли обучать классификатор конкретномусообщение на всех.Например, если классификатор уже считает, что сообщение является спамом, а затем вы обучаете его как спам, у него могут возникнуть необоснованные предубеждения против слов в этом сообщении.

Возможные схемы обучения включают (но не ограничиваются):

  • TEFT (Тренируйте все)

    Тренируйте все один раз.Обычно это не лучший выбор.

  • TOE (Train on Error)

    Train только по почте, классификатор ошибается.

  • TTR (обучение с толстым порогом)

    Обучать все письма, которые классификатор получает неправильно, или которые лежат на «толстом пороге».Например, если все, что ниже 0.0, является спамом, обучайтесь на всех электронных письмах, классифицированных в диапазоне от -0.05 до 0.05.

  • TUNE (тренировка без ошибок)

    Do TOE илиTTR несколько раз, пока классификатор правильно не классифицирует все обучающие письма.Это может помочь, но также может повредить, в зависимости от ваших тренировочных данных.

Существуют различия по каждому из них, но обучение с толстым порогом обычно дает хорошие результаты: потому что это не тактренируйте каждую почту, это менее предвзято относится к словам, которые появляются в спаме, но это не очень помогает при принятии решения о спаме (например, упомянутое байесовским отравлением, которое упомянул Никлас).И поскольку он обучается в пограничных случаях, даже если он правильно классифицировал их во время тренировочного заезда, он получает больше опыта в таких пограничных случаях и с меньшей вероятностью будет одурачен ими при фактическом использовании.

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

...