kNN - r 中有很多关系

lots of ties in kNN - r

编辑: 我正在尝试通过 r 中的 kNN(插入符包)分类器对数据集进行建模,但它运行了很长时间。最终我停止了它。有时当我停止它时,它会显示 "use warnings() to see all warning messages"。当我这样做时,它会为数据集中的每一列显示 "lots of ties"。我在这里找到了一些针对此问题的解决方案,但其中 none 适合我的情况。他们说 "put some pseudo-random noise data into data set, and it will work"。我试过了,没用:

https://stats.stackexchange.com/questions/25926/dealing-with-lots-of-ties-in-knn-model

结束编辑。

这就是为什么我将我的训练数据集 link 提供给你们的原因,所以也许你们中的一个人可以理解为什么 kNN 在建模时卡住了:

http://www.htmldersleri.org/train.csv(众所周知的Reuters-21578数据集)

这里是 kNN r 行:

knn<-train(as.factor(class)~.,data=as.matrix(train),method="kNN")

knn<-train(as.factor(class)~.,data=train,method="kNN")

none 个正在工作。

顺便说一下,使用 svmLinear 而不是 kNN 也不起作用。

还有一条重要提示:我在所有列上应用了 unique() 函数,我注意到没有任何列只有一个值。他们都是不同的。

最后,这是我的项目报告中的数据集信息部分,可能会有用:

In Reuters-21578 dataset, we used top ten classes; 7269 samples in training set and 2686 samples in test set. The distribution of the classes is unbalanced. The maximum class has 2899 documents, occupying 39,88% of training set. The minimum class has 113 documents, occupying 1,55% of training set. Table I shows the ten most frequent categories along with the number of training and test set examples in each.

为什么 kNN 和 SVM 在这个数据集上很慢

k-最近邻 (kNN) 和支持向量机(SVM,您稍后在问题中提到)的复杂性随着样本量的增加而显着增加(n) 增加。从广义上讲,您可以将其视为 Big O notation 中的二次 O(n^2) 增长率,尽管事实比这更微妙。

在kNN的情况下,原因很容易理解:它需要train-n x test-n距离要构造的矩阵。这意味着 kNN 或 SVM 在 1,415 个示例的数据集上可能需要 两倍 只要在 1,000 个示例的数据集上进行相同的操作,因为时间是 train- 的函数n x 测试-n.

因此,这些算法可以在内存中处理的数据集大小存在上限,这大大低于逻辑回归或梯度提升机器的限制。

提高速度

将数据分成几组将使您的性能得到二次方提升。例如,将一个 n=2000 的数据集随机拆分为 2 个 n=1000 的数据集,会给你带来 4 倍的性能提升。

处理关系

不过,更重要的是,您似乎正试图在分类输入数据上训练模型。 kNN 旨在处理数字输入数据。分类变量必须是 recoded as dummy variables。您没有收到错误消息,因为分类变量存储为数字代码,但这并不意味着这些数字在数学上对 kNN 的距离计算有意义。

你得到很多联系,因为你的数据集包含许多编码为整数的分类变量,可能的值相对较少。您可以通过几种方式处理此问题:

  1. 运行 对分类变量的对应分析,然后 运行 你的 kNN 对对应分析返回的值(连续且正交)。 FactoMineR 库有一个记录良好的函数 MCA 用于多重对应分析。

  2. 将每个因子转换为虚拟变量(如上文 link 中所述),然后使用更适合稀疏数据的距离度量 - cosine similarity. Unfortunately, you cannot run kNN with cosine similarity from caret, but it is possible to implement manually, as explained in this SO thread.