了解SciKit中贝叶斯过滤器的工作原理并提高准确性

我正在使用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%。不过,我觉得这不是正确的做法,关键是不应该在训练数据中使用结果,对吗?

我的问题是为什么。能有人解释我观察到的这两个现象的原因吗?以及它们是否“正确”,即在数据集中包含布尔结果是否作弊,或者使用非常小的测试大小是否作弊?


回答:

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

你所做的基本上是试图构建一个模型,该模型应该从它所属的一组变量中预测一个变量。模型会很容易发现它们是相同的。更麻烦的是,如果你把自己放在一个新邮件到来的情况下,你没有那个布尔结果来尝试预测它是否是垃圾邮件,你的模型将变得毫无用处。

关于你的另一个观点,是的,减少测试集大小是不相关的。它在统计上不那么相关。然而,你可以进行留一法交叉验证,看看是否实际上是你的模型需要更多数据,但我对此表示怀疑。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注