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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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