我正在使用SciKit构建一个简单的垃圾邮件过滤器,但我对结果有点不确定。我有一个包含约5000行数据的数据集,最后一列是一个布尔值,用于指定电子邮件是垃圾邮件还是正常邮件,其他列包含如连续大写字母序列的平均长度等数据。
在我的代码中,我有以下内容:
X = dataset[:,:57] # 前57列,不包括答案列Y = dataset[:,-1] # 最后一列包含垃圾邮件/正常邮件的布尔值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%。不过,我觉得这不是正确的做法,关键是不应该在训练数据中使用结果,对吗?
我的问题是为什么。能有人解释我观察到的这两个现象的原因吗?以及它们是否“正确”,即在数据集中包含布尔结果是否作弊,或者使用非常小的测试大小是否作弊?
回答:
简短回答:是的,包含布尔结果是“作弊”。
你所做的基本上是试图构建一个模型,该模型应该从它所属的一组变量中预测一个变量。模型会很容易发现它们是相同的。更麻烦的是,如果你把自己放在一个新邮件到来的情况下,你没有那个布尔结果来尝试预测它是否是垃圾邮件,你的模型将变得毫无用处。
关于你的另一个观点,是的,减少测试集大小是不相关的。它在统计上不那么相关。然而,你可以进行留一法交叉验证,看看是否实际上是你的模型需要更多数据,但我对此表示怀疑。