2

我正在阅读 R 中的 predict() 并且很困惑:

有一个 Spam 数据集,我们从中使用随机抽样创建了训练数据和测试数据。我们使用了 trainSpam(训练数据集来训练系统)。我们想通过测试数据集(testSpam)来看看模型有多好。

predictionModel = glm(numType ~ charDollar, family = "binomial", data = trainSpam)

predictionTest = predict(predictionModel, testSpam) 
predictedSpam = rep("nonspam", dim(testSpam)[1]) 
predictedSpam[predictionModel$fitted > 0.5] = "spam" #Here is my problem
table(predictedSpam, testSpam$type)

在我们说的那一行:

predictedSpam[predictionModel$fitted > 0.5] = "spam" 

如何predictionModel$fitted预测测试数据中的垃圾邮件。它似乎正在使用从训练数据中拟合的 predictionModel$。然后我们继续与测试数据的垃圾邮件进行比较。有人可以解释吗?

这是我的理解。在行中:

predictionModel = glm(numType ~ charDollar, family = "binomial", data = trainSpam)

我们使用 trainSpam 数据创建模型。

在下一行:

predictionTest = predict(predictionModel, testSpam)

我们使用相同的模型创建预测测试,但使用测试数据。

在下一行:

predictSpam = rep("nonspam", dim(testSpam)[1])

我们创建了一个包含所有值“非垃圾邮件”的向量

在下一行:

预测垃圾邮件[predictionModel$fitted > 0.5] = "垃圾邮件"

我们正在使用 predictionModel$fitted,它已在训练数据上进行拟合,以决定将哪些行分类为垃圾邮件。难道我们不应该使用类似 predictTest 的东西来识别垃圾邮件吗?

我的想法应该是:

> predictionModel = glm(numType ~ charDollar, family = "binomial", data = trainSpam)

> predictionTest = predict(predictionModel, testSpam,type="response")
> predictedSpam = rep("nonspam", dim(testSpam)[1])
> predictedSpam[predictionTest > 0.5] = "spam"
> table(predictedSpam, testSpam$type)
4

1 回答 1

1

我认为您希望type="response"predict通话中,因为默认值否则将是线性预测器。

?predict.glm    # different than ?predict

(当然,如果我正确地直觉你未说明的目标是在你的测试集中找到概率大于 0.5 的案例。此外,如果你真的根据训练数据获得预测,这意味着你的测试数据框格式不正确,并且您需要编辑您的问题以包含两者的输出str(trainSpam)str(testSpam)因此我们可以向您展示如何正确创建data参数predict。)

更新后:所以它看起来charDollar在测试和训练集中,所以你不应该predictionTest从训练集中得到预测。您应该得到预测 > 50% 的垃圾邮件案例: testSpam[ predict(fit, data=testSpam, type="response) > .5 ]

我不确定使用了什么代码来创建predictionTest,并且想知道您是否打算键入predictedSpam. 这是我认为会成功的:

predictedSpam = predict(predictionModel, testSpam) 
spam <- predictedSpam[ predictedSpam$fitted > 0.5 ] 
于 2013-04-18T18:38:26.147 回答