Skip to main content
 首页 » 编程设计

python之垃圾邮件分类任务中奇怪的 FANN 行为

2025年05月04日24Renyi-Fan

我尝试在 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)进行测试,但结果是一样。

可能的问题是什么? 提前谢谢你。

请您参考如下方法:

您是否断言垃圾邮件和普通邮件在您的单词列表中的单词内容方面存在显着差异?我的猜测是,就常规单词的内容而言,垃圾邮件和非垃圾邮件之间可能没有非常明显的区别。

如果您使用的是“真正的”垃圾邮件,许多垃圾邮件制造者会使用称为贝叶斯投毒 的方法,其中包含大量“合法”文本以混淆垃圾邮件过滤器。由于您只是过滤常用词的内容,而不是垃圾邮件/非垃圾邮件在统计上常见的词,因此您的方法将对贝叶斯中毒非常敏感。