我试图在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]
但无论我使用的字典大小(我试过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)对其进行测试,但结果是相同。
可能出现的问题是什么? 提前谢谢。
答案 0 :(得分:1)
您是否断言垃圾邮件和火腿邮件之间在单词列表中的单词内容存在重大差异?我的猜测是,当谈到常规词的内容时,垃圾邮件和火腿之间可能没有非常明显的区别。
如果您使用“真正的”垃圾邮件,许多spamers使用称为贝叶斯中毒的内容,其中包含大量“合法”文本,以便混淆垃圾邮件过滤器。由于您只是过滤常用词的内容而不是垃圾/火腿统计上常见的词,因此您的方法对贝叶斯中毒非常敏感。
答案 1 :(得分:0)
我对FANN了解不多,但对于垃圾邮件分类,培训方案很重要。首先:不训练所有火腿邮件,然后是所有垃圾邮件。将它们混合在一起,最好随机挑选邮件,然后训练它,无论是火腿还是垃圾邮件。
除此之外,还有很多不同的方法可以决定是否应该根据特定的消息对分类器进行训练。例如,如果分类器已经认为某条消息是垃圾邮件,然后您将其作为垃圾邮件进行培训,则可能会对该邮件中的字词产生无根据的偏见。
可能的训练方案包括(但不限于):
TEFT(培训一切)
训练一切。通常不是一个好的选择。
TOE(错误训练)
仅在邮件上训练分类器出错。
TTR(厚阈值训练)
训练分类器出错的所有邮件,或者说是“厚门槛”。例如,如果低于0.0的所有内容都是垃圾邮件,请在所有分类为-0.05和0.05之间的电子邮件上进行培训。
TUNE(训练到没有错误)
反复进行TOE或TTR,直到分类器正确分类所有训练邮件。这可能有所帮助,但也会受到影响,具体取决于您的训练数据。
每种方法都有不同的变化,但厚度阈值训练通常会产生良好的效果:因为它不会训练每个邮件,所以对垃圾邮件中出现的单词不会产生偏见,但是真的有助于火腿/垃圾邮件决定(例如Niclas提到的贝叶斯中毒)。而且由于它在边缘情况下训练,即使它在训练中正确分类,它也会获得更多关于此类边界情况的经验,并且在实际使用中不太可能被它们所愚弄。
作为最后一句话:我假设您正在使用神经网络来了解有关它们的更多信息,但如果您确实需要过滤垃圾邮件,Naive Bayes或Winnow algorithm通常更合适。< / p>