kNN中的大量平局 – r

编辑:我尝试通过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的距离计算中具有数学意义。

你会遇到大量平局,因为你的数据集中包含许多作为整数编码的分类变量,且可能的值相对较少。你可以用几种方式处理这个问题:

  1. 对分类变量进行对应分析,然后在对应分析返回的值(这些值是连续且正交的)上运行你的kNN。FactoMineR库有一个文档完善的函数MCA,用于多重对应分析。

  2. 将每个因子转换为虚拟变量(如上面的链接所解释的),然后使用更适合稀疏数据的距离度量 – 余弦相似度。不幸的是,你无法从caret中使用余弦相似度运行kNN,但可以根据这个SO线程手动实现。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注