我试着在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)当字母为ham时,输出为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]但是,无论我使用什么大小的字典(我尝试了从1,000个单词到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)进行测试,但结果是一样的。
可能的问题是什么?提前谢谢你。
发布于 2012-01-26 21:57:31
您是否断言垃圾邮件和垃圾邮件在词表中的单词内容方面存在显著的差异?我的猜测是,当涉及到常规单词的内容时,垃圾邮件和火腿之间可能没有非常明显的区别。
如果您使用的是“真正的”垃圾邮件,许多垃圾邮件发送者会使用一种称为“贝叶斯中毒”的东西,其中包含大量的“合法”文本,以混淆垃圾邮件过滤器。由于您只是过滤普通单词的内容,而不是垃圾邮件/火腿统计上常见的单词,因此您的方法将对贝叶斯中毒非常敏感。
发布于 2012-01-26 22:32:50
我对FANN了解不多,但对于垃圾邮件分类来说,训练方案很重要。首先:不会训练所有的垃圾邮件,然后训练所有的垃圾邮件。将它们混合在一起,最好是随机挑选一封邮件,然后对其进行训练,无论它是火腿还是垃圾邮件。
除此之外,还有很多不同的方法来决定分类器是否应该针对特定的消息进行训练。例如,如果分类器已经认为一条消息是垃圾邮件,然后您将其训练为垃圾邮件,它可能会对该消息中的单词产生不必要的偏见。
可能的训练方案包括(但不限于):
每样东西都训练一次。通常不是一个好的选择。
只对邮件进行训练分类器会出错。
训练分类器出错的所有邮件,或者设置在“厚阈值”上的邮件。例如,如果所有低于0.0的邮件都是垃圾邮件,则对分类为-0.05到0.05之间的所有电子邮件进行训练。
重复执行TOE或TTR,直到分类器正确分类所有训练邮件。这可能会有所帮助,但也可能会带来伤害,具体取决于您的训练数据。
每种方法都有不同之处,但高阈值训练通常会产生良好的结果:因为它不会训练每封邮件,所以它对垃圾邮件中出现的单词的偏见较小,但这并不能真正帮助做出火腿/垃圾邮件的决定(例如Niclas提到的贝叶斯中毒)。由于它在边缘案例上进行训练,即使它在训练运行中对它们进行了正确的分类,它也获得了更多关于此类边缘案例的经验,并且在实际使用中不太可能被它们愚弄。
最后一句话:我假设你正在使用神经网络来了解更多关于它们的知识,但如果你真的需要过滤垃圾邮件,Naive Bayes或Winnow algorithm通常更合适。
https://stackoverflow.com/questions/9009112
复制相似问题