使用 knn 预测 class 的插入符:我是否需要为未知 classes 提供随机 class 变量?

Caret to predict class with knn: Do I need to provide unknown classes with a random class variable?

我有一个包含 70 行数据和 34 列特征的制表符分隔文件,其中前 60 行如下所示:

groups x1    x2     x3    x4   x5 (etc, up to x34)
0    0.1    0.5    0.5   0.4  0.2
1    0.2    0.3    0.8   0.4  0.1
0    0.4    0.7    0.6   0.2  0.1
1    0.4    0.4    0.7   0.1  0.4

最后 10 行如下所示:

groups x1    x2     x3    x4   x5
NA    0.2    0.1    0.5   0.4  0.2
NA    0.2    0.1    0.8   0.4  0.1
NA    0.2    0.2    0.6   0.2  0.1
NA    0.2    0.3    0.7   0.1  0.4

这些组是二进制的(即每一行属于组 0 或组 1)。目的是使用前 60 行作为我的训练数据集,最后 10 行作为我的测试数据集;将最后 10 行 class 化为组 0 或 1。最后 10 行的 class 当前标记为 "NA"(因为它们尚未分配给 class).

我运行这个代码:

library(caret)
data <-read.table("data_challenge_test.tab",header=TRUE)
set.seed(3303)
train <-sample(1:60)
data.train <-data[train,]
dim(data.train)
data.test <-data[-train,]
dim(data.test)
data.train[["groups"]] = factor(data.train[["groups"]])
trctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
knn_fit <- train(groups ~x1+x2+x3+x4+x5, data = data.train, method = "knn",trControl=trctrl,preProcess = c("center", "scale"),tuneLength = 10)
test_pred <- predict(knn_fit, newdata = data.test)
confusionMatrix(test_pred, data.test$groups)

test_pred 输出是:

> test_pred
 [1] 0 0 0 0 1 1 0 1 1 0
Levels: 0 1

混淆矩阵输出为:

> confusionMatrix(test_pred, data.test$groups)
Error in confusionMatrix.default(test_pred, data.test$groups) : 
  the data cannot have more levels than the reference

然后我检查了 test_pred 和 data.test$groups:

的 str
> str(test_pred)
 Factor w/ 2 levels "0","1": 1 1 1 1 2 2 1 2 2 1
> str(data.test$groups)
 int [1:10] NA NA NA NA NA NA NA NA NA NA

所以我明白我的错误是因为我对混淆矩阵的两个输入不是同一类型。

然后在我的数据集中,我将 "NA" 列更改为 运行domly 0 或 1(即我只是手动 运行domly 更改了前 5 个未知 classes 到 class 0 然后第二个 5 未知 classes 到 class 1).

那我重新运行上面的代码

输出是:

> test_pred
 [1] 0 0 0 0 1 1 0 1 1 0
Levels: 0 1
> confusionMatrix(test_pred, data.test$groups)
Confusion Matrix and Statistics

          Reference
Prediction 0 1
         0 4 2
         1 1 3

               Accuracy : 0.7             
                 95% CI : (0.3475, 0.9333)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : 0.1719          

                  Kappa : 0.4             
 Mcnemar's Test P-Value : 1.0000          

            Sensitivity : 0.8000          
            Specificity : 0.6000          
         Pos Pred Value : 0.6667          
         Neg Pred Value : 0.7500          
             Prevalence : 0.5000          
         Detection Rate : 0.4000          
   Detection Prevalence : 0.6000          
      Balanced Accuracy : 0.7000          

       'Positive' Class : 0  

所以我有三个问题:

  1. 本来我所有的训练数据集的class都是0或者1,我的测试数据集的class都被标记为NA或者?。

由于上述错误,caret 似乎不喜欢这样。当我分配我的测试数据集 运行dom 起始二进制变量而不是 NA/? 时,分析 "worked"(没有错误)。

我手动 运行domly 分配给测试数据集的二元组是否会影响混淆矩阵(或分析的任何方面?),或者这是 acceptable?如果不是,解决方案是什么:我在分析开始时将未class化的测试数据分配给哪个组。

  1. test_pred输出是否有序?我希望预测 table 的最后 10 行,test_pred 的输出是:0 0 0 0 1 1 0 1 1 0。最后 10 行是否按顺序排列?

  2. 我想在解决此问题后可视化结果。谁能推荐一个通常用来做这个的标准包(我是机器学习的新手)?

编辑:鉴于混淆矩阵直接使用参考和预测来计算准确性,我很确定我不能只是 运行domly 将 classes 分配给未知 classed 行,因为它会影响混淆矩阵的准确性。因此,将不胜感激替代建议。

  1. 混淆矩阵是您的分类输出与实际 类 的比较。因此,如果您的测试数据集没有标签,则无法绘制混淆矩阵。 还有其他方法可以检查您的分类算法的效果。您现在可以阅读 AIC,它类似于线性回归 R 平方。 如果您仍然想要混淆矩阵,请使用前 50 行进行训练,使用 50-60 行进行测试。此输出将使您创建一个混淆矩阵。
  2. 是的,输出是有序的,您可以将其列绑定到您的测试集。
  3. 可视化分类任务是通过绘制 ROC 曲线来完成的。 CARET 库应该也有。