kNN - r 中有很多联系
Posted
技术标签:
【中文标题】kNN - r 中有很多联系【英文标题】:lots of ties in kNN - r 【发布时间】:2016-09-01 13:37:04 【问题描述】:编辑:
我正在尝试通过 r 中的kNN
(插入符号包)分类器对数据集进行建模,但它运行了很长时间。最终我要阻止它。有时当我停止它时,它会说“使用警告()查看所有警告消息”。当我这样做时,它会为数据集中的每一列显示“很多关系”。我在这里找到了一些解决这个问题的方法,但在我的情况下没有一个是有效的。他们说“将一些伪随机噪声数据放入数据集中,它会起作用”。我试过了,还是不行:
https://stats.stackexchange.com/questions/25926/dealing-with-lots-of-ties-in-knn-model
结束编辑。
这就是为什么我将我的火车数据集的链接提供给你们,所以也许你们中的一个人可以理解为什么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")
它们都不起作用。
顺便说一句,用svmLinear
代替kNN
也不起作用。
还有一个重要说明:我在所有列上应用了unique()
函数,我注意到没有任何列只有一个值。它们都是多种多样的。
最后,这是我的项目报告中的数据集信息部分,可能有用:
在 Reuters-21578 数据集中,我们使用了前十类; 7269 个样本 训练集和测试集中的 2686 个样本。的分布 班级不平衡。最大类有2899个文档,占 39,88% 的训练集。最小类有113个文档,占 训练集的 1.55%。表 I 显示了十个最常见的类别 以及每个中的训练和测试集示例的数量。
【问题讨论】:
does not work
- 什么不起作用?您收到错误消息还是运行了很长时间?
@Tgsmith61591 实际上是的。它运行了很长时间。
@jogo 我编辑了我的问题。请再检查一遍好吗?
插入符号可以处理领带...不是那样的。像这样的聚类技术是计算密集型的。运行多长时间?
【参考方案1】:
为什么 kNN 和 SVM 在这个数据集上很慢
k-最近邻 (kNN) 和支持向量机 (SVM,您稍后会在问题中提到) 的复杂性随着样本大小 (n ) 增加。从广义上讲,您可以将其视为Big O notation 中的二次 O(n^2) 增长率,尽管事实比这更微妙。
在kNN的情况下,原因很容易理解:它需要构造一个train-n x test-n距离矩阵。这意味着在包含 1,415 个示例的数据集上执行 kNN 或 SVM 的时间可能是在包含 1,000 个示例的数据集上执行相同操作所需的两倍,因为时间是训练的函数- n x 测试-n.
因此,这些算法可以在内存中处理的数据集大小有一个上限,该上限远低于逻辑回归或梯度提升机器的上限。
提高速度
将您的数据分组将给您带来二次性能提升。例如,将一个 n=2000 的数据集随机拆分为 2 个 n=1000 的数据集,性能会提高 4 倍。
处理关系
不过,更重要的是,您似乎正在尝试根据分类输入数据训练您的模型。 kNN 旨在处理数字输入数据。分类变量必须是recoded as dummy variables。您没有收到错误消息,因为分类变量存储为数字代码,但这并不意味着这些数字对于 kNN 的距离计算具有数学意义。
您获得了很多联系,因为您的数据集包含许多编码为整数的分类变量,可能的值相对较少。您可以通过以下几种方式处理此问题:
对分类变量运行对应分析,然后对对应分析返回的值(连续且正交)运行 kNN。 FactoMineR
库有一个有据可查的函数 MCA
用于多重对应分析。
将每个因子转换为虚拟变量(如上面的链接中所述),然后使用更适合稀疏数据的距离度量 - cosine similarity。不幸的是,您无法从 caret
运行具有余弦相似度的 kNN,但可以手动实现,如 this SO thread 中所述。
【讨论】:
以上是关于kNN - r 中有很多联系的主要内容,如果未能解决你的问题,请参考以下文章