R - KNN 中的错误 - 测试和训练不同

数据挖掘 机器学习 数据挖掘 r 分类
2022-03-05 16:11:23

我正在尝试使用 KNN 算法对一组文本文件进行分类,无论它属于 A 类还是 B 类

这是我得到的错误

> knn.pred <- knn(tdm.stack.nl, tdm.stack.nl_test, tdm.cand)  

knn 中的错误(tdm.stack.nl,tdm.stack.nl_test,tdm.cand):“测试”和“火车”的暗淡不同

 > dim(tdm.stack.nl)  
    [1]  184 1599  
    > dim(tdm.stack.nl_test)  
    [1]   1 992  

很明显,训练数据集使用的单词数量与训练不同。我怎样才能避免这种情况?

我想提一下,当我将训练和测试数据集手动划分为(70:30)比率时,我得到了这个错误。但是,如果我使用采样方法划分训练和测试数据集,我不会收到此错误。

> # create hold-out   
> set.seed(500)  
> train.idx <- sample(nrow(tdm.stack), ceiling(nrow(tdm.stack) * 0.7))   
> test.idx <- (1:nrow(tdm.stack))[-train.idx]   
> 
> # create model - knn clustering
> tdm.cand <- tdm.stack[, "targetcandidate"]
> tdm.stack.nl <- tdm.stack[, !colnames(tdm.stack) %in% "targetcandidate"]
> 
> # set up model
> knn.pred <- knn(tdm.stack.nl[train.idx,], tdm.stack.nl[test.idx,],    tdm.cand[train.idx])  
> dim(tdm.stack.nl[train.idx,])  
[1]  129 1599  
> dim(tdm.stack.nl[test.idx,])  
[1]   55 1599   

但是这种方法对我不起作用,因为我想使用之前构建的模型对文档进行实时分类。

请帮忙。如果您需要任何其他信息,请告诉我。阿伦

2个回答

您纯粹是偶然地避免了抽样的错误(这些词很常见)。最简单的方法是合并训练和测试,在连接集上构建一个 tdm,再次分成训练和测试,然后清除一些列(训练集中的常量,因为它们对应于仅在测试中出现的单词 => 无用为了训练)。

在 cl 中添加“Drop”。它会起作用的。

示例:cl = train_labels[,1, drop = TRUE] knn(train_points, test_points, cl, k = 5)