编辑:我尝试通过kNN
(caret包)分类器在r中对数据集进行建模,但运行时间非常长。我最终不得不停止它。有时当我停止它时,它会显示“使用warnings()查看所有警告消息”。当我这样做时,它会显示数据集中每列都有“大量平局”。我在这里找到了几个解决方案,但在我的情况下都没有奏效。他们说“在数据集中加入一些伪随机噪声数据,它就会工作”。我尝试过,但没有效果:
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")
这些都不起作用。
顺便说一下,除了kNN
之外,使用svmLinear
也不起作用。
还有一个重要说明:我对所有列应用了unique()
函数,我注意到没有一列只有一个值。它们都有变化。
最后,这是我项目报告中关于数据集信息的部分,可能会有用:
在Reuters-21578数据集中,我们使用了前十个类别;训练集有7269个样本,测试集有2686个样本。类别的分布是不平衡的。最大类别有2899个文档,占训练集的39.88%。最小类别有113个文档,占训练集的1.55%。表I显示了十个最常见的类别以及每个类别在训练集和测试集中的样本数量。
回答:
为什么kNN和SVM在这个数据集上运行缓慢
k-最近邻(kNN)和支持向量机(SVM,你在问题中后续提到的)随着样本数量(n)的增加,复杂度显著增加。广义上,你可以认为这是以大O表示法中的二次O(n^2)增长率来衡量的,尽管实际情况比这更复杂。
就kNN而言,原因很容易理解:它需要构建一个训练-n x 测试-n的距离矩阵。这意味着,在一个包含1,415个样本的数据集上运行kNN或SVM,可能会花费比在1,000个样本的数据集上运行相同操作的两倍时间,因为时间是训练-n x 测试-n的函数。
因此,这些算法能够在内存中处理的数据集大小有一个上限,这个上限远低于例如逻辑回归或梯度提升机的上限。
提高速度
将数据分成组将带来二次性能提升。例如,随机将n=2000的数据集分成2个n=1000的数据集,将带来4倍的性能提升。
处理平局
更重要的是,看起来你正在尝试对分类输入数据进行模型训练。kNN设计用于处理数值输入数据。分类变量必须转换为虚拟变量。你没有收到错误消息,因为分类变量被存储为数值代码,但这并不意味着这些数字在kNN的距离计算中具有数学意义。
你会遇到大量平局,因为你的数据集中包含许多作为整数编码的分类变量,且可能的值相对较少。你可以用几种方式处理这个问题: