3

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

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

4

1 回答 1

4

鉴于您描述的数据集(完全匹配)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().

于 2012-05-05T20:12:02.340 回答