我正在使用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/