在数据集上应用后解释 knn.cv (R) 结果



我在对 R 中的数据集使用 k 最近邻算法(交叉验证(时遇到了问题,R 是 FNN 包中的knn.cv。该数据集由 4601 个电子邮件案例组成,具有 58 个属性,其中 57 个取决于emails(numerical, range [0,100])中的字符或单词频率,最后一个指示它是垃圾邮件(值 1(还是火腿(值 0(。

在指示 train 和 cl 变量并使用 10 个邻居之后,运行包会显示所有电子邮件的列表,每列的值为 7.4032,我不知道如何使用。我需要找到包裹分类的垃圾邮件和火腿的百分比,并将其与正确的百分比进行比较。我应该如何解释这些结果?

鉴于您描述的数据集(完全(与同名著名书籍随附的 ElemStatLearn 包中的垃圾邮件数据集匹配,我想知道这是否实际上是家庭作业。如果是这种情况,没关系,但您应该在问题中添加家庭作业标签。

这里有一些提示。

函数 knn.cv 的文档说它返回分类向量,以及 k 个最近邻的距离和索引作为"属性"。所以当我运行这个时:

out <- knn.cv(spam[,-58],spam[,58],k = 10)

对象out如下所示:

> head(out)
[1] spam  spam  spam  spam  spam  email
Levels: email spam

您引用的其他值作为属性有点"隐藏",但您可以看到它们使用 str 存在:

> str(out)
 Factor w/ 2 levels "email","spam": 2 2 2 2 2 1 1 1 2 2 ...
 - attr(*, "nn.index")= int [1:4601, 1:10] 446 1449 500 5 4 4338 2550 4383 1470 53 ...
 - attr(*, "nn.dist")= num [1:4601, 1:10] 8.10e-01 2.89 1.50e+02 2.83e-03 2.83e-03 ...

您可以通过如下方式访问这些附加属性:

nn.index <- attr(out,'nn.index')
nn.dist <- attr(out,'nn.dist')

请注意,这两个对象最终都是维度为 4601 x 10 的矩阵,这是有道理的,因为文档说它们记录了k = 10最近邻居的索引(即行号(以及到每个的距离。

最后一点,您可能会发现table()功能很有用,以及 prop.table() .

最新更新