我正在使用SciKit构建一个简单的垃圾邮件过滤器,但是我对结果不确定。我有一个约有5000行数据的数据集,其最后一列是一个布尔值,它指定电子邮件是垃圾邮件还是火腿,其他列指定数据,例如不间断的大写字母序列的平均长度。

在我的代码中,我有以下内容:

X = dataset[:,:57] # the first 57 col, excluding the answer col
Y = dataset[:,-1]  # the final row with the boolean spam/ham value
xTrain, xTest, yTrain, yTest = train_test_split(X, Y)
bNB = BernoulliNB(binarize = True)
bNB.fit(xTrain, yTrain)
yPred = bNB.predict(xTest)
score =  accuracy_score(yExpect, yPred)
print("result: ", score)


然后,我将这些列剪掉,以使X是前57列,Y是最后一封具有垃圾邮件/火腿值的列。

然后,在此X,Y上运行train_test_split,以生成xTrain xTest和yTrain yTest值。

我的准确度很低,如何提高准确度?我做了两个观察:

如果我将test_sample的大小减小(teast_train_split默认为0.25,即数据集的25%)为0.01,则精度会提高到99%甚至100%。

当我添加包含垃圾邮件/火腿布尔值的最后一行时,准确性提高到99%或100%。虽然我觉得这不是您应该做的方式,并且重点是不使用训练数据中的结果?

我的问题是为什么。有人可以向我解释为什么我所做的这两个观察会发生吗?以及它们是否“正确”,即是否欺骗将布尔结果包含在数据集中,或者是否欺骗了很小的测试量?

最佳答案

简短的回答:是的,包括布尔结果是“作弊”。

基本上,您正在尝试构建一个模型,该模型应该根据其所属的一组变量预测一个变量。该模型将很容易理解它们相同的事实。
更有问题的是,如果您将自己置于收到新电子邮件的情况下,则没有布尔值结果来尝试预测它是否是垃圾邮件,那么您的模型将变得无用。

另一方面,是的,减小测试集的大小并不重要。它在统计上不太相关。但是,您可以执行leave one out cross validation并查看是否实际上是您的模型需要更多数据的问题,但我对此表示怀疑。

关于python - 了解贝叶斯过滤如何在SciKit中工作并提高准确性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55994690/

10-12 23:08